LSTM and GRU

RNN에서의 문제들

본글은 Yoshua Bengio(Univ. of Montreal)의 RNN강의를 요약/재해석한 것이다.

RNN의 장점은 시퀀스상 앞서는 입력에 대한 정보를 활용하여 현재 state의 출력을 예측할 수 있다는 점이다. 그러나, 이러한 장점이 발휘되려면 RNN 구조의 안정성이 담보되어야 한다. Yoshua Benjio는 MIT에 있을때 RNN구조가 가끔 학습을 하지 못한다는 점을 발견하고, 그 원인을 알아내기 위해 고민했던 모양이다. 그는 단일 뉴런과 tanh() activation function을 사용하여부호(sign)을 가진 입력 정보가 T time steps 동안  전달되는 과정에서, 정보의 전달이 시퀀스의 길이(T)가 짧으면 성공하지만 길어 질수록 성공확률이 급속히 감소하는 실험 결과를 얻어냈다.


과학의 발전은 이러한 실패로 부터 이루어 진다. 실패의 원인을 파학하고, 그 점을 해결하기 위한 노력이 문제해결에 다가서게 한다. 이러한 문제의 발견으로부터 해결책을 강구하는 과정이 결과적으로  RNN 모델을 진화시켜왔다. 문제해결은 실패 원인을 파학하는데 부터 시작하고, 실패 원인의 파악의 첫걸음은 Yoshua가 한것 처럼, 대상을 단순화 시키는 것이다. 문제의 원인이 여러개 있을 때, 복잡한 모델을 사용하여 테스트하는 방법을 사용하면 숨어있는 모든 문제점을 발견하기 어렵게 만든다. 여러 형태의 단순 모델의 분석으로 부터 테스트를 수행하는 것이 문제의 원인을 정확히 집어내는데 훨씬 수월한 방법이다.


실험결과의 원인에 대한 설명은 다음과 같다.

  • 상태(State)가 여러 subspace로 나뉘어진 공간에 존재할 가능성이 있는 경우는 subspace들간의 경계(boundary)에서 gradient값에 따라 인접한 서로 다른 subspace로 빠져 들어갈 수 있다. 즉 gradient값의 작은 변화로 부터 결국에는 완전히 다른 결과를 얻을 수 있다. 이것을 gradient explosion이라고 한다.
  • Subspace에서 미분값이 1보다 큰경우(expanding region이라고 함) RNN model은 불안정해지고, 노이즈에 의해 수렴구간 밖으로 나갈 수 있다. 그러므로 미분값은 1보다 작은 영역(spectral radius < 1)에 존재해야 RNN구조에서의 정보가 유지되어 전달 될 수 있다.
  • 수렴을 하기위해 만족해야 하는 상기 조건은 다른 문제를 일으키는데, 이 문제를 vanishing gradient라고 한다. 학습을 하기위해서 Loss function에 대한 미분값(gradients)을 구하는 과정이 필요하며, RNN구조에서는 BPTT(Back Propagation Through Time) 방법을 사용하는데, 이 과정에서 문제를 발생 시킨다. Chain rule에 의해 시퀀스상 이전 state의 변화에 따른 후속 state의 변화값을 나타내는 미분들이 연속으로 곱하는 형태가 나오는데, 시퀀스가 길어 질수록 < 1 값의 미분값들이 곱해져 gradient값이 제로에 가까워 지기 때문이다(if spectral radius of jacobian is < 1  –> propagated gradients vanish).
  • 이처럼 gradients값이 사라지는 현상이 RNN에서 문제가 되는 이유는 neural network의 weight matrix에 대한 cost function의 미분값을 구할 때, 시퀀스상 오래전에 나타난 입력에 대한 long-term dependency는 상대적으로 short-term dependency보다 T값이 커짐에 따라 급속히 작아지기 때문이다. 이는 다른 의미로, long-term 정보가 short-term 정보와는 달리 정보의 손실이 급속히 이루어 진다는 것이다. 이처럼 정보가 전달되지 못하는 문제를 해결하기 위해 고안된 모델이 LSTM(Long Short Term Memory)이다.

위에 언급된 RNN에서의 문제점들을 정리한 자료를 아래에 링크하였다.

On the difficulty of training recurrent neural networks

Learning Long-Term Dependencies with Gradient Descent is Difficult

RNN의 구조상 나타나는 특징에 주목해야 한다. 먼저, RNN은 그 구조가 복잡할 수록 많은 메모리가 필요하다는 것이다. 각각의 구성요소에 대한 별도의 weight tensor/matrix 정보를 기억하고 계산하여야 하며, 입력과 출력의  dimension이 커질수록 추가로 메모리가 많아진다. 또한, 시퀀스 정보를 어느정도로 전달해야 하느냐에 따라 많은 메모리가 몇배로 증가할 수 있다. 이러한 문제점을 해결하는 방법들이 제시되고, 시퀀스상 앞선 정보의 전달 방법에 따라 많은 종류의 RNN variants들이 고안될수 있는데, 이들 중 가장 많이 사용되는 LSTM에 대해 정리해 보기로 한다.

LSTM(Long Short-Term Memory)

본글은 WildML의 자료를 바탕으로 요약/재해석한 것이다.

먼저 LSTM의 기본 구조를 이해하기 위해 아래의 link 자료를 살펴보기 바란다.

Chris Olah Blog Post

LSTM: A Search Space Odyssey

rnn-lstm-cell

rnn-lstm-cell-notation

LSTMs은 앞서 언급한 vanishing gradients 문제를 해결하기위해 gating mechanism을 도입한다. 이것이 의미하는 바를 이해하기 위해서는 아래 식과 그림을 통해 어떻게  LSTM이 hidden state를 계산해 내는지 살펴보아야 한다.

