이 글은 Christopher Olah가 2015년 8월에 쓴 글을 우리 말로 번역한 것이다. Recurrent neural network의 개념을 쉽게 설명했고, 그 중 획기적인 모델인 LSTM을 이론적으로 이해할 수 있도록 좋은 그림과 함께 한 걸음씩 설명하는 멋진 글이라고 생각한다. 기본적으로 neural network에 대해서 이해하고 있어야 이 글의 내용을 원활하게 이해할 수 있으리라 생각한다. 저자의 홈페이지에 neural network에 대한 주옥같은 글들이 많으므로 관심이 있다면 둘러보시길 추천한다.

우리 말로 옮기기 애매한 용어는 영어 단어 그대로 표기했고, 원문에 있는 그림을 그대로 가져다 썼다. 물론 저자의 허락을 받고 번역했다. 오역에 대한 지적이나 내용에 대한 피드백은 항상 감사합니다.



LSTM 이해하기

2015년 8월 27일


Recurrent Neural Network

인간은 모든 생각을 밑바닥부터 시작하지 않는다. 지금 이 글을 읽는 당신도 매 단어를 그 전 단어들을 바탕으로 이해할 것이 분명하다. 지금까지 봐왔던 것들을 모두 집어던지고 아무 것도 모르는 채로 생각하지 않을 것이다. 생각은 계속 나아가는 것이다.

전통적인 neural network이 이렇게 지속되는 생각을 하지 못한다는 것이 큰 단점이다. 예를 들어, 영화의 매 순간 일어나는 사건을 분류하고 싶다고 해보자. 전통적인 neural network는 이전에 일어난 사건을 바탕으로 나중에 일어나는 사건을 생각하지 못한다.

Recurrent neural network (이하 RNN)는 이 문제를 해결하고자 하는 모델이다. RNN은 스스로를 반복하면서 이전 단계에서 얻은 정보가 지속되도록 한다.


Recurrent neural networks have loopsRNN은 스스로 반복한다.


위 그림에서 A는 RNN의 한 덩어리이다. A는 input \(x_t\)를 받아서 \(h_t\)를 내보낸다. A를 둘러싼 반복은 다음 단계에서의 network가 이전 단계의 정보를 받는다는 것을 보여준다.

이러한 RNN의 반복 구조는 혹여 불가사의해 보일 수도 있겠지만, 조금 더 생각해보면 RNN은 기존 neural network와 그렇게 다르지 않다는 것을 알 수 있다. RNN을 하나의 network를 계속 복사해서 순서대로 정보를 전달하는 network라고 생각하는 것이다. 아예 반복을 풀어버리면 좀 더 이해하기 쉬울 것이다.


An unrolled recurrent neural network풀어 헤쳐진 RNN


이렇게 RNN의 체인처럼 이어지는 성질은 곧장 sequence나 list로 이어지는 것을 알려준다. 이런 데이터를 다루기에 최적화된 구조의 neural network인 것이다.

그리고 진짜로 그렇게 사용되고 있다! 지난 몇 년 동안, RNN은 음성 인식, 언어 모델링, 번역, 이미지 주석 생성 등등등등의 다양한 분야에서 굉장한 성공을 거두었다. RNN으로 얻을 수 있는 놀라운 이점에 대한 논의는 Andrej Karpathy의 훌륭한 글인 "The Unreasonable Effectiveness of Recurrent Neural Networks"로 넘기겠다. 어쨌든 RNN은 열라 멋진 놈이다.



긴 의존 기간으로 인한 문제점

RNN의 성공의 열쇠는 "Long Short-Term Memory Network" (이하 LSTM)의 사용이다. LSTM은 RNN의 굉장히 특별한 종류로, 아까 얘기했던 영화를 frame 별로 이해하는 것과 같은 문제들을 단순 RNN보다 정말 훨씬 진짜 잘 해결한다. 기존 RNN도 LSTM만큼 이런 일을 잘 할 수 있다면 RNN은 대단히 유용할텐데, 아쉽게도 RNN은 그 성능이 상황에 따라 그 때 그 때 다르다.

우리가 현재 시점의 뭔가를 얻기 위해서 멀지 않은 최근의 정보만 필요로 할 때도 있다. 예를 들어 이전 단어들을 토대로 다음에 올 단어를 예측하는 언어 모델을 생각해 보자. 만약 우리가 "the clouds are in the sky"에서의 마지막 단어를 맞추고 싶다면, 저 문장 말고는 더 볼 필요도 없다. 마지막 단어는 sky일 것이 분명하다. 이 경우처럼 필요한 정보를 얻기 위한 시간 격차가 크지 않다면, RNN도 지난 정보를 바탕으로 학습할 수 있다.


