RNN, LSTM 의 대략적인 이해

쓰여진 날: by Creative Commons Licence

Intro

Udacity

데이터를 다루다보면 볼 수 있는 데이터의 상당 수는 순서가 있는 데이터입니다. 음성, 음악은 시간이라는 순서가 있는 데이터이고 로그 기록 역시 시간이라는 순서가 있습니다. 텍스트 역시 문법에 맞춘 순서가 있는 데이터입니다. 알고보면 많은 데이터엔 어떤 순서가 존재합니다. 그런데 보통 튜토리얼에서 주어지는 데이터들에는 이러한 순서가 없는 데이터입니다. 예를들면, 기계학습 공부를 시작하며 많이 다루는 캐글의 집값 예측 데이터는 시계열 데이터가 아닙니다. 개인적으로는 그 동안 이러한 순서가 없는 데이터에 익숙해지다보니, 순서가 있는 데이터는 상당히 낯설게 느껴지기도 합니다.

많은 데이터에서 MLP, CNN은 많은 데이터들에서 놀랄 만한 성능을 보여줍니다. 그러한 데이터는 순서가 없는 정형 데이터, 비정형 데이터들이고 데이터에 순서와 데이터의 값이 아무런 관계가 없는 데이터입니다. 데이터가 순서와 관계가 있다면, 위 모델들은 이런 구조에서 아무런 힘을 쓰지 못합니다. 그리고 RNN은 이러한 데이터를 고려한 모델입니다. (근데 요즘은 CNN으로 자연어도 학습하긴 합니다.)

RNN, Recursive Neural Net

RNN은 Recursive neural network의 줄임말로 recursive만 이해한다면 사실 이해하기에 어렵지 않습니다. 게다가 Recursive는 고등학교에서 수리가형이던 나형이던 신나게 풀어었던 유형의 문제이죠. 가장 쉬운 예로, 피보나치 수열은 recursive squence 입니다. 이전의 값이 다음의 값에 영향을 주는 구조이기 때문입니다.

RNN은 이런 recursive한 구조를 갖는데 단지 이전의 값에 depend 된 게 아닙니다. RNN에서는 간단한 trick으로 이전의 모든 데이터를 파라미터로 받아 다음의 값을 결정합니다. 이전 모든 데이터로부터 다음 값을 예측하는 건 항상 좋은 건 아니지만, 시계열 예측에서는 꽤 좋은 성능을 보입니다. 기존의 Feedforward neural net은 대략 다음의 구조를 가집다. 이전 값으로부터만 다음 값을 예측합니다. 반면, RNN은 다음의 trick을 씁니다. $h _ {n} = f( h _ {2} , s _ {2} )$ 그리고 이 $h$ 는 $s$ 를 구하기 위한 파라미터 입니다. $h$를 풀어서 대입하면 결국 $s _ {t} = f(f(f(f…… s _ {1}), s _ {2}),…..s _ {n-1})$으로 모든 데이터를 파라미터로 사용하게 되죠.

colah's blog

하지만 이전 모든 데이터를 사용하는 RNN의 방법이 항상 좋지는 않습니다. 인간이 책을 읽을 때, 이전 모든 내용을 고려하면서 책을 읽지는 않습니다. 중요한 사건, 인물 만을 기억하면서 읽죠. 잊어야할 것은 잊습니다. “하늘에 떠 있는 ~구름~”에서 구름이라는 단어를 예측하기 위해 더 앞의 문장들은 그리 필요치 않는 것 처럼요. 반면, “나는 한국에서 태어났다. 나는 어제 치킨을 먹었고 영어공부를 했다. 그리고 …. 나는 유창한 ~한국어~를 한다.” 에서 ~한국어~를 예측하기 위해서는 단지 앞의 문장만으로는 정보가 부족합니다. 어떤 경우엔 주변의 데이터로도 예측이 가능하고 어떨 땐, 저 멀리 있는 데이터로부터 예측을 해야합니다. 도대체 이것을 어떻게 하나 싶지만, 이것을 하는게 LSTM 입니다.

colah's blog

LSTM은 말그대로 오래 기억해야 할 건 기억하고, 짧게 기억해야 할 건 기억한다는 아이디입니다. 일단 생김새는 굉장히 복잡해 보이는데 4가지만 알면 LSTM의 작동방식은 어느정도 이해됩니다. LSTM은 Forget gate, Learn gate, Remember gate, Use gate로 이루어져 있고 Long term memory(Long)와 Short term memory(Short)가 각각 forget gate와 learn gate를 지납니다. Long은 망각의 게이트(forget gate)를 지나면서 필요없는 정보를 버립니다. 중요한 것만 남기는 거죠. Short와 새로운 데이터는 learn gate를 지나면서 학습을 합니다. 두 게이트를 지난 후 Remember gate로 가서 합쳐진 후 New Long이 되고 또 Use gate로 가서 New Short가 됩니다. 그리고 각각의 합쳐지고 나눠지는 과정에서 sigmoid, tank, matmul 과 같은 과정이 이루어집니다. 왜 그런 함수로 그런 과정을 이루었느냐고 물으면 대답은 단순히 잘 작동하기 때문이라고 답할 수 있습니다. 물론 다른 구조를 가진 방식이 존재하고 지금도 새로운 방식은 나오고 있습니다. 단지 LSTM과 그 몇몇이 대세일 뿐이죠.

udacity

이 정도의 선지식이 있다면 다음은 좀 더 전문가의 글을 보면서 더 잘 이해할 수 있을 겁니다. 다음의 블로그들을 추천드립니다.

  1. colah's blog 보기
  2. Edwin chen's blog 보기
  3. Deeplearning4j 보기