머신러닝/Vision

Recurrent Neural Networks ?

망나 2018. 9. 30. 20:28

이번 포스트에서는 Recurrent Neural Networks(RNN)에 대해서 간단히 알아보도록 하겠습니다. 포스트 내용의 대부분은 colah's blog에 있는 "Understanding LSTM Networks" 글을 참고하였으며, 개인 공부의 목적으로 한글로 정리하였습니다.


Introduction


Recurrent Neural Networks는 CNN과 더불어 많이 활용되고 있는 알고리즘입니다. Wikipedia에는 다음과 같이 소개하고 있습니다 "A recurrent neural network (RNN) is a class of artificial neural network where connections between nodes from a directed graph along a sequence." 쉽게 설명하면, RNN은 히든 노드가 방향을 가진 엣지로 연결되어 있는 순환구조를 이루는 인공신경망의 한 종류입니다. 따라서 순차적으로 등장하는 데이터 처리에 적합하다고 볼 수 있습니다.


    • Language Modeling and Generating Text
    • Machine Translation
    • Speech Recognition
    • Generating Image Descriptions
    • Video Tagging

RNN이 순환구조를 갖고 있고 그래서 순차적으로 등장하는 데이터 처리에 적합하다는데 구체적으로 기존의 다른 neural networks와 어떤 차이를 갖고 있는지 알아보겠습니다. 


쉽게 예를 들자면(이게 적합한지 모르겠지만 제가 이해한데로 작성하겠습니다.), 영화를 볼 때 우리는 영화의 처음부터 끝까지 모든 장면을 이어서 보고 기억합니다. 영화를 시간대별로 나누거나 구분해서 이해하지 않고, 처음부터 끝까지 모든 장면을 이어서 보고 이해합니다. 따라서 우리는 영화에서 서로 연관된 앞, 뒤 장면에 따라 현재 장면을 이해하고 전체적인 영화의 내용을 보다 정확하게 이해할 수 있습니다.


이와 비슷하게, RNN도 순차적으로 등장하는 데이터를 모두(사용자가 지정한 크기만큼) 기억하고 모든 입력값은 해당 입력값의 앞, 뒤(앞, 뒤 모두 영향을 주는 모델이 있고 그렇지 않은 모델이 있습니다.) 입력값에도 영향을 주며 전체적인 모델이 학습이 된다고 볼 수 있습니다. 기존의 neural networks는 모든 입력값이 독립적으로 작용한다는 점에서 차이가 있음을 알 수 있습니다.





Recurrent Neural Networks


기본적인 RNN의 구조는 다음과 같습니다. 설명한데로 순차적인 정보들을 모두 유지하기 위해서 네트워크는 루프 구조를 갖습니다.





Recurrent Neural Networks have loops. - colah's blog


위 RNN의 구조를 보면, A는 입력값  \(X_{t}\)을 받고, \(h_{t}\)을 출력하는 네트워크 입니다. A의 loop는 네트워크의 첫 step의 정보가 다음 step으로 전달되도록 하는 역할을 합니다. 그런데 조금 생각해보면 기존의 neural network과 크게 다르지 않고, 따라서 recurrent neural network는 아래 보이는 것 처럼 같은 네트워크 여러개를 이용해서 표현할 수 있습니다. 




An unrolled recurrent neural network. - colah's blog


(Step 1)첫 A는 input으로 \(X_{0}\)을 받고  \(h_{0}\)을 출력, (Step 2)그 다음 A는 input으로  \(X_{1}\)와 \(h_{0}\)를 받고  \(h_{1}\)을 출력, ... 이렇게 순차적으로 모든 데이터의 정보가 네트워크의 끝까지 전달되게 됩니다. 따라서 다음과 같이 현재 상태를 수식으로 표현할 수 있습니다. $$h_{t} = f(h_{t-1}, X_{t})$$

\(h_{t}\)는 현재 상태를, \(h_{t-1}\)은 이전 상태를 나타내고 \(X_{t}\)는 \(t\)시간의 입력값을 나타냅니다. 위 수식은 다시 다음과 같이 표현할 수 있습니다. $$h_{t} = tanh(W_{hh}h_{t-1} + W_{xh}X_{t} + b_{h})$$

활성함수(activation function)으로 비선형 함수인 tanh를 사용하였고, \(W_{hh}\), \(W_{xh}\)는 weight를 나타내고 \(b_{h}\)는 bias를 나타냅니다. 마지막으로 출력값은 다음과 같이 표현할 수 있습니다. $$y_{t} = W_{hy}h_{t} + b_{y}$$

