๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Deep Learning/2023 DL ๊ธฐ์ดˆ ์ด๋ก  ๊ณต๋ถ€

[๋ฐ‘๋ฐ”๋‹ฅ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ๋”ฅ๋Ÿฌ๋‹ 2] chap5(์ˆœํ™˜ ์‹ ๊ฒฝ๋ง RNN)

by ์ œ๋ฃฝ 2023. 7. 9.
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)
  • ์‹œ๊ฐ„๋ฐฉํ–ฅ์œผ๋กœ ํŽผ์นœ ์‹ ๊ฒฝ๋ง์˜ ์˜ค์ฐจ์—ญ์ „ํŒŒ
  • ์ด๋Ÿฐ์‹์œผ๋กœ ๊ณ„์† ๊ฐ€๊ฒŒ ๋˜๋ฉด ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ๊ฐ€ ๊ธธ์–ด์งˆ์ˆ˜๋ก ์—ฐ์‚ฐ๋Ÿ‰ ์ฆ๊ฐ€ ๋ฐ ๊ธฐ์šธ๊ธฐ ๊ฐฑ์‹ ๋˜๋ฉด์„œ ์†Œ์‹ค๋˜๋Š” ๋ฌธ์ œ ๋ฐœ์ƒ.
  • ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ ๋‹นํ•œ ๊ธธ์ด๋กœ ๋Š๋Š” Truncated BPTT ๋“ฑ์žฅํ•˜๊ฒŒ ๋จ.
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.4 ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๊ณ„์ธต ๊ตฌํ˜„
  • L= 1/T(Lo+L1+L2+…..LT-1)
5.5 RNNLM ํ•™์Šต๊ณผ ํ‰๊ฐ€
ํ‰๊ฐ€ ์ฒ™๋„( ํผํ”Œ๋ ‰์„œํ‹ฐ- ํ˜ผ๋ž€๋„)
  • ํ™•๋ฅ ์˜ ์—ญ์ˆ˜๋ฅผ ์˜๋ฏธ

ex) 1๋ฒˆ์งธ๋Š” say๋ผ๋Š” ๋‹จ์–ด๊ฐ€ 0.8๋กœ ๋“ฑ์žฅ, 2๋ฒˆ์งธ ๋ชจ๋ธ์˜ ๊ฒฝ์šฐ, say๊ฐ€ 0.2์˜ ํ™•๋ฅ ๋กœ ์˜ˆ์ธก ⇒ ์—ญ์ˆ˜๋ฅผ ์ทจํ•  ๊ฒฝ์šฐ, 1.25 / 5 ๋กœ ๊ฐ๊ฐ ๋‚˜์˜ค๊ฒŒ ๋จ

  • 1.25 ๋ผ๋Š” ๊ฐ’์„ ๋ถ„๊ธฐ ์ˆ˜๋กœ ํ•ด์„ํ•  ์ˆ˜ ์žˆ์Œ
  • ๋ถ„๊ธฐ์ˆ˜: ๋‹ค์Œ์— ์ถœํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๋‹จ์–ด์˜ ํ›„๋ณด ์ˆ˜)ex) ๋ถ„๊ธฐ์ˆ˜๊ฐ€ 1.25 ๋ผ๋Š” ๊ฒƒ์€ ๋‹ค์Œ์— ์ถœํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๋‹จ์–ด์˜ ํ›„๋ณด๊ฐ€ 1๊ฐœ ์ •๋„๋กœ ์ขํ˜€์กŒ๋‹ค๋Š” ๋œป์„ ์˜๋ฏธ. 5์ธ ๊ฒฝ์šฐ, ๋‹ค์Œ์— ์ถœํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๋‹จ์–ด ํ›„๋ณด๊ฐ€ 5๊ฐœ๋‚˜ ๋œ๋‹ค.
  • ์ฆ‰, ์ž‘์„์ˆ˜๋ก ์ข‹์€ ๊ฐ’.

728x90
๋ฐ˜์‘ํ˜•