Source: Dreamgonfly

NN이랑 RNN의 차이?

RNN(Recurrent Neural Network, 순환신경망)은 시퀀스 데이터를 모델링 하기 위해 등장했습니다. RNN이 기존의 뉴럴 네트워크와 다른 점은 ‘기억’(다른 말로 hidden state)을 갖고 있다는 점입니다

새로운 입력이 들어올때마다 네트워크는 자신의 기억을 조금씩 수정합니다. 결국 입력을 모두 처리하고 난 후 네트워크에게 남겨진 기억은 시퀀스 전체를 요약하는 정보가 됩니다. 이는 사람이 시퀀스를 처리하는 방식과 비슷합니다. 이 글을 읽을 때도 우리는 이전까지의 단어에 대한 기억을 바탕으로 새로운 단어를 이해합니다. 이 과정은 새로운 단어마다 계속해서 반복되기 때문에 RNN에는 Recurrent, 즉 순환적이라는 이름이 붙습니다.

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/6c418e03-1e1d-4431-8108-127ce64401f2/Untitled.png

RNN의 구조들

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/7598cd1b-c1d3-4817-a927-d8801f88f8b7/Untitled.png

  1. 고정크기 입력 & 고정크기 출력. 순환적인 부분이 없기 때문에 RNN이 아닙니다.
  2. 고정크기 입력 & 시퀀스 출력. 예) 이미지를 입력해서 이미지에 대한 설명을 문장으로 출력하는 이미지 캡션 생성
  3. 시퀀스 입력 & 고정크기 출력. 예) 문장을 입력해서 긍부정 정도를 출력하는 감성 분석기
  4. 시퀀스 입력 & 시퀀스 출력. 예) 영어를 한국으로 번역하는 자동 번역기
  5. 동기화된 시퀀스 입력 & 시퀀스 출력. 예) 문장에서 다음에 나올 단어를 예측하는 언어 모델

Variable Definition

x_t 는 t 시간 스텝에서의 입력 벡터, s_t는 t 시간 스텝에서 RNN의 기억을 담당하는 hidden state, o는 출력 벡터입니다. U, W, V는 모델의 파라미터입니다. 첫 다이어그램에 없던 sinit은 hidden state의 초기값으로, 구현을 위해 필요한 부분입니다.

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/2f52ccfb-eb6e-4b54-82a6-9286ac58ccdf/Untitled.png

U = tf.Variable(tf.random_normal([w_size, hidden_size], stddev=0.01))
W = tf.Variable(tf.random_normal([hidden_size, hidden_size], stddev=0.01)) # always square
V = tf.Variable(tf.random_normal([hidden_size, n_classes], stddev=0.01))
s = {}
s_init = tf.random_normal(shape=[batch_size, hidden_size], stddev=0.01)
s[-1] = s_init

Model

네트워크의 기억에 해당하는 hidden state st는 입력 x와 과거의 기억 st−1을 조합하여 만들어집니다. 조합하는 방식은 파라미터 U와 W에 의해 결정됩니다. U는 새로운 입력이 새로운 기억에 영향을 미치는 정도를, W는 과거의 기억이 새로운 기억에 영향을 미치는 정도를 결정한다고 볼 수 있습니다. 비선형함수로는 tanh나 ReLU가 주로 사용됩니다. 여기에서는 tanh를 쓰겠습니다.

$$ s_t=tanh(x_tU+s_{t−1}W) $$

s[t] = tf.nn.tanh(tf.matmul(x, U) + tf.matmul(s[t-1], W))