728x90
๋ฐ์ํ
5.1 ํ๋ฅ ๊ณผ ์ธ์ด ๋ชจ๋ธ
1. ์ธ์ด๋ชจ๋ธ
- ๋จ์ด ๋์ด์ ํ๋ฅ ์ ๋ถ์ฌ
- ํน์ ํ ๋จ์ด์ ์ํ์ค์ ๋ํด ๊ทธ ์ํ์ค๊ฐ ์ผ์ด๋ ๊ฐ๋ฅ์ฑ์ด ์ด๋ ์ ๋์ธ๊ฐ(์ผ๋ง๋ ์์ฐ์ค๋ฌ์ด ๋จ์ด ์์์ธ์ง)๋ฅผ ํ๋ฅ ๋ก ํ๊ฐํ๋ ๊ฒ.ex) you say goodbye ⇒ 0.092 but, you say good die ⇒ 0.0000000032
- ์ฌ์ฉ ์์: ๊ธฐ๊ณ ๋ฒ์ญ ๋ฐ ์์ฑ ์ธ์์ ์ฃผ๋ก ์ฌ์ฉ, ์๋ก์ด ๋ฌธ์ฅ ์์ฑ ์ฉ๋
- CBOW์ ๋ฌ๋ฆฌ ์ผ์ชฝ ์๋์ฐ๋ง ๋งฅ๋ฝ์ผ๋ก ๊ณ ๋ คํจ.
- ์ฆ, ์ธ์ด๋ชจ๋ธ์ ๋ณ๊ฒฝ๋ ์์์ฒ๋ผ t-2๋ฒ์งธ ๋จ์ด, t-1๋ฒ์งธ ๋จ์ด๊ฐ ๋ฐ์ํ์ ๋, ๋ค์ ์์๋ก ๋์ฌ ๋จ์ด์ธ t๋ฒ์งธ ๋จ์ด๊ฐ ๋ฌด์์ผ๋ก ๋์ฌ์ง ์์ธกํ๋ ๋ชจ๋ธ์ ์๋ฏธ.
- ๋ค์ ์์์ ๋์ฌ ๋จ์ด์ ์์ฐ์ค๋ฌ์์ ํ๋์ ํ๋ฅ ์งํ๊ฐ์ผ๋ก ์์ธก.

- ๋์ ํ๋ฅ ์ด๋: m๊ฐ์ ๋จ์ด๊ฐ ์๋ค๊ณ ๊ฐ์ ํ ๋, ๋จ์ด๊ฐ m ์์๋ก ๋ฐ์ํ ํ๋ฅ ์ P(w1,w2,,,,wm)์ผ๋ก ์ ์ํ ๊ฒ

- ์ฌํ ํ๋ฅ ์ ์ด ๊ณฑ = ๋์ ํ๋ฅ (ํน์ ์ฌ๊ฑด ๋ฐ์ ํ์ ๋ค๋ฅธ ์ฌ๊ฑด์ด ๋ฐ์ํ ํ๋ฅ ⇒ ์ฌํํ๋ฅ )

- P(wt| w1,w2,,,,,,wt-1) ์ ์กฐ๊ฑด๋ถ ์ธ์ด ๋ชจ๋ธ์ด๋ผ๊ณ ํจ.
- ์ง์ 2๊ฐ์๋ง ์์กดํ๋ค๊ณ ํ๋ฉด 2์ธต ๋ง๋ฅด์ฝํ ์ฒด์ธ์ด๋ผ๊ณ ํจ( ์ง์ N๊ฐ์๋ง ์์กดํ๋ค๊ณ ํ๋ฉด N์ธต ๋ง๋ฅด์ฝํ ์ฒด์ธ์ด๋ผ๊ณ ํจ)
- ํ์ง๋ง ์ด๋ ๋จ์ด์ ์์๋ฅผ ๋ฌด์ํ๊ฒ ๋จ.ex) Tom was watching TV in his room. Mary came into the room. Mary said hi to (?)
- ๋ผ๊ณ ๊ฐ์ ํ์ ๋ ๋ฌธ๋งฅ์ Tom์ด ๋์์ผ ํจ. ํ์ง๋ง ์ง์ ๋จ์ด 2~10๊ฐ๋ง์ ๊ฐ์ง๊ณ ํ ๊ฒฝ์ฐ, Tom์ ๊ธฐ์ตํ์ง ๋ชปํจ.

- ๋ฐ๋ผ์ ์ค๋ฅธ์ชฝ๊ณผ ๊ฐ์ด ๋ฐ์ดํฐ์ input๊ฐ์ ์์๋๋ก ๋ถ์ฌ์ค์ผ ํจ.(์ฐ๊ฒฐ)
5.2 (์ํ์ ๊ฒฝ๋ง) RNN์ด๋
- ์ํํ๋ค: ๋ฐ๋ณตํด์ ๋๋์๊ฐ๋ค์ ์๋ฏธ(๋ฐ์ดํฐ๊ฐ ์ํํ๋ฉด์ ์ ๋ณด๊ฐ ๋์์์ด ๊ฐฑ์ ํ๊ฒ ๋จ⇒ ๊ณผ๊ฑฐ์ ์ ๋ณด๋ฅผ ๊ธฐ์ตํ๋ ๋์ ์ต์ ๋ฐ์ดํฐ๋ก ๊ฐฑ์ ๋จ.)



