본문 바로가기

딥러닝

순환 신경망(RNN) (2)

1. RNN 언어 모델(Recurrent Neural Network Language Model, RNNLM)

■ RNN으로 만든 언어 모델을 RNN Language Model, RNNLM이라고 한다. 가장 단순한 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 구현

순환 신경망(RNN) (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