LSTM RNN

LSTM_rnn

 

Recurrent Neural Networks

 

사람이 생각하는 방식은 매번 초기화된 상태에서 나타나지 않는다. 무언가를 읽을 때 당신은 이전까지의 정보들의 연장선상에서 새로운 정보를 이해한다.

전통적인 인공신경망은 이 부분을 해결하지 못했다. 만약 영화에서 다음 어떤 장면이 나올지를 만들어내는 인공신경망을 구축한다고 했을 때, 이전까지 어떤 맥락이 있었는지를 알지 못한 채 만들어내었다.

하지만 RNN이 이를 해결한다. RNN은 정보가 지속되도록 네트워크 안에 루프를 설치한 시스템이다.

 

 

 

사실 루프를 펼쳐놓으면 이게 기존 뉴럴넷과 크게 다르지 않다는 것을 알 수 있다.

사실상, 어떤 뉴럴넷을 여러번 복사한 것으로 생각할 수 도 있는 것이다.

 

 

이러한 체인 형태의 특성은 RNN이 시퀀스나 리스트와 관련 깊다는 걸 보여준다.

RNN은 시퀀스(순차적인 정보)나 리스트와 같은 데이터를 사용하기 위한 자연스러운 구조이다.

Speech Recognition / Language Modeling / Translation / Image captioning 등 다양한 분야에 이러한 네트워크가 사용되어왔고, 매우 훌륭한 결과물을 계속 보여주고 있다. (그러니 작곡에 대입해보자..)

RNN의 매력은 이전의 정보를 현재의 태스크에 연결할 수 있다는 것이다. 하지만 이는 경우에 따라 다르다.

현재보다 얼마되지 않은 최근의 정보들만 필요한 경우도 있다. 예를들어 어떤 단어들 바로 다음 단어를 예측하는 언어 모델링 RNN이 있다고 치자. 이럴 경우, 정보가 필요한 곳과 정보 사이의 간격이 작기 때문에, 과거 정보를 통해서 RNN이 예측할 수 있다.

ex) ‘The clouds are in the ___’ : 여기서 ‘sky’를 예측하는 모델.

 

하지만, 더 많은 문맥을 필요로 하는 경우도 있다.

ex) ‘I grew up in France. …(중략)… I speak fluent ___?’

최근의 정보로는(한 문장 안의 정보 정도) 빈칸에 단순히 어떤 종류의 언어를 필요로 한다는 정도만 알 수 있다. 하지만 어떤 언어인지 알기 위해서는 훨씬 이전의 France의 문맥이 필요하다. 따라서 정보가 필요한 곳과 정보사이의 간격이 아주 클 수 있는 것이다.

불행히도, 이 갭이 커질 수록 RNN이 정보를 연결하는 것이 불가능해진다.

 

 

 

이론적으로는, RNN이 long-term dependencies를 온전히 감당할 수 있다. 인간은 매개변수 (parameter)들을 잘 골라서 RNN이 이런 종류 문제들 중 쉬운 것들을 해결하도록 할 수 있을 것으로 보인다. 그러나 실제로는 해결하지 못한다. 이 문제의 원인은 Hochreiter에 의해 연구되었다.

LSTM은 다행히 이러한 문제가 없다!

 

LSTM Networks

Long Short Term Memory networks는 RNN의 특별한 종류이다. Hochreiter와 Schmidhuber에 의해 소개되었다. 수많은 문제를 해결하는 데에 사용되었고, 인기있는 기법이다.

LSTM은 long-term dependency 문제를 피하기 위해 특별히 디자인되었다. 긴 시간동안 정보를 기억하는 것이 실제적으로 이 네트워크의 기본 작동방식이다. (무언가를 배우기 위해 애쓴다기 보다.)

RNN은 모두 NN 모듈의 반복이 체인처럼 연결되어 있는 구조이다. 기본 RNN에서는 이런 반복되는 모듈이 매우 단순한 구조를 가지고 있다. (예를 들면 하나의 tanh 레이어 같은)

 

 

 

참고)

여기서 tanh는 scaled/shifted version of a logistic sigmoid

 

LSTM도 이와 같은 체인구조를 가지고 있지만, 반복되는 모듈의 구조가 다르다. 하나의 NN을 갖는 것이 아니라 4개의 서로 상호작용하는 레이어로 구성되어 있다.

디테일에 대해서는 일단 걱정하지 마라. 한가지씩 다시 살펴볼 것이다.

지금은 일단 이러한 표기들과 익숙해져라.

 

 

