가변적인 길이의 sequence 데이터를 입력으로 받아 매 time step 마다 vector를 처리하는 모델
위는 RNN의 기본 수식이다. 또한, 를 아래와 같이도 표현할 수 있다.
RNN은 이름에서 알 수 있듯이 재귀적인 값을 사용하는 네트워크이다. 이때 는 다음 재귀반복에서 와 함께 입력된다. 언어 모델에서 RNN의 time step input인 는 문장에서 token화 및 encoding을 한 결과와 같은 값이 입력된다. 예시로, I study math의 경우 차례대로 I 그다음 step에 study 그 다음 step에 math가 입력된다.
또한, 선형변환이 이루어진 와 는 같은 dimension이기에 더해줄 수 있다. 매 time step마다 동일한 parameter로 학습을 진행하기 때문에, 재귀마다 평균이 0인 분포로 출력되게끔 tanh 활성화함수를 사용한다.
매 time step에서의 hidden state value를 통해서 target 변수를 예측해야하는 경우, 위와같이 선형변환을 통해서 결과값을 얻을 수 있고, 다중 클래스 분류 작업의 경우 마지막 단에 softmax함수를 추가함으로써, output 총합이 1이 되게끔 조절하는 것이 가능하다.
RNN에서의 activation 함수는 tanh이다. tanh 함수는 위와 같은 그래프 개형을 가진다. 활성화함수로 tanh를 사용하는 이유는, 분포의 평균이 0에 수렴하기 때문이다. 따라서, 재귀적으로 입력되는 값을 고의적으로 zero centered한 분포로 맞춰주는 역할을 한다. 만약에 일반적인 sigmoid함수를 사용했다면, 1로 결과가 saturated 되는 경우가 생길 수 있다.
tanh의 평균이 0에 수렴한다는 것을 기함수의 성질로 증명해보자
먼저, tanh 함수의 수식은 위와 같다. 그리고, "tanh 함수의 기대값이 0이다"라는 명제를 증명하기 위해 입력이 정규분포를 따른다고 가정해보자. tanh 함수는 홀수 함수(기함수, 원점대칭)이기 때문에 로 볼 수 있다.
이어서 기대값의 정의에 맞게 tanh의 기대값을 구해보자. 입력 가 확률밀도함수 를 따를 때, 어떤 함수 의 기대값은 아래와 같다.
에 함수를 넣고 정규분포를 따르는 가정하에 확률밀도함수와 평균은 아래와 같다.
이에 기대값을 두 부분으로 나누면, 기함수이기 때문에 아래와 같다.
두 값의 합은 0임을 알 수 있다.
RNN의 tanh의 입력이 되는 hidden state와 input의 선형변환은, 두 값을 이어붙인 후 선형변환하는 것과 동일하다.
앞서 언급했던,
는, cocatenation 연산을 세미콜론으로 표현하여 아래와 같이 표현할 수 있다.
두 행렬 각각 에서 그리고, 에서 의 형변환을 도와주며, output 차원이 hidden state의 차원이 되어야 하기 때문에, 행의 갯수는 hidden state의 차원의 수와 같아진다.
hidden state 값의 형변환 시켜주는 matrix는 RNN의 output이 hidden state 값과 같아야 하기 때문에 정방행렬이 된다.
output의 dimension은 hidden state와 input의 형변환을 더하게 된 값으로 이는, 두 입력값을 concat한 fully connected layer라고 판단할 수 있다.
위는 재귀적으로 표현했던 RNN의 도식을 입력 를 시간 순으로 펼쳐서 그린 방법이다. 의 경우, 의 값은 구할 수 없기 때문에, 0 vector로 초기의 입력을 설정하게 된다.
기존 RNN에서의 hidden state value에서 바로 output 를 얻는 것이 아니라, 이를 RNN의 input으로 사용하여 RNN 계층을 한번 더 통과하는 방법이다. 서로 다른 layer의 RNN은 각각 다른 weight를 가지고 학습을 진행하게 된다.
여태까지 다룬, RNN은 단방향으로 인코딩을 진행하게 된다. 순차적으로, 부터 차례대로 hidden state value를 계산하게 된다. 이에, 역방향으로 hidden state value를 계산하여 concat 하는 것으로 출력값을 얻는 방법이 Bidirectional RNN이다.
I read books that he gave 같은 문장에 대해서 기계번역을 진행할때, 양방향성은 중요하다.
RNN의 형태는 위와 같이 one to one 부터 many to many까지 존재한다. language modeling의 경우 마지막 many to many 형태의 RNN을 사용한다. delay 없이 입력값에 대해 다음에 올 단어의 출력을 생성하는 것이다.