본문 바로가기
컴퓨터과학

RNN 과 LSTM의 개념과 알고리즘

by 자유로운시간 2022. 5. 29.
반응형

RNN은 순환 경로를 포함하며 과거의 정보를 기억할 수 있습니다. 구조가 단순하여 구현도 쉽게 할 수 있죠. 하지만 안타깝게도 성능이 좋지 못합니다. 그 원인은 (많은 경우) 시계열 데이터에서 시간상으로 멀리 떨어진, 장기 의존 관계를 잘 학습할 수 없다는 데 있습니다.

요즘에는 단순한 RNN 대신 LSTM이나 GRU라는 계층이 주로 쓰입니다. 실제로 그냥 'RNN'이라고 하면 일반적인 RNN이 아니라 LSTM을 가리키는 경우도 흔합니다.  그럴 땐 오히려 명시적으로 '기본(적인) RNN'이라 하기도 합니다.

LSTM이나 GRU에는 '게이트'라는 구조가 더해져 있는데, 이 게이트 덕분에 시계열 데이터의 장기 의존 관계를 학습할 수 있습니다. 여기서는 기본 RNN의 문제점을 알아보고, 이를 대신하는 계층으로써 LSTM과 GRU와 같은 '게이트가 추가된 RNN'을 소개합니다. 특히 LSTM의 구조를 시간을 들여 차분히 살펴보고, 이 구조가 '장기 기억'을 가능하게 하는 메커니즘을 이해해봅니다. 그리고 LSTM을 사용해 언어 모델을 만들어, 실제로 데이터를 잘 학습하는 모습도 보여드리겠습니다.

 

RNN의 문제점

RNN은 시계열 데이터의 장기 의존 관계를 학습하기 어렵습니다. 그 원인은 BPTT에서 기울기 소실 혹은 기울기 폭발이 일어나기 때문입니다.

 

RNN

RNN 계층은 순환 경로를 갖고 있습니다. RNN 계층의 은닉 상태는 과거 정보를 저장합니다. RNN의 특징은 바로 이전 시각의 은닉 상태를 이용한다는 점입니다. 이렇게 해서 과거 정보를 계승할 수 있게 되죠. 이때 RNN 계층이 수행하는 처리를 계산 그래프로 나타내면 아래 그림과 같이 됩니다.

 

 

 

위의 그림처럼 RNN 계층의 순전파에서 수행하는 계산은 행렬의 곱과 합, 그리고 활성화 함수인 tanh 함수에 의한 변환으로 구성됩니다. 이상이 앞 장에서 본 RNN 계층입니다. 이어서 이 RNN 계층이 안고 있는 문제, 즉 장기 기억에 취약하다는 문제를 살펴보겠습니다.





기울기 소실 또는 기울기 폭발

언어 모델은 주어진 단어들을 기초로 다음에 출현할 단어를 예측하는 일을 합니다. RNN 계층이 과거 방향으로 '의미 있는 기울기'를 전달함으로써 시간 방향의 의존관계를 학습할 수 있죠. 이때 기울기는 (원래대로라면) 학습해야 할 의미가 있는 정보가 들어 있고, 그것을 과거로 전달함으로써 장기 의존 관계를 학습합니다. 하지만 만약 이 기울기가 중간에 사그라지면 (거의 아무런 정보도 남지 않게 되면) 가중치 매개변수는 전혀 갱신되지 않게 됩니다. 즉, 장기 의존 관계를 학습할 수 없게 됩니다. 그래서 단순한 RNN 계층에서는 시간을 거슬러 올라갈수록 기울기가 작아지거나 (기울기 소실) 혹은 커질 수 있으며 (기울기 폭발), 대부분 둘 중 하나의 운명을 걷게 됩니다.



기울기 소실과 LSTM

RNN 학습에서는 기울기 소실도 큰 문제입니다. 그리고 이 문제를 해결하려면 RNN 계층의 아키텍처를 근본부터 뜯어고쳐야 합니다. 여기서 등장하는 것이, '게이트가 추가된 RNN'입니다. 게이트가 추가된 RNN으로는 많은 아키텍처(신경망 구성)가 제안되어 있으며, 그 대표 격으로 LSTM과 GRU가 있습니다. LSTM에 집중하여 그 구조를 차분히 살펴보면서 LSTM이 기울기 소실을 일으키지 않는다는 (혹은 일으키기 어렵게 한다는) 사실을 확인해보겠습니다.





LSTM의 인터페이스

LSTM 계층의 인터페이스는 c라는 경로가 있는데 이 c를 기억 셀(혹은 단순히 '셀')이라 하며, LSTM 전용의 기억 메커니즘입니다. 기억 셀의 특징은 데이터를 자기 자신으로만 (LSTM 계층 내에서만) 주고받는다는 것입니다. 즉, LSTM 계층 내에서만 완결되고, 다른 계층으로는 출력하지 않습니다. 반면, LSTM의 은닉 상태 h는 RNN 계층과 마찬가지로 다른 계층으로 (위쪽으로) 출력됩니다.



LSTM 계층 살펴보기

LSTM에는 기억 셀 c가 있습니다. 이 c에는 시각 t에서의 LSTM의 기억이 저장돼 있는데, 과거로부터 시각 t까지에 필요한 모든 정보가 저장돼 있다고 가정합니다. 그리고 필요한 정보를 모두 간직한 이 기억을 바탕으로, 외부 계층에(그리고 다음 시각의 LSTM에) 은닉 상태 h를 출력합니다. 이때 출력하는 h는 기억 셀의 값을 tanh 함수로 변환한 값입니다.

여기서 기억 셀 c는 3개의 입력으로부터 '어떤 계산'을 수행하여 구할 수 있습니다. ('어떤 계산'의 자세한 내용은 곧 설명합니다). 여기서 핵심은 갱신된 c를 사용해 은닉 상태 h를 계산한다는 것입니다.

 

여기서 '게이트'라는 기능에 대해 간단히 살펴보겠습니다. 게이트란 우리말로는 '문'을 의미하는 단어입니다. 문은 열거나 닫을 수 있듯이, 게이트는 데이터의 흐름을 제어합니다. LSTM에서 사용하는 게이트는 '열기/닫기'뿐 아니라, 어느 정도 열지를 조절할 수 있습니다. 다시 말해 다음 단계로 흘려보낼 물의 양을 제어합니다. '어느 정도'를 '열림 상태(openness)'라 부르며, 0.7이나 0.2처럼 제어할 수 있습니다. 게이트의 열림 상태는 0.0~1.0 사이의 실수로 나타납니다. 그리고 그 값이 다음으로 흐르는 물의 양을 결정합니다. 여기서 중요한 것은 '게이트를 얼마나 열까'라는 것도 데이터로부터 (자동으로) 학습한다는 점입니다.

 

output 게이트

tanh의 각 원소에 대해 '그것이 다음 시각의 은닉 상태에 얼마나 중요한가'를 조정하는 것은 다음 은닉 상태 h의 출력을 담당하는 것이므로 이러한 것을 output 게이트(출력 데이트)라고 합니다.

반응형