Recurrent Neural Networks.











RNN은 기존의 Neural Network와는 다르게 loop가 있다.

위와같이 input 값 Xt 가 있고, output값 ht가 있다. 루프는 한쪽의 노드에서 다음노드로 정보를 보낸다.
루프를돌면서 결과값이 나오는게 기존 Neural Net과 비교해보면 좀 다르게 보일텐데, 좀더 깊게 들어가면 완전히 다른것도 아니다.
같은네트워크의 여러노드가 합쳐진거라고 보면된다.
다음과같이 위그림을 펼쳐보이면 어떻게 보이는지보자.

이렇게보면 기본적인 Neural Net과 얼추 비슷해보인다.
위와같은 그림이 현재 많이사용하고있는 RNN의 기본적인 아키텍쳐이고, 여러분야에 많이사용되고있다.
음성인식, 번역, 이미지 캡셔닝(이미지에 주석다는것) 등등.. 유용하게 쓰인다.
장기 의존성문제 (long-term dependencies)
가끔 우린 과거의 단어,말을 가지고 다음 단어가 무엇인지등을 정할수있다.
예를들어 "구름이 하늘에 있다" 와같이 중간에 "하늘"이라는 말을 잘 못 듣더라도 하늘이라는 단어를 유추할수가있다.
이와같이 학습을 통해 RNN도 과거의 데이터를 가지고 현재값을 무엇이 나올지, 다음값은 무엇이 나올지를 예측할수가있는것이다.
그러나 다음과같은 경우도 있다.
"I grew up in France . . . I speak fluent French"
위와같은 경우가 있을 마지막에 나온 French는 언어의 이름일것이다.
근데, 자세히살펴보면
French라는 영어단의 의미가 많을텐데,
French가 언어의 이름이라는것을 어떻게 알수있을까 ???
바로전에 나온 France라는 말에서 그 힌트를 찾을수있다. 전체적으로 앞에서 나온 정보(France)와 언어의 이름(French)는 관련성이 많은데 그 갭이 너무 크다.
안타깝게도 그갭은 RNN관점에서봤을때 학습시키기 어렵게 만든다.
이론상, RNN에서는 이러느 long-term dependencies라는 문제를 완전하게 해결가능한데, 인간이 parameters들을 직접선택하는방법이다.
혼자하는 toy 프로젝트에서는 적용이 가능하지만, 실전에서는 전혀 먹히지않고 훈련시키기가 상당히 힘들다.
LSTM Networks
LSTM(Long Short Term Memory)는 위의 문제를 해결한 RNN의 한종류이다.
장기간보존되는 정보는 실제 배우려고 노력해서 보존되는것이아니라, 기본적으로 행동하는 방법으로 보존됨.(자연스럽게 익혀진다는뜻)
모든 RNN은 기본적으로 Neural Net의 반복된 형식으로 모습이 생성되어있다.

LSTM도 위와같은 구조를 갖고있지만 반복되는 노드(module)가 기본 RNN이랑 다르다. 하나의 Neural Net을 갖고있는대신에,
소통하는 4개의 layer가 있다.

그림이 좀 어렵게생겼지만, 하나씩 살펴보자.

노란색박스는 하나의 layer 단이고,
분홍색 동그라미는 해당연산을 수행하는 의미가 되고,
concatenate는 해당 값을 연결, copy는 말그대로 복사한다는 의미가된다.
The Core Idea Behind LSTMs
LSTM의 핵심은 아래 나오는 다이어그램 cell의 상태이다. 다이어그램을 수평으로 가로지르는 검은색 선으로 상태를 저장한다.
cell의 상태는 컨베이어 벨트와 비슷한다. 아래와같이 모든 cell들을 약간의 상호작용만하면서 가로지르고 정보 변환없이 흐르게 한다.

LSTM은 gate라고 부르는 구조로 cell의 상태를 변화시킨다.
gates는 선택적으로 정보를 보낸다. Gates는 sigmoid 신경망과 곱하기 연산으로 구성된다.

알다시피 시그모이드의 output값은 0과 1이다.각 값이 의미하는것은
0: 아무것도 흘려보내지 않음
1: 전체 데이터를 흘려보냄
위와같이 스위치 역할을 한다.
LSTM은 cell의 상태를 보호하고 조정하기 위해 이러한 3개의 게이트를 갖는다.
Step-by-Step LSTM Walk Through
하나씩 살펴보자.
첫번째로, LSTM이 어떤정보를 흘려보내 cell의 상태를 조정할지 결정하는지 보자.
이결정은 sigmoid 층의 "forget gate layer"에 의해 결정된다. h(t-1)과 xt 가 input으로 들어가면, output값은 0과 1사이의 값이 나온다. 각 셀의 상태는 C(t-1)로 부르자.

단어 추론 예시로 돌아가서, 현재 cell의 상태는 gender라는 의미를 알고있고 정확한 대명사를 사용할수있다. (She or He)
새로운 주제로 넘어가서 gender 라는 주제를 이제 지우고싶다.
다음단계로 넘어가자.
이제 어떤정보를 cell 상태로 보낼것인지 결정하자. 이건 2가지 파트가 있다.
첫째, Input gate layer라는 시그모이드 계층이 어떤 value를 업데이트할지 정한다.
둘째, tanh계층에서 Ct라는 새로운 후보값을 만들어낸다. 그값은 state에 저장될수있는 값이다.
다음으로 이 두개를 합쳐서 state를 합친다.
다시 단어예시로 돌아가서, 두가지의 gender를 합쳐서 새로운 상태에 저장하고, 과거의 것은 잊어버린다.

이제 C(t-1)상태를 C(t)상태로 만들어보자. 전에 상태는 무엇을 할지 정한 상태였고, 지금은 실제로 값을 지정할 차례다.
우리가 잊기로 한 값을 Ft와 곱하고, i(t)*C(t) 를 추가한다. 이것은 각상태를 토대로 조정된 새로운 후보값이다.
gender예시에서 보면, 실제로 gender라는 의미를 버리고 새로운 정보를 추가하는 작업이다.

마지막으로, output값을 정해야한다. output값은 cell의 상태에 따라 달라진다.
어떤 cell의 상태를 output으로보낼건지 정한 sigmoid함수를 실행한다. 그리고 cell상태를 tanh함수(-1과 1 사이의값이나온다)에 통과시키고, 두개를 곱한다. 그래서 하나의 output값으로 만든다.
단어예시로 돌아가면, 주제를 본이후로, output정보는 동사와 관련이 있고, 다음단어가 올상황이다. 예를들어
주어가 단수 또는 복수면 우리는 동사를 어던형식으로 써야할지 안다. (영어 로 된거 해석하느라 약간말이좀 이상함.)

여기까지가 기본적인 LSTM모델의 예시이고,
다른 여러종류의 LSTM모델들이 있다.
더많은 종류는 참고 사이트를 방문해보자.
http://colah.github.io/posts/2015-08-Understanding-LSTMs/
덧글