LSTM은 기존 RNN의 긴 기간의 의존성 문제에 약한 단점을 보완한 RNN의 한 기법입니다. 간단한 구조인 RNN과 달리 꽤 복잡한 구조로 이루어져 있습니다. 구조가 어려운 만큼 이해하기 어려워 rastgo’s blog의 게시물 RNN과 LSTM을 이해해보자! · ratsgo's blog 을 따라 적어보며 이해하고자 했습니다.
기본 구조
Cell State
LSTM은 위의 그림의 직선처럼 Cell state라는 긴 통로가 존재합니다. 이 Cell state를 활용하여 이전 단계의 정보를 이어가게 됩니다. 이러한 Cell state에 정보를 더하거나 잊게 하는 방법이 존재하는데 이를 Gate를 통해 제어하게 됩니다. 그림의 Cell state 상의 X,+ 두 기호가 각 게이트를 말하며 각각 Forget Gate, Input Gate라고 합니다. 추가로 아래의 h는 기존 RNN에서 볼 수 있는 Hidden State를 말하며, 이를 업데이트하는 게이트도 하나 존재함을 알 수 있습니다.
Forget Gate
LSTM에 현재 시점(t)의 데이터 x와 이전 시점(t-1)의 Hidden State h가 들어오면, 우선 이 데이터들에 각 가중치를 곱한 후 시그모이드 함수를 적용합니다. 시그모이드를 적용하면 그 출력값이 0에서 1사이로 이 세기에 따라 이전의 정보를 잊어버릴지, 얼마나 기억할지를 정하게 됩니다. 즉 요약하면 Forget Gate는 이전 정보를 얼마나 잊을지에 대한 게이트입니다.
Input Gate
Forget Gate가 이전 정보를 얼마나 잊을지에 대한 게이트라면, Input Gate는 현재의 정보를 기억하기 위한 게이트입니다. Input Gate는 𝑖𝑡⊙𝑔𝑡 로 표현할 수 있습니다. ⊙는 요소별 곱셈을 말합니다. 𝑖𝑡는 시그모이드를 적용했기에 0 1 사이의 값이며 이를 강도로, 𝑔𝑡는 하이퍼볼릭탄젠트를 적용했기에 -1 1 사이의 값을 가지며 이를 방향으로 이해할 수 있다고 합니다.
Cell State Update
이 시점에서의 Cell State는 두 개의 게이트 Forget Gate, Input Gate를 지났기 때문에 위와 같이 정리할 수 있습니다. 즉 현재 시점의 Ct는 과거의 Ct-1를 얼마나 잊을지(Forget Gate) + 현재 정보를 얼마나 가져올지(Input Gate)로 정리됩니다.
Output Gate(Hidden State Update)
Cell state를 업데이트하는 게이트는 모두 끝났습니다. 하지만 무엇을 이후 Hidden State에 output하는지에 대한 게이트가 하나 남아있습니다. 이 게이트는 input된 데이터에 시그모이드를 적용하고, 현재 시점의 Cell state에 하이퍼볼릭탄젠트를 적용하여 이를 요소별로 곱하여 output합니다.
순전파
여기서 𝐻𝑡를 행 기준으로 4등분해 𝑖,𝑓,𝑜,𝑔 각각에 해당하는 활성함수를 적용하는 방식으로 계산합니다. 사실 위의 Gate들을 보면 ht-1, xt 등의 왼쪽 데이터를 시그모이드나 하이퍼볼릭탄젠트를 적용하는 것을 볼 수 있는데, 그렇기 때문에 여기서는 활성화 함수 적용 전을 Ht라는 하나의 덩어리로 간단히 정리한 것으로 보입니다.
역전파
역전파 과정입니다. 차차 이해해보도록 합시다.
유형 및 실습
지금까지 LSTM이 무엇인지에 대해 확인할 수 있었습니다. 이제 LSTM을 어떻게 사용하는지, 다양한 유형들에 대해 알아보도록 하겠습니다. 자세한 내용 및 실습 코드는 하단 깃헙 페이지에 있습니다. 여기서는 어떤것이 하단 깃헙 페이지에 존재하는지 요약만 하도록 하겠습니다.
LSTM, RNN 등은 many-to-one, many-to-many 등에 따라 나뉩니다. 단순히 들어가는 데이터, 나가는 데이터의 수에 따라 유형이 나뉘어져 있다고 보면 이해하기 편합니다.
또한 단방향 LSTM, 양방향 LSTM등으로 그 구조가 나뉘기도 합니다. 양방향은 하나는 처음부터, 다른 하나의 분류기는 역으로 학습하는 방법이라고 간단히 이해를 하겠습니다.
또, 하나의 LSTM만 사용하는 것이 아닌 여러 개의 LSTM을 적층하는 것에 따라서도 코드 구현이 달라지게 됩니다. 아니면 이 LSTM들을 인코더, 디코더와 같이 활용하여 input n개를 output m개(n != m)으로 다르게 구성할 수도 있습니다. 이러한 내용들을 하단의 깃헙 페이지에 예제 코드와 함께 정리했습니다.
daily_tensorflow/LSTM_유형_실습.ipynb at main · saeu5407/daily_tensorflow
참고 및 출처
참고 블로그 : RNN과 LSTM을 이해해보자! · ratsgo's blog
실습 링크 : daily_tensorflow/LSTM_유형_실습.ipynb at main · saeu5407/daily_tensorflow