questionet

LSTM, GRU 본문

Deep learning/NLP 모델 설명

LSTM, GRU

orthanc 2021. 2. 25. 00:30

RNN에 이어서 questionet.tistory.com/45

이 페이지는 밑바닥부터 시작하는 딥러닝2권과 다음 강의를 정리, 부연한 것이다
www.youtube.com/watch?v=qKgqrdrf224
www.youtube.com/watch?v=dUzLD91Sj-o&list=PL5-TkQAfAZFbzxjBHtzdVCWE0Zbhomg7r&index=12


LSTM과 GRU 구조를 살펴보기 전에
다음 질문에 대한 답을 먼저 살펴보겠다.

LSTM은 Vanilla RNN의 기울기 소실 문제를 어떻게 해결했는가?


sigmoid나 tanh의 미분값은
0과 1사이에 있기도 하거니와
x가 0에서 멀어질수록 0에 가까워진다

즉 Vanilla RNN의 경우 역전파시
1. 반드시 tanh를 거쳐야만 하고,
2. 모든 계층에 동일한 weight matrix를
   계속해서
 행렬곱을 해줘야 하므로
   기울기 소실, 폭발 문제에 매우 취약하지만

LSTM의 경우 
Cell state의 역전파 흐름에만 국한해서 보면 
기울기 소실 문제가 일어날 우려가 없다.

왜냐면Ct에서 Ct-1로 역전파는

1 아다마르 곱 연산만 있고(행렬곱 연산이 없고)
2 tanh나 sigmod를 통과하지 않기 때문이다.
(이를 바꿔 말해 non-linearities 비선형성을
역전파하지
않는다고 표현한다)
3 또한 각 f, g, i, o 각 게이트에 쓰이는 
weight matrix가 모두 달라
RNN에 비해 위험도가 분산되는 효과를
기대해볼 수 있다.


대신 LSTM에서는
f값이 0에 가까워지면
Ct에서 Ct-1로 역전파시 정보의 손실을 넘어
정보의 파괴가 일어날 잠재적인 위험이 있다.
반면 f값이 1에 가까우면 그럴 위험은 사라진다.


정리하면
LSTM의 cell state 간 연결은
끊김없이 적당한 traffic을 유지하는 고속도로 같은 역할을 한다.
즉 원활하고 효과적인 역전파를 위해 Vanilla RNN에 새로운 루트를 개설한 것이다


참고로


LSTM의 connection between cell states는
Skip-Connection 기법과 일맥상통한다.

Skip connection기법은
residual connection(잔차연결), short-cut 이라고도 하는데

층이 깊어질 때 사용하는 기법이다.

CNN에서는 ResNet에 사용되었고

RNN에서도 층이 깊은 모델을 만들 때 사용된다.
LSTM이 시간방향 기울기 소실에 대응한다면
Skip connection기법은 깊이 방향 기울기 소실에 대응한다

 


LSTM (Ling Short-Term Memory)

위에서 살펴보았듯이 LSTM이 RNN과 다른 가장 큰 특징은

1. Cell state 가 추가되었다는 것과

2. 단순히 이전 시점의 정보를 받아 현재 시점의 은닉상태를 만들어 다음 시점으로 그대로 흘려보내는 게 아니라
   이전 시점의 정보들이 다양한 게이트를 거치게 하여
   불필요한 정보는 잊어버리고, 기억해야할 정보에 가중치를 두어, 다음 시점에 흘려보낼 정보의 전체 양까지
   조절한다는 점이다.

먼저 Cell state를 살펴보자.


Cell state는 Hidden state와 함께 과거로부터 현재 시점까지의 정보를 다음 LSTM계층으로 전달한다.
ht 외에 별도로 Ct를 추가한 이유는
앞서 말했듯, 셀 데이터 Ct가 은닉상태 h와 다르게 LSTM계층 내에서만 흐르게 하기 위해서다.
이 점이 중요하다.


