1. RNN 언어 모델(Recurrent Neural Network Language Model, RNNLM)
■ RNN으로 만든 언어 모델을 RNN Language Model, RNNLM이라고 한다. 가장 단순한 RNNLM의 신경망 구조는 다음과 같다.
■ RNN은 시점(time step)이라는 개입이 도입된 것으로, 이를 기반으로 만든 RNNLM도 시점이라는 개념이 있다. 위의 그림에서 왼쪽은 RNNLM 계층의 구성을 나타낸 것이고, 오른쪽은 이를 시간축으로 펼친 신경망이다.
■ RNNLM의 흐름은 첫 번째(가장 아래) 층인 Embedding 계층에서 단어 ID를 단어의 분산 표현(단어 벡터)로 변환한다.
■ Embedding 계층을 통해 출력으로 나온 분산 표현은 RNN 계층의 입력으로 들어가고, 이 입력값으로 RNN 계층은 은닉 상태를 계산한다.
■ RNN 계층에서 계산된 은닉 상태는 다음 층인 Affine 계층과 다음 시점의 RNN 계층으로 동시에 출력된다.
■ 이 은닉 상태는 Affine 계층을 거쳐 출력층인 Softmax 계층으로 전해져서, 최종적으로 각 단어의 확률분포가 출력된다.
■ 예를 들어 훈련 코퍼스에서 'James is working at Disney in London'라는 문장이 입력 데이터로 사용된다고 했을 때, RNNLM에서 이뤄지는 처리는 다음과 같다.
■ 먼저 첫 번째 시점을 보자. 여기서는 첫 단어로 'James'가 입력되었고, Softmax 계층이 출력하는 확률분포 결과, 단어 'is'의 확률이 가장 높아 'is'가 예측된 것이다. (좋은 가중치(잘 학습된 가중치)를 사용해서 올바르게 예측했다고 가정한다.)
■ 첫 번째 시점에서 예측된 'is'는 다음 시점의 입력이 되어 'working'을 예측한다. 예측된 'working'은 다음 시점의 입력이 되어 'at'을 예측한다.
■ 이 'at'은 앞서 나온 James, is, working이라는 시퀀스로 인해 결정된 단어이다.
■ 즉, 여기서 중요한 점은 RNN 계층은 'James is working'이라는 시퀀스(또는 맥락)를 '기억'하고 있다는 점이다.
■ 위의 과정은 테스트 과정에서의 흐름이다. 이런 결과가 나오게 하려면 훈련 과정에서 James, is, working, at, Disney, in London 시퀀스를 훈련시기 위해 기본적으로 잘 학습된 가중치가 있어야 하지만, RNN 계층이 시퀀스를 기억하고 있다는 점도 영향이 크다.
■ RNN 계층이 시퀀스를 기억하고 있다. 이는 \( t = 2 \) 시점에서의 RNN 계층이 'James is working'이라는 과거의 정보를 '응집된 은닉 상태 벡터'를 저장해두고 있기 때문에 가능한 일이다.
■ 각 시점의 RNN 계층은 과거 시점 \( t = 0 \)에서 현재 시점 \( t \)로 입력 데이터 \( w_0, w_1, \cdots , w_{t-1} \)의 은닉 상태 벡터 \( h_0, h_1, \cdots , h_{t-1} \)를 \( t \) 시점의 RNN 계층으로 계속 흘려보냄으로써 현재 시점의 은닉 상태 벡터 \( h_t \)에 과거의 정보를 인코딩해 저장(기억)할 수 있는 것이다.
■ 즉, 은닉 상태 벡터 \( h_2 \)에는 이전 시점의 은닉 상태 벡터 \( h_1 \)의 정보가, \( h_3 \)에는 \( h_1 \)의 정보를 포함한 \( h_2 \)가, \( h_t \)에는 \( h_{t-1}, h_{t-2}, ... , h_2, h_1 \), 이전 시점의 정보들이 순차적으로 압축되어 저장된다.
2. RNNLM 구현
3. 언어 모델의 평가 방법
■ 언어 모델은 과거 단어로부터 다음에 출현할 단어의 확률분포를 출력한다. 이때, 언어 모델의 예측 성능을 평가하는 척도 중 하나로 퍼플렉시티(Perplexity)가 있다.
■ 퍼플렉시티(혼란도)는 모델이 주어진 정보(과거 단어)로 예측을 수행할 때, 얼마나 '혼란'을 겪는지를 측정한다.
■ 입력 데이터가 여러 개인 경우, 퍼플렉시티의 공식은 다음과 같다. \[ L = -\frac{1}{N} \sum_{n} \sum_{k} t_{nk} \log y_{nk}, \quad \text{perplexity} = e^L = \exp(\text{Cross Entropy Loss}) \] - \( L \)에 대한 식은 교차 엔트로피 오차와 동일한 식
- \( N \)은 데이터의 총개수,
- \( t_n \)은 원핫 벡터로 나타낸 정답 레이블, \( t_{nk} \)는 \( n \)번 데이터의 k 번째 값
- \( y_{nk} \)는 확률분포(신경망 모델(여기서는 언어 모델)이 예측한 결과, Softmax의 출력)
- \( L \)은 신경망의 손실(loss)
■ 퍼플렉시티의 값이 낮을수록 모델의 예측 성능이 좋은 것으로 간주된다.
■ 예를 들어 'you say goodbye ___ '에서 빈칸에 들어갈 단어의 확률이 P(and) = 0.8, P(you) = 0.1, P(I) = 0.04, P(bye) = 0.06일 때, 'and'가 'goodbye' 다음에 등장할 올바른 단어라고 가정하자.
■ 그러면, 'and'일 확률이 \( y_{nk} \)이고 \( t_{nk} \)는 1이 된다. 이때의 퍼플렉시티는 입력 데이터가 하나일 때이므로 perplexity = exp(-log(0.8)) = 1.25 = \( \dfrac{1}{0.8} \)
cf) 입력 데이터가 1개일 때는 확률의 역수로 계산되는 것을 볼 수 있다.
■ 오답인 'you'의 perplexity = \( \dfrac{1}{0.1} \) = 10이 된다.
■ 모델이 잘 예측했을 때, perplexity 값이 작은 값으로 산출되는 것을 볼 수 있다.
■ 이 예시에서 perplexity 값 1.25, 10이라는 값의 해석은 '분기 수(number of branches)'로 해석할 수 있다.
■ 여기서 분기 수는 '과거 단어 다음에 출현할 수 있는 단어의 후보 수'이다.
- 그러므로 perplexity 값이 1.25라는 것은 출현할 수 있는 단어의 후보가 1개 정도로 좁혀진 것이고,
- perplexity 값이 10이라는 것은 출현할 수 있는 단어의 후보가 10개임을 의미한다.
- 더 정확하게는 1.25면 단어 선택에 있어 '혼란'을 덜 겪지만, 출현할 수 있는 단어의 수가 10개면 단어 선택에 있어 혼란을 겪는 것이다.
- 따라서 perplexity가 작아질수록 분기 수가 줄어든 좋은 모델이 된다.
'딥러닝' 카테고리의 다른 글
시퀀스 투 시퀀스(Sequence toSequence, seq2seq) (0) | 2025.01.07 |
---|---|
게이트(gate)가 추가된 RNN - LSTM, GRU (0) | 2025.01.06 |
순환 신경망(RNN) (1) (0) | 2025.01.06 |
합성곱 신경망(CNN) (2) (0) | 2024.12.06 |
word2vec 속도 개선 (1) (0) | 2024.11.27 |