오늘은 LSTM에 대해서 알아봅시다. '밑바닥부터 시작하는 딥러닝2' 책을 공부한 내용으로 설명했습니다.

 

http://www.yes24.com/Product/Goods/72173703

 

밑바닥부터 시작하는 딥러닝 2 - YES24

직접 구현하면서 배우는 본격 딥러닝 입문서 이번에는 순환 신경망과 자연어 처리다! 이 책은 『밑바닥부터 시작하는 딥러닝』에서 다루지 못했던 순환 신경망(RNN)을 자연어 처리와 시계열 데

www.yes24.com

 

 

목차는 아래와 같습니다.

 

1. LSTM 이란?

2. LSTM 대략적인 설명

3. LSTM 구현

 


1. LSTM 이란?

 

LSTM은 RNN의 기울기 소실 문제를 방지하는 신경망입니다. RNN의 Hidden Layer에 기억 셀, Input/Output/Forget Gate를 추가한 형태입니다. 

 

LSTM과 RNN의 차이는 [그림 1]로 설명하겠습니다.

 

RNN의 Hidden Layer에는 Hidden State인 Ht-1과 Input인 Xt, 가중치인 Wt로 구성되어 있습니다. 이들은 Hidden Layer 안에서 선형결합과 하이퍼볼릭 탄젠트 함수를 거친 후 Ht를 내보냅니다.

 

하지만 LSTM의 Hidden Layer에는 기억 셀인 Ct-1과 Input/Output/Forget Gate가 있습니다. 기억 셀은 데이터를 LSTM 계층 내에서만 주고받습니다. 즉, LSTM 계층 내에서만 이동하고 다른 계층으로 출력하지는 않습니다. 또한 기억 셀 Ct에는 시각 t에서의 LSTM의 기억이 저장돼 있습니다. 이것은 과거로부터 시각 t까지에 필요한 모든 정보가 저장돼 있다고 가정합니다. 이 기억을 바탕으로 다음 시각의 LSTM에 Hidden State Ht를 출력합니다. 

 

[그림 1] RNN과 LSTM의 차이

 


 

2. LSTM 대략적인 설명

 

지금부터 LSTM의 게이트에서 일어나는 과정을 대략적으로 설명해보겠습니다.

[그림 2] LSTM 구조

 

1) o : Output Gate

 

Output Gate는 다음 Hidden State Ht의 출력을 담당하는 게이트입니다. Output Gate에서 Hidden State Ht-1과 Input Xt를 연산한 것을 tanh(Ct)에 곱합니다. 이를 통해 tanh(Ct)에서 얼만큼의 양을 Ht로 출력시킬지 결정합니다.

 

계산식은 [식 1]과 같습니다. 가중치와 Xt, Ht-1간의 선형결합에 시그모이드 함수를 씌운 형태입니다. [식 2]는 Output Gate 결과에 tanh(Ct)를 곱해 Hidden State Ht로 생성하는 과정입니다.

 

[식 1] Output Gate
[식 2] Hidden State Ht 구하는 방식

 

2) f : Forget Gate

 

Forget Gate는 이전 단계에서의 기억 셀 Ct-1에서 불필요한 기억을 잊게 해주는 게이트입니다. Forget Gate에서 Ht-1과 Xt를 연산한 것을 Ct-1에 곱합니다. 이를 통해 Ct-1에서 얼만큼의 양을 지워서 Ct로 연산할지 결정합니다.

 

계산식은 [식 3]와 같습니다. [식 4]는 Forget Gate 결과에 Ct-1를 곱해 기억 셀 Ct로 생성하는 과정입니다.

 

[식 3] Forget Gate
[식 5] 기억 셀 Ct를 구하는 방식

 

3) g : 기억 셀에 추가하는 새로운 기억

 

새로 기억해야 할 정보를 기억셀에 추가하기 위해 [그림 2]에서와 같이 tanh 노드를 추가합니다. [그림 2]에서 tanh노드와 이전 단계의 기억 셀 Ct-1을 더하면서 기억 셀에 새로운 '정보'가 추가됩니다.

 

계산식은 [식 5]와 같습니다. 이 g가 Ct-1에 더해짐으로써 새로운 기억이 생깁니다.

 

[식 5] 기억 셀에 추가하는 새로운 기억 g 계산

 

4) i  : Input Gate

 

Input Gate는 g의 각 원소가 새로 추가되는 기억으로써의 가치가 얼마나 큰지를 판단합니다. 새 기억 g를 모두 수용하지 않고, 적절히 부분적으로 선택하는 것이 이 게이트의 목표입니다.

 

계산식은 [식 6]과 같습니다.

 

[식 6] Input Gate 

 

앞에서 구한 i, g, f를 이용해서 이전 단계에서의 기억 셀 Ct-1을 Ct로 변환하는 과정은 [식 7]과 같습니다.

 

[식 7] 기억 셀 Ct를 구하는 방식

 

[그림 2] LSTM 구조

 

 

정리하자면, [그림 2]에서 LSTM은 RNN과 다르게 필요한 정보(기억)를 선별해서 저장하는 과정을 거칩니다.

, 이전 단계에서의 기억셀 Ct-1에 f를 적용해 일부 기억을 잊고, g와 i의 곱을 더해 새로운 기억을 추가합니다. 이후 tanh()을 씌우고 o를 적용해 어느 정도의 데이터를 Hidden State Ht로 출력할지 결정합니다.  

 


 

3. LSTM 구현

 

[식 8]은 LSTM에서 수행하는 계산입니다. [식 8]의 위에서 네 개의 수식은 XWx+hWh+b 형태의 아핀 변환입니다. 이것을 하나의 식으로 정리해 계산할 수 있습니다. 그 과정은 [그림 3]과 같습니다. 

 

[식 8] LSTM 수식

 

[그림 3] 각 식의 가중치들을 모아 4개의 식을 단 한번의 아핀 변환으로 계산

 

[그림 3]은 각 식의 가중치들을 모아 4개의 식을 단 한번의 아핀 변환으로 계산해 A 행렬을 구합니다. 이후 Slice를 이용해 활성화 함수를 적용해서 f, g, i, o 를 생성합니다. 이와 같이 계산하면 원래 개별적으로 총 4번을 수행하던 아핀 변환을 1번의 계산으로 끝마칠 수 있습니다. 이것을 반영해 LSTM을 표현하면 [그림 4]와 같습니다.

 

[그림 4] 4개분의 가중치를 모아 아핀 변환을 수행하는 LSTM의 계산 그래프

 

[그림 4]에서와 같이 처음 4개의 아핀 변환을 한 번에 수행합니다. 그리고 Slice 노드를 통해 4개의 결과를 꺼냅니다. Slice는 아핀 변환의 결과를 균등하게 네 조각으로 나눠서 꺼내주는 노드입니다. Slice 다음에는 활성화 함수를 거쳐 계산을 수행해 기억 셀 Ct, Hidden State Ht를 구합니다.  

 

4. LSTM 구현[파이썬]

 

코드는 '밑바닥부터 시작하는 딥러닝2'의 'Common/time_layers.py' 에 있습니다.

https://github.com/oreilly-japan/deep-learning-from-scratch-2/blob/master/common/time_layers.py

 

+ Recent posts