RNN with short-term dependencies짧은 기간에 의존하는 RNN


하지만 반대로 더 많은 문맥을 필요로 하는 경우도 있다. "I grew up in France... I speak fluent French"라는 문단의 마지막 단어를 맞추고 싶다고 생각해보자. 최근 몇몇 단어를 봤을 때 아마도 언어에 대한 단어가 와야 될 것이라 생각할 수는 있지만, 어떤 나라 언어인지 알기 위해서는 프랑스에 대한 문맥을 훨씬 뒤에서 찾아봐야 한다. 이렇게 되면 필요한 정보를 얻기 위한 시간 격차는 굉장히 커지게 된다.

안타깝게도 이 격차가 늘어날 수록 RNN은 학습하는 정보를 계속 이어나가기 힘들어한다.


RNN with long-term dependencies긴 기간에 의존하는 RNN


이론적으로는 RNN이 이러한 "긴 기간의 의존성(long-term dependencies)"를 완벽하게 다룰 수 있다고 한다. 그리고 단순한 예제에 대해서는 사람이 신중하게 parameter를 골라서 그 문제를 해결할 수도 있다. 하지만 RNN은 실제 문제를 해결하지 못 하는 것이 슬픈 현실이다. 이 사안에 대해 Hochreiter (1991)Bengio 외 (1994)가 심도있게 논의했는데, RNN이 긴 의존 기간의 문제를 어려워하는 꽤나 핵심적인 이유들을 찾아냈다.

고맙게도 LSTM은 문제 없다!



LSTM Networks

LSTM은 RNN의 특별한 한 종류로, 긴 의존 기간을 필요로 하는 학습을 수행할 능력을 갖고 있다. LSTM은 Hochreiter & Schmidhuber (1997)에 의해 소개되었고, 그 후에 여러 추후 연구로 계속 발전하고 유명해졌다. LSTM은 여러 분야의 문제를 굉장히 잘 해결했고, 지금도 널리 사용되고 있다.

LSTM은 긴 의존 기간의 문제를 피하기 위해 명시적으로(explicitly) 설계되었다. 긴 시간 동안의 정보를 기억하는 것은 모델의 기본적인 행동이어야지, 모델이 그것을 배우기 위해서 몸부림치지 않도록 한 것이다!

모든 RNN은 neural network 모듈을 반복시키는 체인과 같은 형태를 하고 있다. 기본적인 RNN에서 이렇게 반복되는 모듈은 굉장히 단순한 구조를 가지고 있다. 예를 들어 tanh layer 한 층을 들 수 있다.


The repeating module in a standard RNN contains a single layerRNN의 반복 모듈이 단 하나의 layer를 갖고 있는 표준적인 모습이다.


LSTM도 똑같이 체인과 같은 구조를 가지고 있지만, 각 반복 모듈은 다른 구조를 갖고 있다. 단순한 neural network layer 한 층 대신에, 4개의 layer가 특별한 방식으로 서로 정보를 주고 받도록 되어 있다.


The repeating module in an LSTM contains four interacting layersLSTM의 반복 모듈에는 4개의 상호작용하는 layer가 들어있다.


뜬금없이 복잡한 구조를 보고 너무 걱정하지 말자. 곧 하나씩 하나씩 LSTM의 구조를 뜯어 볼 것이다. 지금은 앞으로 계속 사용할 기호에 대해 친숙해지도록 정리해보자.



위 그림에서 각 선(line)은 한 노드의 output을 다른 노드의 input으로 vector 전체를 보내는 흐름을 나타낸다. 분홍색 동그라미는 vector 합과 같은 pointwise operation을 나타낸다. 노란색 박스는 학습된 neural network layer다. 합쳐지는 선은 concatenation을 의미하고, 갈라지는 선은 정보를 복사해서 다른 쪽으로 보내는 fork를 의미한다.



LSTM의 핵심 아이디어

LSTM의 핵심은 cell state인데, 모듈 그림에서 수평으로 그어진 윗 선에 해당한다.

Cell state는 컨베이어 벨트와 같아서, 작은 linear interaction만을 적용시키면서 전체 체인을 계속 구동시킨다. 정보가 전혀 바뀌지 않고 그대로 흐르게만 하는 것은 매우 쉽게 할 수 있다.


The cell state of LSTMLSTM의 cell state


LSTM은 cell state에 뭔가를 더하거나 없앨 수 있는 능력이 있는데, 이 능력은 gate라고 불리는 구조에 의해서 조심스럽게 제어된다.

Gate는 정보가 전달될 수 있는 추가적인 방법으로, sigmoid layer와 pointwise 곱셈으로 이루어져 있다.


A gate of LSTMLSTM의 첫 번째 gate