이렇게 함으로써 얻는 이득 중 하나는
처음에 살펴본 기울기 소실 문제에 대응할 수 있는 방법을 모델에 제공한다는 것이다.
구체적으로 C의 입력과 출력이 LSTM계층 내에서 어떤 흐름을 거치는지는
게이트 구조를 통해 더 분명히 알 수 있다. 

다음으로 게이트에 대해 알아보자.

gate의 역할은 LSTM 계층으로 흘러들어오는 정보의 양을 얼마나 흘려 보낼지 조정하는 것이다.

LSTM에는 총 3개의 gate가 있다.
1. forget gate : 이전 시점에서 건네 받은 Cell state (Ct-1) 의 정보를 '얼마나' 잊을지 결정한다.
                         입력데이터 xt와 은닉상태 ht-1을 Affine 변환한 후  
                         각 원소에 시그모이드를 취한 값을  Ct-1에 아다마르 곱 해주게 함으로써
                         모델이 t-1시점의 cell state 원소 중 잊어야 한다고 판단되는 것에는
                         그 위치에 상응하는 시그모이드 값을 0에 가깝게 출력하도록 하고
                         기억해야 한다고 판단되는 원소는 그 위치에 상응하는 시그모이드 값을 1에 가깝게 출력하도록
                         학습시킬 수 있게 된다. 
                         (이 원리는 input gate, output gate에도 동일하게 적용된다)                       


   g :              이건 게이트가 아니다. g가 의미하는 것은 
                     기존 Vanilla RNN에서 이전 시점의 h와 현재 시점의 x를 입력 받아
                      tanh(Wh+Wx+b) 계산을 수행한 값 h에 해당하는 값이다. 
                      즉 이걸 Ct-1에 더해주는 연산의 의미는
                      새로 기억해야할 정보를 Ct-1에 추가해주는 것이다. 
                      tanh(Wh+Wx+b) 를 g라고 표기한 이유는
                      tanh(Wh+Wx+b)를 Vanilla RNN에서처럼 그대로 다음 시점으로 전달하는 게 아니라
                      forget 게이트를 거친 Ct-1과 더해준 다음에야 비로소 hidden state가 되기 때문이다.



2. input gate : Ct-1에 새로운 정보를 '얼마나' 추가할지 결정한다. 방법은
                    입력데이터 xt와 은닉상태 ht-1을 Affine 변환한 후 각 원소에 시그모이드를 취한 값을
                    g에 아다마르곱 해준다.

cell state는 다음과 같이 계산된다.



3. output gate : 위 수식을 통해 업데이트된 셀 정보 Ct를 다음 타임스텝에 전해줄 hidden state로서
                      '얼마나' 출력할지 결정한다. 방법은
                      입력데이터 xt와 은닉상태 ht-1을 Affine 변환한 후 각 원소에 시그모이드를 취한 값을
                      tanh를 씌운 Ct와 아다마르곱 해준다.



각 게이트의 수식을 보면, 각 게이트에 사용된 weight matrix가 다르다는 걸 알 수 있다.


즉, LSTM에는 총 4개분의 가중치 행렬 (4H)이 필요하다.

4H는 이전 시점의 은닉상태와 현재 시점의 입력값과 각각 곱해지고 그 결과에 각각의 편향값이 더해진다.

이 계산결과를 4등분으로 Slice하여 각 게이트로 보내는 것이다.

지금까지 내용을 다시 정리해보자.

1. 게이트의 출력값이 되는 f, i, o는 위 수식에 시그모이드를 적용하고, g에는 tanh를 씌우는 것을 알 수 있다. 

2. 그리고 게이트의 각 출력값들은 행렬곱이 아니라 아다마르 곱(원소별 곱)으로 연산된다.



이 두 사실이 의미하는 게 무엇일까?

우선 시그모이드 함수는 1에서 0 사이의 값의 범위로 값을 출력한다. 

때문에 f가 1에 가까운 수로 출력되어 Ct-1과 아다마르 곱 연산이 이루어지게 되면
Ct-1의 정보의 양이 잊혀지는 정도가 아주 적어지게 된다고 볼 수 있다.