아래 식들은 복잡해 보이지만 실제로는 그다지 어렵지 않다. 먼저 LSTM layer는 hidden state를 계산해 내기 위한 여러 방법중의 하나라는 사실에 주목할 필요가 있다. simple RNN에서 hidden state는 아래와 같이 계산되었다.

rnn-state-function

이 unit으로의 입력은  step t에서의 입력값과, 이전의 hidden state 값이다.  출력 값은 새로운 hidden state 값이된다. LSTM unit도 이와 같은 역할을 수행하지만, 보다 여러가지를 고려하여 수행한다고 생각하면 된다. LSTM에서의 새로운 state의 계산은 아래 식들로 표현된다. Simple RNN에서 하나의 식으로 해결하던 것을 여섯개의 식을 통해 계산해 내는 것이지만 unit의 구조만 복잡해지는 것이지 전체적인 RNN의 개념은 동일하게 적용된다.

여기서, i, f, o는 각각 input gate, forget gate, output gate라고 한다. 이것들을 gate라고 부르는 이유는 sigmoid function에 의해 벡터를 elementwise하게 곱해서 나온 벡터를 0과 1사이의 값으로 변환시킴으로써, 결과로 얻은 이 벡터들과 연산되는 벡터가 어느 정도 그 값이 전달(“let through”)되는 지를 표현해 낼 수 있기 때문이다. Input gate는 어느 정도의 현재 입력값이 전달되는 지를 정의하는 인자로 사용되며, forget gate는 이름에서 유추할 수 있듯이, 어느 정도 이전 state로 부터 전달된 정보를 현재 state로 전달하는 지 정의하는 역할을 수행한다. 마지막으로, output gate는 어느 정도로 현재 state의 정보를 출력이나 상위 layer(stacked layer의 경우)에 전달하는 지 정의 한다. 이 gate들의 dimension은 state의 dimension과 같다.


Linear algebra로 표현되는 machine learning에서 사용되는 식들은 알고리즘으로 구현하고 컴퓨터 프로그래밍하려면, 벡터나 행렬간 다양한 연산을 수행할때 에러를 방지하기 위해서 벡터/매트릭스/텐서의 dimension을 주의 깊게 확인해야 한다. 


g는 “candidate” hidden state이며, 입력과 이전 state 정보를 이용하여 새로운 잠정적인 state값을 계산해 낸다. 이것은 앞서 설명한 simple RNN의 new state 계산방법과 정확히 일치한다. LSTM에서는 이 candidate state값을 그대로 출력을 내는데 사용하지 않고 input gate와의 연산을 통해 일부의 일부의 값들만 출력을 내는데 사용한다.

Ct는 unit의 internal memory이며, 식에서 나타난 바와 같이, 이전의 memory인 Ct-1과 forget gate값의 elementwise 곱과 앞서 설명한 candidate state와 input gate의 곱을 조합한 것이다. 이것은 물리적으로 이전 메모리와 현재의 입력의 조합을 의미한다. Forget gate를 통해 이전 메모리의 정보의 전달량을 조절하고, input gate를 통해 candidate state 정보의전달량을 전달한다.

Internal memory(Ct)값이 정해지면, 이를 output gate와 곱함으로써, 최종적으로 출력값을 계산해낼 수 있다. 즉, internal memory의 정보량이 최종 출력으로 전달되는 정도는  output gate를 통해 조절된다.

LSTM을 구현한 소스 코드는 github에 업로드되어 있다. 

GRU(Gated Recurrent Unit)

개인적인 생각으로는 LSTM에서 별도로 output gate를 두어야 할 이유가 있을지 의문이 든다. 계산 절차상 앞서는 다른 두가지 gate를 이용해서도 원하는 출력을 얻을 수 있다는 생각이 들기 때문이다. 실제 그 가능성을 타진해 보지 않았으므로, 확정지어 말하기는 곤란하지만, 여기서 설명하는 GRU는 output gate를 별도로 두지 않았다. GRU는 LSTM을 간단하게 변경한 구조로 아래와 같이 표현되며 특징은 다음과 같다.

LSTM은 세개이 gate를 가지지만, GRU는 두개의 gate만 가지고 있다. Reset gate(r)과 update gate(z)이고, LSTM의 output gate는 없다. Output gate가 없는 상태에서 LSTM이 구현하고자 하는 정보의 전달과 조합 방식을 다르게 구현한 것이 GRU라고 얘기할 수 있다.

직관적으로 보면, reset gate는 새로운 입력을 이전 메모리와 어떻게 조합하는지를 결정하며, update gate는 이전 메모리 정보를 어느 정도만 유지하여 새로운 state를 계산해 내는지를 결정한다. 이미 기술한 차이점을 제외한 주목할 만한 LSTM과의 차이점은 다음과 같다.

  • GRU는 internal memory정보를 저장하지 않는다.
  • LSTM에 있는 input과 forget gate는 GRU의 update gate를 통해 연계되서 표현되며, reset gate는 이전 hidden state와 직접 작용한다. 그러므로, reset gate의 역할은 update gate의 역할에도 영향을 미친다고 할 수 있다.
  • LSTM과는 달리 출력을 계산할때 비선형 activation을 적용하지 않는다.

GRU는 LSTM에 비해 간단한 구조를 가지고 있지만, 구현하고자 하는 목적은 서로 같기 때문에, 간단한 구조에도 불구하고 서로 비슷한 성능을 보인다고 한다.

Advertisements

LSTM and GRU”에 대한 답글 1개

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중