RNN은 시퀸스 길이에 관계없이 입력과 출력을 받아들일 수 있기 때문에 다양한 구조를 가질 수 있습니다. 아래 그림은 각 구조와 해당 구조의 활용성에 대해서 스탠포드의 cs231n 강좌에서 정리한 자료입니다.



조금 더 직관적인 이해를 위해서 스탠포드 CS231n 강좌의 예제 하나를 살펴보겠습니다. 예제의 문제는 간단합니다. 문자가 주어졌을 때, 다음에 나올 문자를 예측하는 Character-level-Language Model을 만들려고 합니다('hell'을 모델에 넣으면 'o'를 반환하는 모델). 모델의 전체적인 구조는 아래 그림에 보이는 것과 같고, 모델은 반복적으로 순전파(foward propagation)와 역전파(backpropagation)을 수행하며 parameter값들을 갱신하며 학습을 진행하게 됩니다. 여기서 말하는 parameter는 \(W_{xh}\), \(W_{hh}\) 그리고 \(W_{hy}\)가 되겠죠?


cs231n





The Problem of Long-Term Dependencies


정말 간단하면서도 다양한 문제를 해결할 수 있는 RNN에도 여전히 문제점이 존재합니다. 그리고 그 문제점을 해결한 모델도 존재합니다. RNN의 한 종류인 Long Short Term Memory networks (LSTMs) - Hochreiter & Schmidhuber (1997)이 바로 기존의 RNN 문제점을 해결한 모델이며, 지금부터 어떤 문제점이 있는지에 대해서 알아보겠습니다.

RNN의 기본적인 아이디어는 이전의 정보를 현재의 task에도 연결한다는 것 입니다. 쉽게 말해, 이전의 영상 프레임을 활용해서 현재의 프레임을 이해한다는 것 입니다. 아무 문제가 없는 것 처럼 보이지만, 상황에 따라서는 그 과정이 어려워질 수도 있습니다. 예를 들어, 현재 상태와 관련된 정보가 바로 직전에 있거나 가까운 거리에 있다면 학습이 원활하게 되지만, 관련 정보가 아주 멀리 존재한다면 현재 상태까지 오는 동안 대부분의 정보를 잃어버리게 되고 따라서 제대로 된 학습이 불가능할 수도 있습니다(vanishing gradient problem이라고도 할 수 있습니다). 이렇게 순차적인 모습을 갖춘 모델인 RNN이 "long-term dependencies"를 잘 처리할 수 없다는 사실은 Bengio, et al. (1994)에서 잘 설명되어 있습니다.



관련 정보가 가까운 거리에 있으면 쉽게 학습이 된다.



하지만, 위 그림처럼 관련 정보  \(X_{0}\),  \(X_{1}\)와 그 정보가 필요한 상태  \(h_{t+1}\)의 거리가 먼 경우는 학습이 잘 되지 않는다.




LSTM Networks


Long Short Term Memory networks(LSTMs)은 RNN의 일종으로 Hochreiter & Schmidhuber (1997)에 의해 소개 되었습니다. 


모든 recurrent neural networks는 neural network가 반복적으로 연결된 모습(chain of repeating modules of neural network)을 하고 있습니다. 기본적인 RNNs의 모습으로 아래 그림과 같이 반복 모듈을 하나의 tanh만 가진 간단한 구조로 표현할 수 있습니다. 


standard RNN contains a single layer



LSTMs 또한 위와 같은 구조를 갖고 있지만, 반복 모듈의 모습에서 차이가 있습니다. LSTMs는 위 그림 처럼 1개의 neural network layer가 아닌 4개의 layer를 가지고 있습니다.


LSTM contains four interacting layers


LSTMs의 자세한 동작을 알아보기 전에, LSTMs 모듈안의 각 표기들은 다음과 같은 의미를 가지고 있습니다.





The Core Idea Behind LSTMs


LSTMs의 핵심은 cell state라고 할 수 있는데, LSTM은 gate라 불리는 구조들에 의해서 이 cell state에 정보를 더하거나 제거할 수 있습니다. gate는 특정 조건에 맞으면 정보를 통과시키고(cell state에 더해지겠죠?) 조건에 맞지 않으면 정보를 통과시키지 않습니다(cell state에 더해지지 않으니 제거했다고 볼 수 있겠죠?). gate는 sigmoid neural net layer와 pointwise multiplication operation으로 구성됩니다.


