RNN은 연속형 데이터를 잘 처리하기 위해서 고안된 신경망으로 가장 기본적인 시퀀스 모델이다.
RNN은 스스로를 반복하면서 이전 단계에서 얻은 정보를 계속해서 전달해주며 입출력을 시퀀스 단위로 처리한다. RNN은 은닉층에서 활성화 함수를 통해서 결과를 내보내는 역할을 하는 노드를 셀이라고 부른다.
RNN은 다음과 같이 생겼다.
이러한 RNN의 구조를 간단하게 보면 다음과 같이 생겼다.
RNN의 구조는 위의 사진처럼 생겼다. 위의 공식에서 Wxh와 Whh는 가중치를 뜻하고, Xt는 입력된 값, ht-1은 이전에 계산된 값, b는 bias를 뜻한다.
RNN은 입력과 출력의 길이를 다르게 설계할 수 있기 때문에 다양한 용도로 사용할 수 있다는 장점을 갖고 있다. 위의 사진에서 제일 왼쪽에 있는 one-to-one은 실질적으로 순환이 적용되지 않은 형태이다.
RNN은 병렬화가 불가능하다는 단점을 갖고 있다. RNN은 벡터가 순차적으로 입력이 되기 때문에 sequential 데이터를 처리할 수 있지만 GPU 연산의 장점인 병렬화가 불가능하다.
그리고 역전파 과정에서 치명적인 문제점이 있는데 바로 기울기 폭발(Exploding Gradient)과 기울기 소실(Vanishing Gradient)이다.
RNN은 활성화 함수를 tanh를 사용하는데 tanh를 미분하면 다음과 같다.
위의 사진에서 볼 수 있듯이 최댓값이 1이고 (-4, 4)의 범위 외에는 0에 가까운 값을 나타낸다.
예를 들어서 값을 0.9라고 했을 때 이 Recurrent가 반복되게 된다면 시퀀스 앞쪽에 있는 은닉층 벡터에는 역전파의 정보가 거의 전달되지 않게 된다. 이러한 문제를 바로 기울기 소실이라고 한다.
반대로 값이 1.1이라고 한다면 시퀀스 앞쪽에 있는 은닉층 벡터에는 역전파 정보가 과하게 전달이 되는데 이러한 문제는 기울기 폭발이라고 부른다.
LSTM은 RNN의 기울기 크기를 조절하기 위한 게이트를 추가한 모델이다.
LSTM은 위의 그림과 같은 구조를 가지고 있다. 총 3개의 Gate를 가지고 있는데 각 게이트는 아래와 같은 역할을 하고 있다.
또한 RNN에서 hidden state 말고도 활성화 함수를 직접 거치지 않는 상태인 cell state(위의 그림에서는 Ct-1)가 추가되었다. cell state는 역전파 과정에서 활성화 함수를 거치지 않아서 정보의 손실이 없기 때문에 뒷쪽에 있는 시퀀스의 정보에 비중을 결정할 수 있으면서 동시에 앞쪽 시퀀스의 정보를 완전히 잃지 않을 수 있다.
GRU는 LSTM의 간소한 버전으로 Gate가 하나 줄어 2개의 Gate를 가지고 있다.
우선 구조를 보면 알 수 있다시피 cell state가 사라졌고, 이 cell state는 hidden state 벡터와 하나의 벡터로 통일되었다. 그리고 forget gate가 LSTM의 forget과 input gate의 역할을 하게 되었다. forget gate의 Zt가 1이면 forget gate는 열리고 input gate가 닫히는 것과 같은 효과를 내고, Zt가 0이면 input gate만 열려서 과거의 내용은 반영하지 않는 것과 같은 효과를 낸다.
예시를 0과 1로 들어서 input과 forget gate 중 하나만 열린다는 식으로 표현을 했지만 input과 forget gate는 동시에 열릴 수 있다!