본문 바로가기
NaverBoost Camp 4기/DL BASIC

[DL Basic] RNN, LSTM, GRU

by 하람 Haram 2023. 3. 9.
728x90

나한테는 정말 애증관계인 RNN(뭔가 중요한 거 같으면서도 맨날 까먹고 정리해야지 정리해야지 했던 부분)

오늘 끝장을 봐보자


RNN

-> RNN은 주어지는 입력자체가 Sequential이다(ex, 음성(말), 비디오, 동작)

 

<입력자체가 Sequential 이면 생기는 문제>

  • 입력의 차원을 알 수 없다(길이가 언제가 끝인지 모른다)
  • Fully connected layer, Conv layer 사용 불가
  • 몇개의 입력이 들어오든 상관없이 동작하는 방법이 필요하다

 

Naive sequence model

과거의 데이터를 전부 고려

이전 데이터들을 전부 고려하여서 다음을 찾아보자

(초기에는 모든 과거를 고려하기 때문에 정보량이 계속 늘어남)

 

 


Autoregressive model

과거 몇개만 보내겠다 (타우만큼의 데이터)

최신 과거로 부터 타우만큼의 최신데이터를 보겠다 (갱신의 개념)

대표적인 예시가 Markov(마르코브 모델이다)

 

 

Markov model(first-order autoregressive model) -> 이건 타우가 1 이라고 정의할 수 있겠지?

Markow assumption 을 가진다 -> 강화학습의 MDP (Markov Decision Process)와 같은 사람임

=> 내가 가정하기의 나의 현재는 과거(바로 전 과거)에만 dependent 하다

=>이 가정이 말도 안되긴 함

ex) 내일 나의 수능 점수는 오늘 내가 공부하는 양에만 dependent하다는 이론 (많은 양의 정보가 사라짐)

=>하지만 joint distribution으로 표현하기 가 쉬워짐

=> Generative 모델에 많이 사용 (추후 정리예정)


 

Latent autoregressive model

 

Markov와 달리 과거를 전부 고려하기 시작

=> Hidden state가 과거의 정보를 summerize

 

 

과거의  많은 정보를 고려하지 못하니깐 중간에 Hidden State가 들어가고

이 Hidden state가 과거의 정보를 요약해주는 역할을 하면 어떠냐

그래서 다음번 time step은 이 hidden state 하나에만 dependent하다

 

즉, 과거들의 정보를 요약해주는 Hidden state를 추가

 

 

 

 

그래서 RNN 이 뭔데???

시간 순으로 풀어보면 Fully connected layer와 유사함 (입력이 굉장히 많은)

  • 자기 자신으로 돌아오는 Recursion 구조와 유사
  • Xt에만 영향을 받는게 아니라 과거도 영향을 받음
  • 문제점 : Short-term dependencies -> long-term을 잡지 못한다, Short term만 잘 잡는다  ->멀리 있는걸 고려하기 힘들다(과거의 데이터가 먼 미래에 영향력이 매우 준다)

이런 구조로 생각할 수 있는데
W와 U 는 weight 이다

 

RNN의 구조

여기서는 activation Function을 non-linear 함수인 tanh를 사용 , h가 output이라 생각

 

여기서 remind :

※ activation function을 비선형 함수로 사용하는 이유 ※
activation function을 사용하지 않으면 선형 함수를 사용하면 신경망의 층을 깊게 쌓는 것에 의미가 없어지기 때문이다. 
예를 들어, 활성화 함수를 h(x)=cx 라고 하면. 3층으로 구성된 네트워크는y(x)=h(h(h(x)))=c∗c∗c∗x=c3∗x이다. 이는 곧 y=ax에서 a=c3인 선형 함수이며 1층으로 구성된 네트워크와 다를 바가 없어진다.

즉,  네트워크는 단순하게  y = w(x) + b라 생각할 수 있는데 합성함수를 아무리 써도 계수와 bias 값만 변하고 
차원이 늘어나지 않기 때문에 activation function을 비선형 함수를 사용하여 이러한 문제를 해결한다

 

 

Activate function이

1. Sigmoid인 경우 :곱할 수록 영향력이 점점 줄어서 Vanishing Gradient 문제가 생김

-> Sigmoid 특징 : 값들을 계속 0~1로 표현 시킴 (값을 계속 줄임) 

 

2. Relu인 경우 : 곱할 수록 숫자가 점점 계속 커져서(곱하기니깐) Exploding Gradient 문제가 생김

-> Relu의 특징 0보다 큰 값을 가지면 그냥 패스

-> 그래서 RNN에서 Relu를 사용하지 않음

 

 

그래서 LSTM이 등장

 


LSTM(Long Short Term Memory)

=> long term Dependency

관련자료