위 다이어그램에서 각각의 선이 하나의 벡터를 운반한다. (한 노드의 아웃풋에서 다른 노드의 인풋까지)

분홍 원은 요소별 연산 (벡터 합 같은) 이고, 노란 박스는 학습된 NN 레이어이다. 하나로 합쳐지는 화살표 선분은 결합(연결/연쇄적으로 잇기)을 의미한다. 갈라지는 화살표는 내용물이 복사되어서 각기 다른 위치로 보내진다는 것을 의미한다.

 

LSTM의 핵심 아이디어 

LSTM의 핵심은 ‘cell’의 상태(state) 이다. 아래 다이어그램에서 윗부분에 가로지르는 수평 라인이다.

셀의 상태는 컨베이어 벨트와 같다. 체인의 전체를 가로지르면서, 약간의 linear한 상호작용을 거친다. 정보가 변하지 않은 채 이 위를 흘러가는 건 아주 쉬운 일이다.

LSTM은 ‘gate’라는 구조를 통해서 이 ‘셀 상태’에 정보를 더하거나 제거하는 기능을 갖고 있다.

Gate는 선택적으로 정보가 흐르도록 하는 방법이다. 이는 sigmoid 인공신경망 레이어와 요소별(pointwise) 곱셈 연산으로 이루어져 있다.

 

 

Sigmoid 레이어는 0과 1사이의 결과물을 낸다. (각 컴포넌트들이 얼마나 허용되어야 하는지를 나타내는 값) 0은 아무것도 통과시키지 말라는 뜻이고, 1은 모든 것을 통과시키라는 의미이다.

LSTM은 이런 gate를 3개 가지고 있고, 이를 사용해서 셀 상태를 보호하고 조절한다.

 

LSTM 의 단계별 구축 과정

첫번째 과정은 셀 상태로 부터 어떤 정보를 제거할지 결정하는 것이다. 이 결정은 “forget gate layer”라는 sigmoid 레이어를 통해 이루어진다.

forget gate layer는 ht-1 과 xt를 보고 셀 상태 Ct-1에서의 각 숫자마다(요소별 곱) 0과 1사이의 값을 출력한다. 여기서 1은 “이것을 완전히 유지해라”라는 뜻이고, 0은 “이것을 완전히 제거해라”라는 뜻이다.

아까 살펴본 언어 모델을 다시 생각해보자.(이전의 단어들에 기반해서 다음 단어를 예측하는 모델) 이런 문제에서 셀 상태는 현재 주어의 성별에 대한 정보를 포함할 수도 있다. (올바른 대명사를 사용하기 위해) 새로운 주어를 만나면, 예전 주어의 성별은 잊어버리길 원한다.

다음 과정은 어떤 새로운 정보를 셀 상태에 저장할지 결정하는 것이다. 이는 두가지 부분으로 이루어져 있다. 첫째로, “input gate layer”라고 불리는 sigmoid layer는 우리가 어떤 값들을  업데이트할 지 결정한다. 다음으로 tanh layer는 셀 상태에 더해질 새로운 후보 값들 (Ct)의 벡터를 만든다. 그 다음엔, 이 두가지를 결합해서 상태에 대한 업데이트 내용을 만든다.

이제 이전 셀 상태인 Ct-1를 새로운 셀 상태인 Ct로 업데이트 할 시간이다. 이전 과정들에서 이미 무엇을 할지는 결정되어 있고, 실행하기만 하면 되는 것이다.

우리는 이전 상태에 ft를 곱한다. ft는 전에 계산한 “forget gate”의 출력이다. (이전 과정까지 잊어버리기로 결정했던 것들을 잊어버리게 하는 과정) 그리고나서 우리는 it * Ct를 더한다. 이것은 새로운 후보값들이다. 이 후보값들은 우리가 상태값을 얼마만큼 업데이트하기로 결정했는지에 따라서 스케일링 (scaled) 된다.

언어 모델이 경우, 여기가 바로 이전 주어의 성별 정보를 버리고 새로운 주어의 성별 정보를 더한 지점이다. (이전 단계에서 결정한대로)

마지막으로, 최종 결과로 무엇을 낼지 결정해야 한다. 이 아웃풋은 셀 상태에 기초했지만 필터링된 버진이다. 첫째로, 우리는 셀 상태의 어느 부분을 아웃풋으로 낼지 결정하는 sigmoid layer를 통과시킨다. 그리고, 우리는 셀 상태를 tanh layer에 통과시키고, sigmoid gate를 통과한 아웃풋으로 곱한다. 우리가 출력하기로 결정한 부분들만을 아웃풋으로 내기 위함이다.