Sigmoid layer는 0과 1 사이의 숫자를 내보내는데, 이 값은 각 컴포넌트가 얼마나 정보를 전달해야 하는지에 대한 척도를 나타낸다. 그 값이 0이라면 "아무 것도 넘기지 말라"가 되고, 값이 1이라면 "모든 것을 넘겨드려라"가 된다.

LSTM은 3개의 gate를 가지고 있고, 이 문들은 cell state를 보호하고 제어한다.



단계별로 두들겨보는 LSTM

LSTM의 첫 단계로는 cell state로부터 어떤 정보를 버릴 것인지를 정하는 것으로, sigmoid layer에 의해 결정된다. 그래서 이 단계의 gate를 "forget gate layer"라고 부른다. 이 단계에서는 \(h_{t-1}\)과 \(x_t\)를 받아서 0과 1 사이의 값을 \(C_{t-1}\)에 보내준다. 그 값이 1이면 "모든 정보를 보존해라"가 되고, 0이면 "죄다 갖다버려라"가 된다.

아까 얘기했던 이전 단어들을 바탕으로 다음 단어를 예측하는 언어 모델 문제로 돌아가보겠다. 여기서 cell state는 현재 주어의 성별 정보를 가지고 있을 수도 있어서 그 성별에 맞는 대명사가 사용되도록 준비하고 있을 수도 있을 것이다. 그런데 새로운 주어가 왔을 때, 우리는 기존 주어의 성별 정보를 생각하고 싶지 않을 것이다.


The LSTM의 forget gate layer


다음 단계는 앞으로 들어오는 새로운 정보 중 어떤 것을 cell state에 저장할 것인지를 정한다. 먼저, "input gate layer"라고 불리는 sigmoid layer가 어떤 값을 업데이트할 지 정한다. 그 다음에 tanh layer가 새로운 후보 값들인 \(\tilde{C}_t\) 라는 vector를 만들고, cell state에 더할 준비를 한다. 이렇게 두 단계에서 나온 정보를 합쳐서 state를 업데이트할 재료를 만들게 된다.

다시 언어 모델의 예제에서, 기존 주어의 성별을 잊어버리기로 했고, 그 대신 새로운 주어의 성별 정보를 cell state에 더하고 싶을 것이다.


The LSTM의 input gate layer


이제 과거 state인 \(C_{t-1}\)를 업데이트해서 새로운 cell state인 \(C_t\)를 만들 것이다. 이미 이전 단계에서 어떤 값을 얼마나 업데이트해야 할 지 다 정해놨으므로 여기서는 그 일을 실천만 하면 된다.

우선 이전 state에 \(f_t\)를 곱해서 가장 첫 단계에서 잊어버리기로 정했던 것들을 진짜로 잊어버린다. 그리고나서 \(i_t * \tilde{C}_t\)를 더한다. 이 더하는 값은 두 번째 단계에서 업데이트하기로 한 값을 얼마나 업데이트할 지 정한 만큼 scale한 값이 된다.

또 다시 언어 모델 문제로 돌아가보면, 이 단계에서 실제로 이전 주어의 성별 정보를 없애고 새로운 정보를 더하게 되는데, 이는 지난 단계들에서 다 정했던 것들을 실천만 하는 단계임을 다시 확인할 수 있다.


The cell state update of LSTMLSTM의 cell state 업데이트


마지막으로 무엇을 output으로 내보낼 지 정하는 일이 남았다. 이 output은 cell state를 바탕으로 필터된 값이 될 것이다. 가장 먼저, sigmoid layer에 input 데이터를 태워서 cell state의 어느 부분을 output으로 내보낼 지를 정한다. 그리고나서 cell state를 tanh layer에 태워서 -1과 1 사이의 값을 받은 뒤에 방금 전에 계산한 sigmoid gate의 output과 곱해준다. 그렇게 하면 우리가 output으로 보내고자 하는 부분만 내보낼 수 있게 된다.

이제 언어 모델 예제를 생각해보면, 우리는 주어를 input으로 받았으므로 주어 다음에 오게 될 예측값인 output으로 적절한 답은 아마도 동사 개념의 무언가가 될 것이다. 예를 들어 최종적인 Output은 앞에서 본 주어가 단수형인지 복수형인지에 따라 그 형태가 달라질 수도 있는 것이다.


The LSTM의 output gate layer



LSTM의 변형 모델들

지금까지 설명한 모델은 꽤나 기본적인 LSTM이었다. 모든 LSTM 모델이 같은 구조를 가지는 것은 아니다. 사실 LSTM을 다루는 거의 모든 논문이 제각각 조금씩 다른 버전을 채용한다. 그 차이점들이 미미하긴 하지만, 그 중 몇 가지를 얘기해보는 것도 좋을 것 같다.

