밑바닥부터 시작하는 딥러닝 2 - 5장

Jajuna_99·2022년 9월 27일
0

순환 신경망(RNN)

확률과 언어 모델 (p.192)

CBOW의 본래 목적은 단어의 분산 표현을 만드는것 이 아니라, 맥락으로 부터 타깃을 정확하게 추측하는 것이다. 즉, 손실 함수의 총합을 최소화하는 것을 잊으면 안되겠다.

여기 맥락으로부터 타깃을 추측하는 것의 쓰임으로 언어 모델이 등장한다.

  • 언어 모델 : 단어 나열에 확률을 부여. 특정한 단어의 시퀸스에 대해서, 그 시퀸스가 일어날 가능성이 어느 정도인지(얼마나 단어 순서가 자연스러운지)를 확률로 평가하는 것이다. -> 기계 번역 & 음성 인식, 문장 생성

  • 동시 확률 P(w1,,wm)P(w_1, \cdots, w_m)(mm은 단어 총 갯수)은 사후 확률을 사용하여 다음과 같이 분해할 수 있다.

    • P(w1,,wm)P(w_1, \cdots, w_m)
      =P(Wmw1,,wm1)P(Wm1w1,,wm2)P(w3w1,w2)P(w2w1)P(w1)= P(W_m | w_1, \cdots, w_{m-1})P(W_{m-1} | w_1, \cdots, w_{m-2}) \cdots P(w_3 | w_1, w_2)P(w_2 | w_1)P(w_1)
      =Πt=1mP(wtW1,,wt1)= \displaystyle\Pi^m_{t=1}P(w_t |W_1, \cdots, w_{t-1})
      (파이 기호는 원래 시그마 처럼 위아래에 써야 되는데 어떻게 하는지 몰라 저렇게 표기함)

    • 요는 동시 확률은 사우 확률의 총곱으로 나타낼 수 있다는 것이다.

    • 위는 곱셈정리로 유도할 수 있다. (p.195)

      • P(A,B)=P(AB)P(B)P(A, B) = P(A|B)P(B)
      • BB가 일어날 확률과 BB가 일어난 후 AA가 일어날 확률의 곱은 A,BA, B의 동시 확률과 같다.
      • AA가 일어난 후 BB가 일어날 확률이라고 해석해도 된다.
    • 위 식(단어들의 총곱은)은 맥락이 타깃의 왼쪽(전) 단어들일 때의 확률이라는 것이다.

  • CBOW 모델을 언어 모델에 적용하는 수식(p.196)까지 보여주면서 말하는 CBOW의 한계는 맥락 안의 단어 순서가 무시된다는 점이다.

  • 이를 위해 맥락의 단어 벡터를 은닉층에서 연결하는 방식(p.198 을 보면 은닉층이 쌓여있는 것)을 생각할 수 있다. -> 매개변수가 증가하고 순서를 기억해야 한다.

  • 위에 문제를 해결하기 위해 순환 신경망 RNN이 등장한다.

RNN이란 (p.199)

RNN은 쉽게 순환하는 신경망이라고 보면 되겠다. 계층으로 표현해보자면

  • 이 계층은 순환하는 경로를 포함한다. -> 데이터를 순환시킨다는 뜻
  • 입력 Xt,(X1,X2,,Xt,)X_t, (X_1, X_2, \cdots, X_t, \cdots)에 대응하여 ht,(h1,h2,,ht,)h_t, (h_1, h_2, \cdots, h_t, \cdots)을 출력한다. -> tt는 시각이다.

순환 신경망에서 입력을 시각적으로 대응해 출력한다면 이 계층에서는 무슨 동작을 하는지 알아보자.

  • RNN 계층은 그 계층으로의 입력과 1개 전의 RNN 계층으로부터의 출력을 받고, 두 정보를 바탕으로 현 시각의 출력을 계산한다.
    • ht=tanh(ht1Wh+xtWx+b)h_t = \tanh(h_{t-1}W_h + x_tW_x + b)
    • 2개의 가중치가 있다.
      • WxW_x : 입렵 xx를 출력 hh로 변환하기 위한 가중치
      • WhW_h : 1개의 RNN 출력을 다음 시각의 출력으로 변환하기 위한 가중치
    • bb : 편향
    • ht1,xth_{t-1}, x_t : 행 벡터
  • 행렬 곱을 계산하고, 그 합을 tanh(쌍곡탄젠트hyperbolic tanget^{hyperbolic \ tanget}) 함수를 이용하여 변환한다.