반면 i의 경우엔 1에 가까운 수로 출력되어 g와 아다마르 곱 연산이 되면
새로 추가 되는 정보의 양이 손실 없이 거의 그대로 Ct-1에 전달된다고 볼 수 있게 된다.

또한 o의 경우, 만약 1이 아닌 0에 가까운 수로 출력된다면 
다음 시점으로 전달되는 h의 양이 매우 적어진다는 걸 의미하게 된다.

시그모이드를 통과시킨 행렬을 Ct-1에 아다마르곱 해준다는 건 게이트를 얼마나 열고 닫느냐를 비유하는 의미도 되지만
행렬곱을 하지 않고 아다마르 곱을 함으로써 기울기 소실 또는 폭발의 위험을 낮추는 효과도 기대할 수 있다

왜 이런 기대를 할 수 있는지는 questionet.tistory.com/45에서 기울기 소실, 폭발이 일어나는 이유 참고

더불어 가중치 행렬이 각각 서로 다른 값을 가지는 4개분으로 늘어났기 때문에
매 시각 다른 게이트 값을 이용해 아다마르 곱이 되므로 그 위험은 더 낮아지게 된다.

한편 tanh 함수를 통과하는 값은


t-1 시점의 은닉상태와 t시점에 입력된 입력값을 선형변환한 값
그리고 새로 갱신된 Ct 

이렇게 두 개다.

즉 '정보'는 1 ~ -1 사이의 값으로 출력되고
출력된 정보는 
게이트를 거쳐 1 ~ 0 사이 값으로 조정되는 것이다.

최종 출력되는 Ct 와 ht의 수식은 다음과 같다.

지금까지
Cell state, 4개의 gate, 아다마르곱, 4개분의 서로 다른 가중치행렬
LSTM의 순전파에서 이것들이 의미하는 것을 살펴보았다.

LSTM의 역전파 과정을 따라가보면 그 의미는 더욱 분명해진다.

 

GRU (Gated Recurrent Unit)

GRU는 LSTM처럼 게이트를 추가한 RNN이라는 점에서는 같지만
LSTM을 더 단순하게 만든 아키텍쳐로

데이터 셋이 작거나, 모델 설계시 반복 시도를 많이 해야할 경우
LSTM 보다 적합한 모델일 수 있다.

LSTM에 있던 기억셀 c 가 사라지고, 내부의 게이트도 하나 줄어 구성이 보다 simple해졌다.
걷보기엔 Vanilla RNN과 비슷해보이나
내부는 LSTM과 유사하다.

GRU 계층에서 각 노드의 역할은 다음과 같다. 

r (reset gate)           :  과거의 은닉상태 ht-1를 얼마나 무시할지 조정한다.
                              r이 0에 가까운 수로 출력되면 과거의 은닉상태는 거의 다 무시되고
                              새로운 은닉상태 h^Xt만으로 결정된다.

z (update gate)       :  은닉상태를 갱신한다.
                             LSTM의 forget gate와 input gate 기능을 혼자서 수행한다.
                             z가 1에 가까운 수로 출력되면 (1-z) x ht-1 값은 작아지고
                             이는 이전 시점의 은닉상태에서 지워지는 정보가 많다는 걸 의미한다.
                             동시에 새로 추가되는 정보의 비중은 높아진다. z x h^

h^ (새로운 은닉상태)


GRU는 LSTM의 output게이트에 해당하는 기능을 빼고
input 게이트와 forget게이트를 하나로 합침으로써
LSTM의 기존 행렬곱 연산 중 일부를 아다마르 곱으로 바꿈과 동시에
모델이 학습해야 하는 매개변수의 숫자(가중치 행렬의 수)를 줄여
결과적으로 계산 비용을 낮추는 효과를 낸다.


이어지는 내용은 seq2seq with Attention에서 계속 questionet.tistory.com/46

'Deep learning > NLP 모델 설명' 카테고리의 다른 글

RWKV,  (0) 2024.01.31
Attention, self-attention, transformer  (1) 2021.03.14
Recurrent Neural Network (RNN)  (0) 2021.03.13
WordNet  (0) 2021.02.25
Comments