https://towardsdatascience.com/illustrated-guide-to-lstms-and-gru-s-a-step-by-step-explanation-44e9eb85bf21
관련 영상

https://youtu.be/8HyCNIVRbSU

목표 : 이 LSTM이 왜 Long Term Dependency를 잡는데 도움이 될까? 를 대답해보자

 

 

Gate 별로 분석을 하는 것이 효율적이다(3가지의 Gate를 가짐)

1. Input gate
2. Forget gate
3. Output gate

  • Xt  : t번째 input (ex)단어
  • ht : t번째 state의 Output -> 여기서는 hidden state라 칭함
  • Previous cell state : 0~t까지의 정보를 Summary해준 정보(내부에서만 흘러감) => 이게 핵심임
  • Previous hidden state(=Previous output) : 위로도 흘러가고 직진도 함 (t+1번째 LSTM에 Previous hidden state로 들어감)
  • Output : 다음번 단어의 확률을 찾겠다(Output 말고도 다음 hidden state로 보내준다)

그래서 LSTM의 입력으로 들어오는 것은

  • t번째 의 Input
  • 이전의 출력인 Previous hidden state
  • 그리고 밖으로 나가지 않고 지금까지의 과거를 요약한 Previous cell state 이다

즉, cell 단위로 봤을 때 들어오는 거 3개 나가는 거 3개지만 실제로 나가는 것은 1개이다 

 

 

Core idea: Cell state는 지금까지의 정보를 요약하고  내부에서만 흘러간다.

LSTM 출처 https://thlee00.tistory.com/17

 

σ 하나 하나로 Gate를 따지면 된다

 

 

<Forget Gate>

어떤 놈이 필요없는 정보일지 판단 ex) 한글의 "조사"

활성함수 : sigmod (0~1로 만들어줌)

x: 현재의 입력

ht-1 : 이전의 output

ft: 이전에 cell state에서 나오는 정보 중에 어떤 걸 버리고 어떤걸 살릴지를 정해줌

(근거 : 이전에 출력값인 Previous hidden state와 현재입력을 가지고 Weight와 activation을 통과 시켜서 정함)

 

<Input Gate>

현재 정보가 들어오면 무지성으로 cell gate에 올리는 것이 아니라 어떤걸 올릴지 결정

it : 어떤 정보를 올릴지

Ct (C틸다) : 우리가 올려야 하는 정보

-> 따로 학습되는 Neural network를 사용  

-> 현재 정보와 이전 출력값을 가지고 만드는 예비 후보들

-> tanh를 통과 하기 때문에 -1~ 1정규화 된다

tanh 의 값의 범위 (-1 ~ 1)

위의 두개(it, Ct)는 다른 Neural network를 사용한다

 

<Update Gate>

cell state를 업데이트 해준다 

업데이트할 때 이전까지 정보를 요약한 Cell state와 위에서 Input Gate에서 얻은 Cell state를

잘 섞어서 업데이트 해야한다

 

잘 섞는다는 것이 뭘까 (아래의 수식)

우변에 첫번째 항 : 버릴건 버리는 항 (forget gate 나온것 만큼) σ: sigmoid여서 -1 ~ 1로 정규화 된 것 중 음수는 사라짐

우변에 두번째 항 : 받은 것 중에 올릴걸 정하는 항

 

<Output Gate>

update gate에서 갱신된 cell state를 output으로 출력

 

update된 cell state를 그대로 뽑아낼 수도 있음 (이게 GRU)

하지만 LSTM에서는 한번더 조작 (어떤 값을 밖으로 뽑아낼지)

ot : 어떤 값을 밖으로 내보낼지

 

 


 

 

GRU(Gated Recurrent Unit)

뭐하러 Gate를 3개나 씀 !! 2개로 해결해보자

두개의 Gate로 구성

1. Reset Gate
2. Update Gate

LSTM은 cell state를 한번 더 manipulate시켜서  output을 뱉었다면

hidden sate가 output이고 걔가 다음으로 들어감 (즉, hidden state를 Output과 다음 놈으로 보냄 )

-> 이렇게 output Gate를 없앰 

 

LSTM보다 성능이 더 좋을 때가 많음

(Parameter는 적은데 성능이 비슷 = 일반화를 더 잘한다)

 

 

 

요약

Sequential data를 해결하기 위해 RNN이 나왔고
RNN이 가진 단점(long-term dependencies를 못 잡음)을 해결하기 위해 LSTM이 등장하였고
LSTM의 Parameter를 줄이기 위해 Output Gate를 빼고 Reset gate와 Update gate를 둔 GRU가 나오고
GRU의 성능이 parameter가 적음에도  좋은 성능을 보인다

 

 

 

마지막에 밝혀지는 충격적인 사실

RNN, LSTM, GRU 잘 안쓴다고 함 (또르르...)

Transformer가 짱짱맨이라 한다!!

728x90