모두 알다시피 sigmoid는 0~1 사이의 출력값을 갖습니다. 따라서 이 값이 즉 얼만큼의 정보를 통과시키냐를 나타내게 됩니다. 값이 0이라면 아무 정보도 통과하지 않을 것이고, 1이라면 모든 정보가 통과하게되고 그 만큼 cell state에 정보가 전달되게 됩니다. 

LSTM에는 이러한 gate가 3개가 존재해서 cell state를 조절하게 됩니다.



Step-by-Step LSTM Walk Through


LSTM의 첫번째 단계는 "forget gate layer"로, cell state에서 어떤 정보를 버릴지를 결정하는 sigmoid layer입니다.(즉, 과거 정보를 잊기 위한 게이트입니다.)블로그에서 다음과 같은 예제로 설명하고 있습니다. "example of a language model trying to predict the next word based on all the previous ones. In such a problem, the cell state might include the gender of the present subject, so that the correct pronouns can be used. When we see a new subject, we want to forget the gender of the old subject." 쉽게 말하면 다음 단어를 예측할 때, 다음 나올 단어가 이전과 연관된 주제라면 이전 단어들의 정보가 필요할테고 연관되지 않은 새로운 주제라면 이전 단어들의 정보를 지워야하는데 그러한 역할을 한다는 것 입니다.


forget gate


두번째 단계는 새로운 정보중에서도 어떤 정보를 cell state에 저장할지(더할지)를 정하는 단계로 2개의 파트로 구성되어 있습니다. 첫번째 파트는 sigmoid layer인 "input gate layer"로, 어떤 값을 update할지 정하는 역할을 합니다.(즉, 현재의 정보를 기억하기 위한 게이트입니다.) 그 다음, tanh layer가 새로운 후보 값인 \(\widetilde{C_{t}}\)을 생성합니다. 그리고 두 값을 더해서 현재 상태의 update 값을 생성합니다. 블로그에서는 다음과 같은 예제로 설명하고 있습니다. "In the example of our language model, we’d want to add the gender of the new subject to the cell state, to replace the old one we’re forgetting." 쉽게 말하면 이전 정보들을 지웠을 때 그 자리에 추가할 새로운 정보를 만드는 것 입니다.


input gate


이제 old cell state인 \(C_{t-1}\)을 new cell state인 \(C_{t}\)로 update 시킬 단계 입니다. 


old state에 \(f_{t}\)를 곱함으로써 첫번째 단계에서 정한 정보를 제거하고, \(i_{i} * \widetilde{C_{t}}\)를 더함으로써 각 state 값에 대한 update가 이루어 집니다. 블로그에서는 다음과 같이 설명하고 있습니다. "In the case of the language model, this is where we’d actually drop the information about the old subject’s gender and add the new information, as we decided in the previous steps." 



마지막으로 출력값을 결정해야 합니다. 먼저, sigmoid layer를 통해서 cell state의 어느 부분을 출력값으로 보낼지를 결정합니다. 그리고, cell state를 tanh(-1 ~ 1 사이의 값)를 거친 값과 sigmoid layer에서 나온 값을 곱해줍니다.

블로그에서는 이 단계를 다음과 같이 설명하고 있습니다. "For the language model example, since it just saw a subject, it might want to output information relevant to a verb, in case that’s what is coming next. For example, it might output whether the subject is singular or plural, so that we know what form a verb should be conjugated into if that’s what follows next."




본 포스트에서는 대략적으로 RNN과 LSTM에 대해서 공부하며 정리를 해봤습니다. 내용이 많이 빈약하지만 차츰 구현도 해보고 좀 더 깊이 공부한 뒤에 업데이트 하는걸 목표로 하겠습니다. 글에 잘못 표현된 내용이 있으면 알려주시면 감사하겠습니다


모두 열공합시당


References


Wikipedia - Recurrent neural network

Understanding The Recurrent Neural Network

RNN or Recurrent Neural Network for Noobs

Understanding LSTM Networks

colah's blog




'머신러닝 > Vision' 카테고리의 다른 글

ResNet 이해하기  (0) 2019.06.04
Generative Adversarial Networks (GANs)  (0) 2019.02.27
Batch Normalization?  (0) 2018.10.23
Convolutional Neural Networks ? [2]  (0) 2018.09.06
Convolutional Neural Networks ?  (0) 2018.09.05