본문 바로가기
Coursera 강의/Deep Learning

Recurrent Neural Networks 2 (GRU, LSTM, BRNN)

by 별준 2020. 12. 21.
해당 내용은 Coursera의 딥러닝 특화과정(Deep Learning Specialization)의 다섯 번째 강의 Recurrent Neural Network를 듣고 정리한 내용입니다. (Week 1)

 

[Gated Recurrent Unit(GRU)]

앞서 Basic RNN이 어떻게 동작하는지 살펴보았고, 이번에는 GRU라는 조금 더 긴 시퀀스를 잘 캡처(장기의존성 문제)하고, Vanishing Gradient 문제를 해소할 수 있는 GRU에 대해서 살펴보도록 하자. 

GRU는 다음에 나오는 LSTM과 유사하지만, 조금 더 간략한 구조를 가지고 있다.

GRU를 간단하게 표현하면 위와 같다. 여기서 새롭게 나타나는 cmemory cell을 의미하며 이전 정보들이 저장되는 공간이다. 이전 정보가 \(c^{<t-1>} = a^{<t-1>}\)를 통해 전달되고, 이전 정보와 현재 input \(x^{<t>}\)와 결합하여 다음 time step으로 전달된다.

즉, 이전 예시처럼 문장 앞쪽의 단수/복수 정보가 뒤쪽까지 전달되어서 'was'를 예측하는데 영향을 끼칠 수 있게 된다.

 

여기서 크게 두 가지 연산이 존재하는데, 우선 이전 정보와 현재 입력을 통해서 \(\tilde{c}^{<t>}\)를 연산한다.

\[\tilde{c}^{<t>} = tanh(W_c[c^{<t-1>}, x^{<t>}] + b_c)\]

이 연산은 현재 time step에서 다음 time step으로 전달할 정보들의 후보군을 업데이트하는 것이다. 

그리고 Update gate \(\Gamma_u\)를 통해서 어떤 정보를 업데이트할지 결정하게 되는데, 아래와 같이 계산된다.

\[\Gamma_u = \sigma(W_u[c^{<t-1>}, x^{<t>}] + b_u)\]

그리고 최종적으로 다음 time step으로 전달될 \(c^{<t>}\)는 다음과 같이 계산된다.

\[c^{<t>} = \Gamma_u \ast \tilde{c}^{<t>} + (1 - \Gamma_u) \ast c^{<t-1>}\]

즉, 현재 time step에서 업데이트할 후보군과 이전 기억 정보들의 가중치합으로 계산된다. 여기서 Gate는 어떤 정보를 더 포함시킬지 결정하는 역할을 하게 되는 것이다. \(\ast\)는 element-wise 곱을 의미한다.

 

추후에 LSTM에서 배우겠지만, LSTM의 Forget gate와 Input gate를 합쳐놓은 것과 유사하다.

 

Full GRU에서는 Update gate 외에도 Reset Gate가 존재하며, 이전의 정보를 적당히 리셋시키는 목적으로 sigmoid 함수를 출력으로 사용해 0 ~ 1사이의 값을 이전 정보에 곱해주게 된다.

 

Full GRU는 다음과 같은 구조를 갖는다. 여기서 h는 c=a를 의미한다.

 

[Long Short Term Memory(LSTM)]

LSTM은 GRU보다 일반적으로 많이 사용되는 장시간 단기 메모리 Unit이다.

GRU보다 조금 더 복잡한데, 우선 이전 time step에서 전달받는 input이 \(c^{<t-1>}, a^{<t-1>}\)로 추가된다.

그리고 Forget gate, Update gate, Output gate을 통해서 각각의 연산을 수행하고, tanh를 통해서 \(\tilde{c}^{<t>}\)를 연산하는데, 이전 GRU에서 언급했듯이 이것은 현재 time step에서 다음 time step으로 업데이트할 정보들의 후보군을 의미한다.

 

핵심 아이디어는 현재 time step의 정보를 바탕으로 이전 time step의 정보를 얼마나 잊을지 정해주고(Forget gate), 그 결과에 현재 time step의 정보의 일부(Update gate와 \(\tilde{c}^{<t>}\)의 연산결과)를 더해서 다음 time step으로 정보를 전달한다.

 

LSTM은 다음과 같은 과정을 통해서 계산된다.

 

GRU와 LSTM을 비교했을때, 어느 것이 우월하다고 할 수 없고, 강점을 보이는 분야가 조금 다르다. LSTM이 조금 더 먼저 발견되었고, GRU는 비교적 복잡한 LSTM 모델을 단순화한 것이다. 

GRU의 장점은 LSTM에 비해서 훨씬 단순하고, 따라서 훨씬 더 큰 네트워크를 만드는 것이 쉽다. (두 개의 gate만 존재하기 때문에 연산량이 적다.)

LSTM의 다소 모델이 크지만, 3개의 gate가 존재해서, 보다 성능이 좋고 효과적일 수 있다.

 

자세한 내용은 다음 게시글을 참조바랍니다 !

2020/12/21 - [Coursera 강의/Deep Learning] - [실습] Building a RNN step by step(Basic RNN, LSTM)

 

[Bidirectional RNN(BRNN)]

지금까지 RNN의 가장 기본적인 building block들을 살펴보았다. 

추가로 훨씬 더 강력한 모델을 만들 수 있는 두 가지 아이디가 있는데, 하나는 Bidirectional RNN(BRNN)이다.

BRNN은 주어진 시퀀스에서 이전 시점과 이후 시점의 모든 정보를 참조할 수 있다.

다른 하나는 deep RNNs이고 잠시 후에 설명하도록 하겠다.

 

전에 살펴본 사람 이름을 찾는 모델에서의 예시이다. 위의 단방향 RNN 모델이 있을 때, 세번째 단어인 Teddy가 이름인지 아닌지 확인해보기 위해서는 첫번째, 두번째 단어만으로는 충분하지 않다. 즉, 더 많은 정보가 필요하다는 것이다. 

 

이런 경우에 BRNN이 위 문제를 해결할 수 있다.

예를 들어 4개의 입력(4개의 단어로 이루어진 문장)이 있다고 가정해보자.

BRNN은 위와 같은 구성을 가질 수 있는데, 보라색 cell들을 통해서 앞에서부터 정보를 읽어나가고, 초록색 cell들은 역방향으로 입력 정보를 읽어나가게 된다. 그리고 두 cell의 결과를 통해서 예측값을 계산한다. 

따라서 과거와 미래 정보를 모두 참조하여 예측하게 된다.

 

여기서 block cell은 RNN, GRU, LSTM 어느 블록이든 상관없다.

 

이처럼 BRNN을 통해서 전체 시퀀스의 정보들을 참조해서 예측할 수 있지만, 단점은 예측을 하기 전에 전체 데이터 시퀀스가 필요하다는 것이다.

예를 들어, 음성 인식 시스템을 만들어서 연설을 입력받을 때, 연설이 끝날 때까지 기다렸다가 그 연설 데이터를 처리해서 예측할 수 있을 것이다. (실제 음성 인식 시스템은 표준의 BRNN보다 조금 더 복잡한 모듈이다.)

 

[Deep RNNs]

지금까지 본 RNN은 아마 꽤 잘 동작할 것이다. 그러나 조금 더 복잡한 기능을 학습하는 경우에는 RNN을 여러 layer로 쌓아서 더 깊은 모델을 구현할 수 있다.

여기서는 3개의 layer로 쌓았지만, 더 많이 쌓을 수 있다.

댓글