순환신경망(RNN: Recurrent Neural Network)은 자연어 처리(NLP: Natural Language Processing) 문제에 높은 성능을 가지는 인기있는 신경망 모델이다. RNN은 기본적으로는 순차적으로 쌓여있는 정보를 처리한다는 아이디어에서 출발한다. 기존의 신경망 구조에서 입출력 각각이 독립적이라고 가정해왔는데 이는 일반적으로 옳지 않다고 여겨진다. 이에 동일한 태스크를 하나의 시퀀스의 모든 요소마다 적용하고 출력 결과는 이전의 계산 결과에 영향을 받게끔 구성한 것이 RNN이다. 이 말을 보다 쉽게 사람이 생각하는 방식에 적용해볼 수 있다. 예를 들어 어떤 사람이 하나의 생각을 말하기 위해 말하는 순간 순간 다시 방금 전의 생각을 지우고 다시 생각해내면서 말하지 않는다. 즉 이 말은 사람의 생각은 매 순간마다 초기화를 하고 다시 처음부터 생각하지 않는다는 의미이다. 또 다른 말로는 사람의 생각에는 지속성이 있다고 볼 수 있다. 근데 전통적인 신경망 구조에서는 이렇게 처리하지 못하고 순간 순간을 초기화하게 구성된다. 이러한 문제를 해결하기 위해 RNN이 등장하게 된다. RNN은 내부에 반복적인 루프를 가진 네트워크로 이 루프는 정보가 지속될 수 있게끔 하는 기능을 한다.
RNN의 단일 루프 모형
위 그림에서 신경망 A는 입력값인 $x_t$를 확인하고 $h_t$를 출력한다. 루프는 정보가 네트워크의 지금의 단계에서 다음 단계로 전달될 수 있는 기능을 한다. 그리고 이러한 신경망 A를 여러 개를 복사하는 것으로 각 네트워크는 자신의 다음 단계의 네트워크에 메세지를 전달하게 된다. 이러한 사슬 같은 특성은 RNN이 시퀀스, 리스트와 밀접하게 관련이 있음을 보여준다.
펼쳐진 RNN 구조
그리고 이를 recurrent하다고 부르는 이유는 동일한 태스크를 한 시퀀스의 모든 요소마다 적용하고 출력 결과는 이전의 계산 결과에 영향을 받기 때문이다. 다른 말로 RNN은 현재까지 계산된 결과의 메모리 정보를 갖고 있다고 볼 수 있다. 이론적으로 RNN은 임의의 길이의 시퀀스 정보를 처리할 수 있지만, 실제로는 짧은 시퀀스만 효과적으로 처리할 수 있다. 위 그림을 조금 더 세분화해서 설명하기 위해 아래의 그림처럼 그릴 수 있고 이는 RNN의 recurrent한 연결을 펼쳐진 것으로 확인할 수 있다. RNN 네트워크를 "펼친다"는 말은 간단히 말해서 네트워크를 전체 시퀀스에 대해 그려놓았다고 보면 된다. 즉, 우리가 관심있는 시퀀스 정보가 5개의 단어로 이루어진 문장이라면, RNN 네트워크는 한 단어당 하나의 layer씩 (recurrent 연결이 없는, 또는 사이클이 없는) 5-layer 신경망 구조로 펼쳐질 것이다. RNN 구조에서 일어나는 계산에 대한 식은 아래와 같다.
RNN 구조도
$x_t$는 시간 스텝(time step) $t$에서의 입력값이다.
$s_t$는 시간 스텝 $t$에서의 hidden state이다. 네트워크의 "메모리" 부분으로서, 이전 시간 스텝의 hiddent state 값과 현재 시간 스텝의 입력값에 의해 계산된다: $s_t=f(Ux_t+Ws_t-1)$. 비선형 함수 $f$는 보통 tanh나 ReLU가 사용되고, 첫 hidden state를 계산하기 위한 $s_-1$은 보통 0으로 초기화시킨다.
$o_t$는 시간 스텝 $t$에서의 출력값이다. 예를 들어, 문장에서 다음 단어를 추측하고 싶다면 단어 수만큼의 차원의 확률 벡터가 될 것이다. $o_t = softmax(Vs_t)$
위와 같이 구성된 RNN은 많은 자연어처리 문제에서 성공적으로 적용되었다. 대표적으로 언어 모델링, 텍스트 생성에 많이 사용되었으며 기계번역과 음성 인식 등에서 많이 사용되고 있다. 특히 현재 전세계에서 RNN의 여러 종류 중에서 가장 많이 사용되는 것은 위에서 살펴본 기본 RNN 구조에 비해 더 긴 시퀀스를 효과적으로 잘 기억하는 LSTM이다. 이 밖에 시간 스텝 $t$에서의 출력값이 이전 시간의 스텝 외에 이후의 시간 스텝에서 들어오는 입력 값에도 영향을 받을 수 있다는 아이디어에 기반한 Bidirectional RNN과 이와 같은 구조에 매 시간 스텝마다 layer를 더 늘린 Deep (Bidirectional) RNN이 있다.
Bidirectional RNN
Deep Bidirectional RNN
이 글의 원문: http://colah.github.io/posts/2015-08-Understanding-LSTMs/
'코드와 오류 기록' 카테고리의 다른 글
활성화 함수(Activation Function) (0) | 2018.11.15 |
---|---|
Long Short Terms Memory networks (LSTM) (0) | 2018.11.15 |
Transport Security has Blocked a cleartext HTTP 해결 (0) | 2016.04.30 |
cocoapods swift (0) | 2016.04.28 |
(Swift) HTTP XMLRPC (0) | 2016.04.28 |