BPTT(Backpropagation Through Time) : 시간 방향으로 펼친 신경망의 오차역전파법

  • 순환 구조를 펼쳐보면 일반적인 오차역전파법을 적용할 수 있다.
  • 먼저 순전파를 수행하고, 이어서 역전파를 수행하여 원하는 기울기를 구할 수 있다.
  • 다만 좀더 fancy한 BPTT로 일반적인 오차역전파법과 구별하자.
  • 하지만 이 BPTT도 문제점이 있다. 시계열 데이터의 시간 크기가 커지는 것에 비례하여 컴퓨팅 자원 소모도 커지고, 역전파 시의 기울기가 불안정해진다.

Truncated BPTT : 큰 시계열 데이터를 학습할 때 BPTT를 적당한 지점을 끊어서 사용하는 오차역전법 (p.204)

  • '역전파'의 연결만 끊어야 한다.
  • 역전파 연결을 끊어서 블록 단위 계산하면 미래의 데이터에 대해서 생각할 필요없이 독립적으로 역전파를 완성시킬수 있다.
  • 역전파를 끊는거지 순전파는 연결되어야 한다. -> 데이터를 순서대로 입력해 학습시켜야 한다. -> 미니배치 시에도 데이터를 주는 시작 위치를 각 미니배치의 시작 위치로 옮겨줘야 한다. -> 시각에 맞는 입력 위치에 시각이 맞는 입력 데이터를 위치시켜야 한다.

RNN 구현 (p.210)

  • RNN 처리를 한 단계만 수행하는 RNN 계층 구현 (p.211)

  • TT개의 RNN 계층으로 구성된 Time RNN 계층 구현 (p.215)

시계열 데이터 처리 계층 구현 (p.220)

  • RNNLM 모델은 데이터가 입력됨에 따라 이전 단어를 기억한다. (순서대로 입력하니)
  • 이 RNNLM 모델 계층의 순서는 Embedding -> RNN -> Affine -> softmax 순이다. 근데 이제 시계열 데이터 처리에 맞게(한번에 효율적으로 처리하도록) 만든다.

RNNLM 학습과 평가 (p.225)

  • 위에서 제시한 RNNLM 모델을 간단하게 구현하고 학습시키면 출현할 단어의 확률분포가 나온다.이를 퍼플렉서티(perplexity, 혼란도)로 성능을 평가한다.

  • 퍼플렉서티는 '확률의 역수'라고 설명한다. -> 만약에 'you'라는 단어를 입력했을 때 'say'라는 단어를 0.8 확률로 예측했다면, 이 떄의 퍼플렉서티는 10.81 \over 0.8 =1.25= 1.25이다. -> 즉 퍼플렉서티(혼란도)가 낮은 입력이 좋은 입력이다.

  • 이를 분기 수(number of branches)로 직관적으로 해석할 수 있다. 즉, 위에 예시에 퍼플렉서티가 1.25니까 출현할 단어의 후보를 1개로 좁힌것이고, 만약 다른 단어의 퍼플렉서티가 5라고 한다면 단어의 후보가 5개로 좁혀진 것이다.

  • 입력 데이터가 여러 개일 때의 퍼플렉서티 계산 공식

    • L=L =- 1N1\over Nnktnklogynk\displaystyle\sum_n\displaystyle\sum_k t_{nk}\log y_{nk}
    • perplexity=eLperplexity = e^L
  • NN = 데이터의 총개수

  • tnt_n = 원핫 벡터로 나타낸 정답 레이블

  • tnkt_{nk} = nn개쨰 데이터의 kk번째 값

  • ynky_{nk} = 확률분포

위에서 만든 RNNLM 모델을 퍼플렉시티를 통해 성능 평가를 한다.

요약

나에게는 본격적으로 어려워지는 장인듯 하다. RNN 개념을 복습하고 따로 공부할 필요가 있을것 같다.

profile
Learning bunch, mostly computer and language

0개의 댓글