본문 바로가기

AI

RNN

Sequence Data

 문장과 같이 전체적인 맥락이 존재하는 데이터를 의미한다.

RNN

 RNN은 위 그림처럼 이전 cell의 output을 현재 cell의 input으로 받아서 순차적으로 state를 처리하게 된다. 

이를 수식으로 표현하게 되면 h.t = f.w(h.t-1, x.t)로 표현할 수 있다.   

rnn의 경우 h와 x를 인풋으로 받게 된다. 이를 일반적인 wx+b의 구조로 적용을 하게되면 (bias는 생략)

h.t = tanh(W.hh*h.t-1 + W.xh*x.t)로 표현된다. 따라서 h.t-1과 x.t는 각각 별도의 weight를 가지게 됨을 알 수 있다. 다음 state를 구하기 위한 h.t는 이렇게 구하고 현재의 output인 y.t는 y.t = W.hy * h.t로 이는 h.t를 이용해서 구함을 알 수 있다.

동일한 Weight 사용

이렇게 RNN을 단일한 state로 표현하기도 하는데 이는 모든 cell에서 동일한 weight를 공유하기 때문이다. 즉 모든 cell에서 동일한 Whh, Wxh, Why를 사용한다.

Character level language model

 RNN을 사용해서 문자를 입력하였을 때, 다음 문자를 추측하는 모델을 구현한다고 하면 그 과정은 어떨까?
예를 들어 인풋으로 ['h', 'e', 'l', 'l' ]을 입력한 경우 다음 문자로 'o'를 예측하는 예시를 들어보자.

 h를 입력한 cell에서는 e를 e를 입력한 cell에서는 l을 .... 이런식으로 예측하다가 마지막에는 o를 예측하는 구조가 된다.

현재 입력으로는 h,e,l,l을 직접 문자로 예시를 들었지만 실제로 입력데이터를 주게 될 때에는 one hot array로 입력을 하게된다. 

처음 인풋인 h를 보게 되면 기존 수식에서는 ht-1이 있어야 하는데, 첫 입력에서는 이전 cell의 입력인 ht-1이 존재하지 않는다. 때문에 첫 레이어에서는 ht-1을 임의로 지정해서 준다.

 

h의 학습을 먼저 보면

기존 레이어의 H_t-1이 W_hh와 곱해져 다음 cell로 전해지고 다음 cell는 이전 cell로 부터 받은 값과 현재의 input을 통해서 다시 H_t를 계산하는 방식으로 학습을 한다.

또한 각각의 cell은 H_t값을 통해서 Y_t인 output을 계산하여 다음 시퀀스의 값을 예측한다.

위 그림의 두번째 state를 보게되면 실제 target은 'l'인데, 예측값으로는 4번 인덱스인 'o'를 예측했다. 즉 에러가 발생한 것이고 이를 cost 함수(softmax)를 통해서 loss를 구하여 학습을 하게된다.