유명한 LSTM의 변형 모델 중 하나로 Gers & Schmidhuber (2000)가 소개한 것이 있는데, "엿보기 구멍(peephole connection)"을 추가한 모델이다. Gate layer들이 cell state를 쳐다보게 만드는 모델이기 때문에 이런 이름이 붙여졌다.


LSTM variant: The peephole엿보기 구멍


위 그림에서는 모든 gate마다 엿보기 구멍을 달아놨는데, 논문마다 어디에는 엿보기 구멍을 달고 어디에는 안 달고 할 수가 있다.

Forget gate와 input gate가 합쳐진 다른 변형 모델도 있다. 무엇을 잊어버릴지와 새로운 정보를 어느 부분에 더할 지를 따로 생각하지 않고, 한 번에 결정을 내리는 것이다. 이 모델은 새로운 정보가 들어가는 자리만 잊어버린다. 그리고 이전 정보를 잊어버리는 부분만 새로운 값을 넣게 된다.


LSTM variant: tied forget-input gatesForget gate와 input gate가 합쳐진 LSTM


LSTM이 조금 더 변형된 것으로 Gated Recurrent Unit (이하 GRU)가 Cho 외 (2014)에서 소개되었다. 이 모델은 forget gate와 input gate를 하나의 "update gate" 합쳤고, cell state와 hidden state를 합쳤고, 또 다른 여러 변경점이 있다. 결과적으로 GRU는 기존 LSTM보다 단순한 구조를 가진다. GRU는 점점 더 유명해지고 있다.



지금까지 소개한 LSTM의 변형 모델들은 극히 일부분일 뿐이다. 하나만 더 언급하자면 Yao 외 (2015)에서 소개한 Depth Gated RNN도 있다. 또한 Koutnik 외 (2015)처럼, LSTM와 다른 방식으로 긴 의존 기간을 해결하는 모델도 있다.

어떤 변형 모델이 가장 좋을까? 각 모델들의 다른 점들이 얼마나 중요하게 작용할까? Greff 외 (2015)에서 유명한 변형 모델들을 잘 비교했는데, 그 결과가 거의 비슷하게 나왔다. Jozefowicz 외 (2015)에서는 만 개가 넘는 RNN 모델을 시험해봤고, 어떤 문제냐에 따라 LSTM보다 좋은 결과를 내는 모델도 있음을 시사했다.



맺음말

RNN을 통해서 멋진 결과들을 내고 있다고 앞서 얘기했는데, 기본적으로 으 업적들은 모두 LSTM이 이룩한 것이다. LSTM은 대부분의 문제에 대해서 RNN보다 좋다!

수식으로 접근하게 되면 LSTM은 꽤나 압도적으로 어려워 보인다. 이 글을 통해서 단계 별로 LSTM을 알아나가는 방식이 도움이 되길 바란다.

LSTM은 RNN으로부터의 굉장히 큰 한 걸음(big step)이었다. 그럼 자연스럽게 또 물어볼 수 있다. 또 다른 big step이 있을까? "Yes! 그것은 attention이야!"라는 것이 연구자들 사이의 공통된 의견이다. Attention의 핵심은 RNN의 매 단계마다 수집하는 정보를 기반으로 더욱 큰 정보의 모음을 볼 수 있도록 하는 것이다. 예를 들어 RNN을 이용해서 이미지의 주석을 달려고 할 때, attention은 내뱉는 모든 단어들 마다 이미지 조각을 수집하는 것이다. 실제로 Xu 외 (2015)에서 정확히 이런 작업을 했다. 이 논문은 attention의 개념을 알기위한 재미있는 시작점이 될 것이다! 이미 attention을 이용해서 굉장히 재미있는 결과들이 많이 나왔고, 좀 더 깊게 파보면 훨씬 많은 결과가 우리를 기다리고 있다...

Attention만이 RNN 연구에서 유일하게 재미난 연구 거리는 아니다. 다른 예를 들자면, Kalchbrenner 외 (2015)의 Grid LSTM 모델도 굉장히 유망해 보인다. Gregor 외 (2015)Chung 외 (2015), Bayer & Osendorfer (2015)처럼 generative model에서 RNN을 사용하는 것도 무척 재밌을 것 같다. 최근 몇 년 동안 RNN은 흥미진진한 발전을 계속하고 있고, 앞으로 발전하는 것들은 더욱 흥미진진할 것이다!



  • JB 2019.07.29 20:42

    LSTM 설명되어있는 블로그중에 가장 LSTM 설명이 잘되있는거같아요!!
    덕분에 많이배우고갑니다.
    감사합니다.

    BlogIcon 동건 2019.08.01 20:47 신고

    원문이 워낙 훌륭한 글이라서 그렇지요!
    저도 댓글 감사합니다 :)