- ht: ์ถ๋ ฅ๊ฐ
- ht-1: ์ ์ ์ถ๋ ฅ๊ฐ(= ์๋ ์ํ ๋ฒกํฐ๋ผ๊ณ ํํ)
- ๊ฐ์ค์น๋ ๋ ๊ฐ๊ฐ ํ์
BPTT( Backpropagation Through Time)
5.3 RNN ๊ตฌํ

- T๊ฐ ๋จ๊ณ๋ถ์ ์์ ์ ํ๊บผ๋ฒ์ ์ฒ๋ฆฌํ๋ ๊ณ์ธต : Time RNN ๊ณ์ธต

class TimeRNN: """ ๋จ์ผ RNN ๊ณ์ธต์ด T๊ฐ ์๋ TimeRNN ๊ณ์ธต ๊ตฌํ Args: Wx: ์
๋ ฅ ๋ฒกํฐ x์ ๊ณฑํด์ง๋ ํ๋ผ๋ฏธํฐ Wh: ์ด์ RNN ๊ณ์ธต์ผ๋ก๋ถํฐ ํ๋ฌ๋ค์ด์ค๋ ์๋ ์ํ ๋ฒกํฐ h์ ๊ณฑํด์ง๋ ํ๋ผ๋ฏธํฐ b: ํธํฅ ํ๋ผ๋ฏธํฐ stateful: ์๋ ์ํ๋ฅผ ์ ์งํ ์ง ์ฌ๋ถ. ์ ์งํ๋ฉด Truncated BPTT ์ํํ๋ฉด์ ์์ ํ๋ฅผ ๋์ง ์๊ณ ์ ๋ฌ """ def __init__(self, Wx, Wh, b, stateful=False): self.params = [Wx, Wh, b] self.grads = [np.zeros_like(Wx), np.zeros_like(Wh), np.zeros_like(b)] self.layers = [] # ์ฌ๋ฌ๊ฐ์ ๋จ์ผ RNN ๊ณ์ธต์ ์ ์ฅํ ๋ฆฌ์คํธ self.h = None # ๋ค์ ์ ๊ฒฝ๋ง ๋ธ๋ก์ ๋๊ธธ ์ด์ ์ ๊ฒฝ๋ง์ ๋ง์ง๋ง ์๋ ์ํ ๋ฒกํฐ self.dh = None # ์ด์ ๋ธ๋ก์ ์๋ ์ํ ๊ธฐ์ธ๊ธฐ ๊ฐ(์ด๋ Truncated BPTT์์๋ ํ์์์ง๋ง seq2seq์์ ํ์ํ๊ธฐ ๋๋ฌธ์ด๋ผ๊ณ ํจ) self.stateful = stateful # ์๋ ์ํ๋ฅผ ์ค์ ํ๋ ํจ์ def set_state(self, h): self.h = h # ์๋ ์ํ๋ฅผ ์ด๊ธฐํํ์ฌ ์๋ ์ํ ์ ์ง๋ฅผ ๋์ด๋ฒ๋ฆฌ๋ ํจ์ def reset_state(self): self.h = None def forward(self, xs): """ xs๋ผ๋ T ๊ธธ์ด์ ์๊ณ์ด ์ ์ฒด ์
๋ ฅ ๋ฒกํฐ๋ฅผ ์์ ํ ์ํ Args: xs: T ๊ธธ์ด์ ์๊ณ์ด ์ ์ฒด ์
๋ ฅ ๋ฒกํฐ """ Wx, Wh, b = self.params N, T, D = xs.shape # (batch_size, time length, ์
๋ ฅ๋ฒกํฐ ์ฐจ์ ์) D, H = Wx.shape # (์
๋ ฅ๋ฒกํฐ ์ฐจ์ ์, ์๋ ์ํ ๋ฒกํฐ ์ฐจ์ ์) self.layers = [] # T๊ธธ์ด์ RNN ๊ณ์ธต ์ ์ฒด์ ์๋ ์ํ ๋ฒกํฐ๋ฅผ ๋ด์ ๋ฐฐ์ด ์ด๊ธฐํ hs = np.empty((N, T, H), dtype='f') # ์์ ํ ์ ์ง ๋์ ๊ฒฝ์ฐ if not self.stateful or self.h is None: self.h = np.zeros((N, H), dtype='f') for t in range(T): layer = RNN(*self.params) self.h = layer.forward(xs[:, t, :], self.h) # loop ๋ค ๋๊ณ ๋ง์ง๋ง์ self.h์๋ ํด๋น ๋ธ๋ก์ ์ต์ข
์๋ ์ํ ๋ฒกํฐ ๋ค์ด์์ hs[:, t, :] = self.h self.layers.append(layer) return hs def backward(self, dhs): """ T๊ธธ์ด์ ์๊ณ์ด ์ ์ฒด๋ฅผ ํ ๋ฒ์ ์ญ์ ํ ์ํ Args: dhs: T๊ธธ์ด ์๊ณ์ด ๋ด์ ๋ชจ๋ ์๋ ์ํ ๋ฒกํฐ์ ๊ธฐ์ธ๊ธฐ """ Wx, Wh, b = self.params N, T, H = dhs.shape D, H = Wx.shape dxs = np.empty((N, T, D), dtype='f') # T๊ธธ์ด ์๊ณ์ด ๋ด์ ๋ชจ๋ ์
๋ ฅ ๋ฒกํฐ์ ๊ธฐ์ธ๊ธฐ dh = 0 grads = [0, 0, 0] # ํ๋์ RNN ๊ณ์ธต์์์ Wx, Wh, b ํ๋ผ๋ฏธํฐ์ ๊ธฐ์ธ๊ธฐ ๋ด์ ๋ฆฌ์คํธ for t in reversed(range(T)): layer = self.layers[t] # ๊ฐ RNN ๊ณ์ธต ๋น, ์์ ํ ์ ์๋์ํ h ๋ฒกํฐ๊ฐ ๋ ๊ฐ๋๋ก ๋ถ๊ธฐ๋์์ผ๋ฏ๋ก ์ญ์ ํ ์์๋ ๊ธฐ์ธ๊ธฐ๋ฅผ sum! dx, dh = layer.backward(dhs[:, t, :] + dh) dxs[:, t, :] = dx # ํ๋์ RNN ๊ณ์ธต์์์ Wx, Wh, b ํ๋ผ๋ฏธํฐ์ ๊ธฐ์ธ๊ธฐ ๋ด๊ธฐ for i, grad in enumerate(layer.grads): grads[i] += grad # T๊ธธ์ด ์๊ณ์ด ์ ์ฒด์ RNN ๊ณ์ธต์ ๊ฑธ์ณ์ ๋ง๋ค์ด์ง Wx, Wh, b ํ๋ผ๋ฏธํฐ์ ๊ธฐ์ธ๊ธฐ ๋ด๊ธฐ for i, grad in enumerate(grads): self.grads[i][...] = grad self.dh = dh # ์ญ์ ํ ๋ฐฉํฅ์ผ๋ก ํ์ ๋, ๋ง์ง๋ง ์๋ ์ํ ๋ฒกํฐ์ ๊ธฐ์ธ๊ธฐ ๊ฐ ์ ์ฅ for seq2seq return dxs
- stateful= True ์ง์ ๋ ํ ๋ฐํด(Time step)๊ฐ ์ข ๋ฃ๋ ์ดํ์๋ ์ํ๋ฅผ ์ด๊ธฐํ ํ์ง ์๊ณ , ๋ค์ ๋ฐํด์ ์ด๊ธฐ ์ํ๋ก ์ฌ์ฉํ๋ค.
- ์๋์ํ๋ฅผ ์ ์งํ๋ ๊ฒ ( ์ด์ ์๊ฐ์ ์๋ ์ํ๋ฅผ ์ ์งํ ์ง ๋ง์ง ์ง์ )


5.5 RNNLM ํ์ต๊ณผ ํ๊ฐ
ํ๊ฐ ์ฒ๋( ํผํ๋ ์ํฐ- ํผ๋๋)
- ํ๋ฅ ์ ์ญ์๋ฅผ ์๋ฏธ

ex) 1๋ฒ์งธ๋ say๋ผ๋ ๋จ์ด๊ฐ 0.8๋ก ๋ฑ์ฅ, 2๋ฒ์งธ ๋ชจ๋ธ์ ๊ฒฝ์ฐ, say๊ฐ 0.2์ ํ๋ฅ ๋ก ์์ธก ⇒ ์ญ์๋ฅผ ์ทจํ ๊ฒฝ์ฐ, 1.25 / 5 ๋ก ๊ฐ๊ฐ ๋์ค๊ฒ ๋จ
- 1.25 ๋ผ๋ ๊ฐ์ ๋ถ๊ธฐ ์๋ก ํด์ํ ์ ์์
- ๋ถ๊ธฐ์: ๋ค์์ ์ถํํ ์ ์๋ ๋จ์ด์ ํ๋ณด ์)ex) ๋ถ๊ธฐ์๊ฐ 1.25 ๋ผ๋ ๊ฒ์ ๋ค์์ ์ถํํ ์ ์๋ ๋จ์ด์ ํ๋ณด๊ฐ 1๊ฐ ์ ๋๋ก ์ขํ์ก๋ค๋ ๋ป์ ์๋ฏธ. 5์ธ ๊ฒฝ์ฐ, ๋ค์์ ์ถํํ ์ ์๋ ๋จ์ด ํ๋ณด๊ฐ 5๊ฐ๋ ๋๋ค.
- ์ฆ, ์์์๋ก ์ข์ ๊ฐ.

728x90
๋ฐ์ํ