언어 모델의 예시를 보면, 네트워크가 주어를 보았기 때문에, 동사에 관련한 정보를 아웃풋으로 내기 원한다.(동사가 그 다음에 오는 경우) 예를 들어 주어가 단수 또는 복시일지를 결정하는 결과값을 내어서, 다음에 오는 동사가 어떤 형태로 결합될지 알 수 있도록 하는 것이다.

(작곡 모듈에서도 이전에 보았던 n-gram 멜로디를 기억하고 그 내용을 주제삼아 변주해 나가는 등의 방식으로 적용이 가능할 것으로 보인다.)

 

LSTM의 다양한 활용

지금까지 일반적인 LSTM에 대해 설명해보았다. 하지만 모든 LSTM이 이와 같은 것은 아니다. 사실, LSTM에 관련된 모든 논문들이 조금씩 다른 버전을 사용하고 있다. 차이점이 작긴 하지만, 그래도 알아두어야 할 것들이다.

1)

위 다이어그램은 모든 gate에 구멍들을(peephole) 더한다. 많은 논문들은 몇몇의 gate에만 구멍을 더하고 나머지에는 더하지 않는다.

2)

또다른 변형은 “forget gate”와 “input gate”를 짝지어서 사용하는 것이다. 무엇을 잊을지(forget) 어느 곳에 새로운 정보를 더할지를 따로 따로 결정하는 것이 아니라, 함께 결정하도록 하는 것이다. 어떤 것의 자리에 새로운 값을 넣는 경우에만 잊어버리도록(forget)하는 것이다. 또한, 이전 것을 잊을 경우에만(forget) 새로운 값을 상태에 집어 넣는 것이다.

3)

조금더 드라마틱한 변형은 Gated Recurrent Unit (GRU)이다. 이것은 forget gate 와 input gate를 하나의 “update gate”로 결합한다. 이것은 셀 상태를 hidden state에 합쳐서, 또다른 변화를 만들어낸다. 결과적으로 생성된 모델은 기존 LSTM 모델보다 더 단순한 형태이다. 이 모델은 매우 인기가 많아지고 있다.

 

이렇게 LSTM의 변형을 살펴보았다. 사실 이 외에도 여러 종류의 변형이 있다. (예를 들어 Depth Gated RNN) 혹은 전혀 새로운 방식으로 long-term dependencies를 해결하려고 한 접근도 있다. (Clockwork RNN)

이 변형들 중 어느 것이 가장 좋은 것일까? 이 차이점이 의미 있는 차이인가? Greff는 논문을 통해 인기있는 변형들을 잘 비교했는데, 대부분 거의 차이가 없었다. Jozefowicz는 10000개 이상의 RNN 구조를 테스트 했는데, 특정한 작업을 위해서는 LSTM보다도 오히려 나은 결과를 내었다.

 

결론

앞에서 언급한 것처럼, 사람들은 RNN을 사용해서 놀라운 성취를 이루었는데, 본질적으로 이것들은 모두 LSTM을 사용한 것들이다. 대부분의 작업에서 그러하다.

수식들을 나열해보면, LSTM은 매우 복잡해보인다. 하지만 차근차근 살펴보면서 이해가 되었기를 바란다.

LSTM은 RNN을 통해 얻는 성취들에 있어서 큰 도약이었다. 이제 또다른 질문을 해볼 수 있다. 또 다른 큰 도약이 가능할까? 연구자들의 일반적인 의견은 Attention이 다음 도약이라는 것이다. Attention은, RNN의 매 단계마다 어떤 큰 정보의 집합에서 살펴볼 정보를 얻어내도록 하는 것이다. 예를 들어, RNN을 사용해서 image를 설명하는 캡션을 만들려고 할 때, RNN은 아웃풋으로 낼 단어들마다 살펴볼 이미지의 부분을 선택할 것이다. 사실, Xu의 연구가 정확히 이런 것들을 했다. Attention을 사용한 멋진 결과물들은 이외에도 많이 있다. 앞으로도 더 많이 나올 것으로 기대한다.

Attention 이외에도 흥미로운 주제는 더 있다. Grid LSTM도 매우 유망하다. Generative 모델에서 RNN을 사용하는 연구들도 매우 흥미롭다. 지난 몇년간은 RNN에 있어서 매우 흥미로운 시간이었고, 앞으로도 그럴 것이다.

 

 

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s