ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • RNN vs LSTM vs GRU
    최신 기술동향/인공지능 (AI) 2020. 8. 1. 10:43
    반응형

    이번 글에서는 시계열분석에 필요한 RNN 계열 모델들을 정리한다. 대표적으로, Recurrent Neural Network (RNN)과 이를 보완하기 위한 Long Short-Term Memory (LSTM), Gated Recurrent Unit (GRU) 모델이 있다.

     

    RNN

    RNN은 이름에 '순환'이라는 Recurrent가 들어감에서 알 수 있듯이, 한 쪽 방향으로 정보가 흘러가는 것이 아니라, Layer에서 순환하는 구조를 갖고 있다. 이는 그림을 통해서 조금 더 알기 쉽게 설명할 수 있다. 이를 위해 다른 Blog [1]에 잘 설명되어 있는 그림을 가져왔다.

    기본적인 RNN 모델

     RNN 모델에서는 여러 개의 input x_t (보통 시계열) 값을 input으로 받아서 h_t라는 output 값을 계산해서 내보냄과 동시에, 관련된 information (e.g., 문맥)을 다음 step의 Cell에게 넘겨준다. 그러면 다음 step에서는 이렇게 받은 information과 해당 step에서 받은 x_t값을 연산해서 다음 h_t를 찾아내는 방식으로 작동한다. 초기에는 RNN이 잘 작동하는 것처럼 보였다. '맥락을 다음 step에 넘겨줌'으로써 자연어처리, 금융 주가예측 등 다양한 시계열 분석이 가능해진 것이다. 하지만, 여기서 한 가지 문제가 생기게 되었다. 

    Step이 길어졌을 때의 문제점

    Step이 길어지게 되었을 때, 예전에 했던 말을 까먹는 문제가 생겼다. h_(t+1)을 예측하기 위해서 x_0나 x_1이 필요하면, 이 information이 전달되어서 prediction에 반영되기가 어렵다는 것이다. 이런 'Long-Term Dependency'를 해결하기 위해 LSTM이라는 모델이 등장한다.

     

    LSTM

    LSTM은 위에서 말했던, 앞의 문맥이 뒤까지 이어지지 못하는 Long-Term Dependency 문제를 해결하기 위해 제안되었다. 실제 논문을 보면 꽤 복잡하고, 수식적으로 정리되어있지만, 그림으로 요약하면 이렇게 된다.

    LSTM의 기본적인 모델

    '해당 정보를 얼마나 까먹고, 얼마나 다음 Step으로 바로 이어줄지 정하는 Gate를 넣는다'는 것이 핵심이다. 그 과정이 가운데 시그마, tanh 등으로 계산되어서 정리되어 있다. 나중에 별도의 글에서 LSTM에 대한 논문을 조금 더 깊게 들여다보도록 하자. 하지만, 이 글은 RNN, LSTM, GRU를 비교하기 위해 쓴 글이기 때문에 여기까지만 설명한다. 여기서 우리에게 희소식은 정확한 LSTM Cell의 구조를 모르더라도 직접 설계하는 것이 아니라, Keras같은 Deep Learning 프레임워크를 사용함으로써 쉽게 불러와서 쓸 수 있다는 점이다.

    Keras LSTM API

    물론 LSTM을 언제 사용하고, 안에 들어가는 parameter들에 대한 정보는 대략적으로 알아야겠지만, 직접 안에 있는 Layer들을 하나 하나 만들 필요는 없기 때문에 관련 내용에 대해서는 살짝 넘어가도록 한다. 정리하면, RNN에서 Time Step이 길어질 경우 문맥 전달률을 높이기 위해 LSTM이 제안되었다는 정도를 알면 될 것 같다.

     

    GRU

    GRU는 LSTM과 비슷한 이유로 만들어졌는데, LSTM을 구성하는 Time-Step의 Cell을 조금 더 간소화한 버전이다. 우리나라의 조경현 교수님이 2014년 내신 논문에 나오는 모델인데, '간소화'한 만큼 정확도 측면에서 크게 밀리지 않으면서 계산속도는 더 빨라졌다고 할 수 있다. 이 또한, Keras를 사용하면 쉽게 불러올 수 있다.

    Keras GRU API

     

    RNN 계열 알고리즘의 구조

     지금까지는 RNN, LSTM, GRU가 어떤 알고리즘인지 알아보았다. 마지막으로는, 이런 알고리즘들을 어떤 구조로 만들고, 어떻게 코드를 짤지 생각해보자. RNN 계열의 구조는 다음과 같이 5가지 정도가 있다. 그 중에 많이 쓰는 것이 Many-to-One, Many-to-Many다. 아래 그림에서 볼 수 있듯이 Many to Many는 문장을 문장으로 번역하는데 쓰이기도 하고, Many to One은 문장을 보고 어떤 문장인지 분류하는데 많이 쓰이기도 한다. 

    RNN 계열 알고리즘의 구조

     여기서 한 가지 짚고 넘어가면 좋을 문제가 있다. 예전에 LSTM으로 이전 주가흐름을 보고 미래의 주가 예측 프로그램을 만들어보려고 하는데, 한 가지 문제가 생겼었다. 4번 째 그림과 5번째 그림 모두 Many to Many 모델이다. 그런데 그냥 return sequence를 True로 설정해서 Many to Many를 구성한다는 글을 보고 했더니, 5번째 그림처럼 모델을 형성해버린다. 그런데, 내가 생각했던 과거의 데이터를 기반으로 미래의 데이터를 예상하는 모델은 4번째 그림이다. 상당히 고민을 많이 했지만, 세상에는 70억 인구가 있고, 나랑 비슷한 고민을 하고 있는 사람들이 많았다. 이와 관련된 solution 들 중 하나를 링크 달아본다.

    https://github.com/keras-team/keras/issues/2403

     

    LSTM many to many mapping problem · Issue #2403 · keras-team/keras

    I want to implement the forth architecture from the left (first many to many): I my case the length of input and outputs aren't equal (I mean that number of blue and red units aren't equal)...

    github.com

     이렇게 RNN, LSTM, GRU를 보면, x_t가 input으로 들어가서 h_t라는 output을 뽑아내고, 다음 step으로 문맥이 전달되는 구조를 이루는 것을 알 수 있다. 그런데, 여기서 조금 더 복잡한 모델을 생각해 볼 수도 있는 것이, h_t로 나온 output을 x_t로 취급해서 다른 RNN 계열 모델에 넣는 방식으로 Layer를 쌓는 방식도 생각해 볼 수 있다. (이럴 땐 return_sequence parameter를 True로 지정한다.) 이렇게 자신에게 맞는 모델을 찾고, 하나씩 Layer를 추가하거나 parameter값들을 바꾸면서, 성능을 향상시킬 수 있다.

    Conclusion

    이번 글에서 소개한 시계열 분석을 위한 모델로 RNN, LSTM, GRU를 소개했다. Cell을 구성하는 구체적인 수식은 대부분 스킵했고, 이 모델이 왜 나왔는지를 중점으로 설명했다. 사실, 이 정도만 알아도, 자신이 원하는 용도에 맞게 '갖다 쓰는' 것에는 문제가 없을 것이라고 생각한다. 물론, 어떤 책이나 블로그를 보더라도, 관련된 내용들을 하나하나 뜯어서 설명해주었고, 이 내용이 몹시 중요하다. 하지만, 관련 수식과 관련된 내용들은 추후에 다루도록 한다. 

    이런 시계열 분석을 5G나 네트워크에 반영한다면, 과거의 Traffic을 기반으로 미래의 Traffic을 예측하여 유동적으로 Bandwidth를 조절할 수도 있으며, 가까운 미래의 Channel State나 RSRP 값을 예측하여 이를 Handover에 이용하거나 Adaptive MCS에 적용하는 방안도 생각해보게 되었다.

     

    Reference

    [1] http://colah.github.io/posts/2015-08-Understanding-LSTMs/

     

    Understanding LSTM Networks -- colah's blog

    Posted on August 27, 2015 Humans don’t start their thinking from scratch every second. As you read this essay, you understand each word based on your understanding of previous words. You don’t throw everything away and start thinking

    colah.github.io

    [2] https://keras.io/ko/layers/recurrent/#lstm

     

    Recurrent Layers - Keras Documentation

    [source] RNN keras.layers.RNN(cell, return_sequences=False, return_state=False, go_backwards=False, stateful=False, unroll=False) 순환 레이어의 베이스 클래스. 인수 cell: 순환 신경망 셀 인스턴스. 순환 신경망 셀은 다음의 요

    keras.io

     

    반응형

    댓글

Designed by Tistory.