[딥러닝 이론]RNN과 LSTM이란 본문
이번 글은 RNN(Recurrent Neural Network) 및 LSTM(Long Short Term Memory)을 정리해볼 것이다. 해당 이론들은 Stanford University의 cs231n을 참조하며 작성하였다.
RNN
1. RNN의 개념 및 구조
먼저 RNN이 아닌 "일반적인" Neural Network를 생각해보자. 주로 하나의 input x이 있으면 그에 따른 가중치 및 activation function과 결합되어 하나의 output y를 출력하였다. 우리는 이를 Vanilla Neural Network라고 한다.
그러나 RNN은 특정 순서가 있는 과정(process sequence)으로 이루어진다. RNN에 대한 개념을 알기 위해서는 다양한 RNN 구조부터 살펴보는 것이 좋을 듯하다.
- One to Many: 하나의 input에 대한 여러 개의 output 출력. Image Captioning에 쓰인다.
- Many to One: 여러 개의 input에 대한 하나의 output 출력. 감성 분석(Sentiment Classification)에 쓰인다.
- Many to Many: 여러 개의 input에 대하여 여러 개의 output 출력. Sequence로 이루어진 단어를 인코딩한 뒤 다른 sequence로 이루어진 단어로 디코딩하는 machine translation에 쓰인다. 뿐만 아니라 동영상의 프레임 당 classification을 진행하는 작업도 수행한다.
정리하면
- input과 output 중 하나가 단일하더라도 그 나머지가 여러 개를 출력하거나,
- input과 output이 모두 여러 개를 출력하거나,
- input과 output이 하나더라도 가변하는 방법으로 output을 출력한다면 RNN이라고 부를 수 있다.
부가적으로 "sequential processing"의 예를 들어보겠다. 이미지 분류를 한다고 했을 때, sequential processing은 이미지의 각 부분들의 "glimpse"를 특정 순서대로 훑어보며 분류한다.
2. RNN의 흐름
기본적인 RNN의 흐름은 아래의 순서와 같다. 아래 이미지와 함께 참조한다면 더욱 빨리 이해할 것이다.
- RNN 모형에 internal hidden state ht-1가 존재한다. t는 time step을 의미한다.
- 특정 input xt가 RNN 모형에 들어가면, ht-1와 xt가 특정 가중치 W로 이루어진 함수와 결합하여 새로운 hidden state ht를 생성한다. 이 때 함수 및 W의 값들은 모든 t에서 공유된다. 또한 non-linearlity를 위한 activation function으로 tanh 함수를 사용한다.
- RNN 구조에 따라 특정, 혹은 전체의 t에 대하여 prediction yt를 생성한다.
이를 computational graph형태로 보면 아래와 같은 그림을 볼 수 있다. 이는 Many to Many 구조로 이루어진 RNN이다. 각 t마다 새로운 x와 결합하여 새로운 y값을 출력하는 모습을 확인할 수 있다.
또한 각각의 y에 대하여 softmax loss를 통한 각각의 loss L1, L2, ..., LT가 생길 것이다. 전체 loss L은 L1 LT까지의 합이다.
3. RNN의 Training
우리는 모델의 loss를 구할 때 forward propagation으로 yt에 대한 각각의 loss를 구한 다음 이를 합산한다고 하였다. 또한 그 loss를 minimize하기 위하여 backpropgation을 통해 W 값들을 조정한다. 하지만 sequence가 엄청나게 길면 전체 model에 대한 forward pass 및 backprop를 하는 시간적 비용이 매우 클 것이다. 해당 단점을 보안하기 위하여 Truncated Backpropagation을 사용한다. 즉 학습 시 일정한 크기의 chunk로 나누어 그 chunk 내에서의 loss를 구한다. 다음 각 chunk에서 계산된 loss를 모두 합하여 총 loss를 구한다. 어려워 보여도 이는 112줄의 python코드로 구현가능하다고 한다.
4. RNN의 예시
cs231n에서는 RNN의 예시로 Character-Level Language Model Sampling을 보여준다. [h, e, l, o] 네 알파벳을 가지고 'hello'라는 단어를 생성할 수 있도록 모델을 만드는 것이 목표이다. 각 알파벳은 one-hot encoding 방법을 사용하여 벡터형태로 입력되었다.
만약 그림과 달리 input layer, hidden layer, output layer만 존재했다고 치자. 첫 input "h'에 대한 결과값으로 4.1이 가장 큰 것을 확인할 수 있다. 그러나 4.1의 위치는 알파벳 "o"에 해당하는 위치이며, 우리가 원하는 결과값(hello)을 돌려주지 못한다.
그러나 softmax를 활용하면 각 알파벳이 나올 확률분포가 주어지고, 그 확률분포의 우연한 확률에 따라 우리가 원하는 단어인 hello가 순차적으로 생성될 수 있다.
이렇듯 다음 문자열을 예측하는 모델의 응용으로써 셰익스피어의 문체를 모방하거나, 수학책을 모방하거나, C코드를 모방할 수도 있다. 대신 유의미한 뜻을 반환하지는 않는다.
LSTM
1. Multilayer RNN과 그 한계
실제 RNN모델을 작동시킬 때에는 아래와 같이 여러 층의 hidden state가 있는 Multilayer RNN을 사용한다. 층이 깊어질수록 더욱 좋은 결과를 낼 수 있기 때문이다.
그러나 문제가 발생한다. 앞서 우리는 한 hidden state를 통과할 때마다 ht-1 및 xt가 특정 가중치 W랑 결합되는 모습을 살펴보았다. 실제 모델은 행렬곱을 통하여 결합을 한다. 하지만 loss를 조정하기 위하여 h에 대한 gradient를 구할 때에는 W들이 아래의 그림과 같이 모든 hidden state에 계속 관여한다. 만약 W의 최대값 중 하나가 1보다 크다면 gradient는 폭발적으로 증가할 것이고(exploding gradients), 1보다 작다면 gradient는 폭발적으로 감소할 것이다(vanishing gradients).
Exploding gradient은 gradient clipping으로 gradient의 범위를 조정할 수 있지만, vanishing gradient을 해결하려면 RNN의 architecture을 바꾸어야만 한다. 이 때 LSTM이 도입된다.
2. LSTM의 개념 및 유용성
LSTM은 exploding 및 vanishing gradient 문제를 모두 해결한다. 일반적인 RNN과 마찬가지로 LSTM에서도 먼저 ht-1 및 xt와 W간의 행렬곱이 이루어진다. 그러나 그 결과값은 4개의 "gate"로 나누어져 각각 다른 값을 출력한다. 그 gate들은 아래와 같다.
- Forget gate(f): 이전 셀에 대한 정보를 얼마나 지울 것인지 결정.
- Input gate(i): xt의 값을 얼마나 노출시킬지 결정.
- Output gate(o): 현재 셀에 출력값을 얼마나 노출시킬지 결정.
- Gate gate(g): 현재 셀에 얼만큼의 값을 포함시킬지 결정
Forget gate, input gate, output gate은 sigmoid함수를 사용하여 0~1 사이의 출력값을 가진다.
Gate gate은 tanh 함수를 사용하여 -1~1 사이의 출력값을 가진다.
이 함수들을 사용하는 이유는 바로 LSTM이 앞서 언급한 4개의 gate를 가지고 새로운 hidden state, cell state라고도 불리는 ct를 생성하기 때문이다. ct의 생성과정은 다음과 같다. 먼저 ct-1과 f의 elementwise multiplication을 진행한다. forget gate는 이전 셀의 정보를 얼마나 지울지 판단하는 것이기 때문에 아예 지우거나(0) 유지해야(1)만 할 것이다. 다음에는 input gate와 gate gate의 값을 곱하여 더한다. Input gate 또한 input을 얼마나 노출시킬지의 여부를 결정하기 때문에 0과 1사이의 값을 출력하고, gate gate는 현재 셀에 추가할 값을 정하는 것이기 때문에 -1과 1 사이의 값을 가진다.
그렇다면 ct의 이점은 무엇일까? 정답은 바로 앞서 언급한 RNN의 한계를 극복하기 때문이다. ct의 gradient flow를 computational graph로 살펴보자.
ct에서 ct-1까지 gradient flow에서 gradient를 계산하기 위해서는 f의 elementwise multiplication만 하면 된다. 덧셈 연산은 gradient에 영향을 끼치지 않기 때문이다. 그리고 이 f의 값은 고정값이 아니기 때문에 vanishing/exploding gradient의 가능성이 떨어진다. 물론 f의 값이 0~1사이기 때문에 vanishing gradient의 가능성이 있다. 하지만 실제로는 이 f값에 높은 값의 bias term을 두어 초기에 vanishing이 일어나지 않도록 한다.
LSTM의 uninterrupted gradient flow는 ResNet의 identity mapping과 유사한 원리라고 생각해도 된다.
출처:https://www.youtube.com/watch?v=6niqTuYFZLQ&list=PLC1qU-LWwrF64f4QKQT-Vg5Wr4qEE1Zxk&index=10&t= 3303s
'AI > 딥러닝 이론' 카테고리의 다른 글
[딥러닝 이론]Variational Autoendcoders(VAE) (0) | 2021.08.24 |
---|