Deep Learning/2023 DL 기초 이둠 곡뢀

[λ°‘λ°”λ‹₯λΆ€ν„° μ‹œμž‘ν•˜λŠ” λ”₯λŸ¬λ‹ 2] chap5(μˆœν™˜ 신경망 RNN)

제룽 2023. 7. 9. 00:51
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
λ°˜μ‘ν˜•