욱이의 냉철한 공부

[RNN 개념정리] RNN/LSTM 기본개념 본문

데이터과학/개념 : CNN(OD), RNN

[RNN 개념정리] RNN/LSTM 기본개념

냉철한 욱 2020. 6. 22. 22:10

 

 

LSTM(model)을 이해하기 전에 Sequence(data 특징)와 RNN(model)을 차례로 애해하는 것이 우선입니다.

참고로 Sequence data를 다루는 model을 Sequence model이라고 합니다.

이 Sequence model에 대표적으로 RNN, GRU, LSTM이라는 model들이 있습니다.

여기서 LSTM은 RNN보다 더 좋은 장점이 있기 때문에 많이 사용됩니다.

물론 어떤 문제에 접근하냐에 따라, LSTM, GRU, RNN 사용이 결정되기도 합니다. 무조건 LSTM을 사용한다고 좋은 성능을 가져오는 것은 아닙니다. 예를 들어 간단한 문제에 LSTM을 사용하면 역효과가 생길 수 있고, 시간적 순서의 영향이 약한 문제에는 LSTM의 효과가 없을 수 있습니다. 음..날씨, 주식예측은 최근일 수록 영향이 큰 데이터들이지만 감성분석, 이미지캡션 등은 최근이라는 영향이 적으니 LSTM의 효과가 적을 수도 있습니다. 감성분석에서는 시간적 순서보다 부정적이거나 긍정적인 단어의 빈도수를 찾는 것이 더 중요한거니깐요.

다시 본론으로 돌아와서 RNN과 LSTM이 어떻게 다른지 차례로 봐보겠습니다. 그 전에 Sequence 가 무엇인지 이해해보기로 합시다.

 


 

 

1. Sequence(시퀀스)와 Sequenc model(시퀀스 모델)

1) Sequence(시퀀스)

말 그대로 순서가 있는 data를 시퀀스라고 합니다.

예를 들어 Text 에는 문맥이라는 순서가 있고, 시계열 데이터에는 시간이라는 순서가 있습니다.

이와 마찬가지로 영상, 음성 등도 전부 순서와 함께 흘러가는 데이터입니다.

2) Sequence model

말 그대로 Sequence data를 다루는 모델입니다.

순서가 있는 Sequence data에서 특징들을 추출하여 여러가지 문제를 해결하고 예측합니다.

대표적으로 RNN, GRU, LSTM등이 있습니다.

3) 기존과 차이점

기존에는 모든 Inputs들이 독립적이라고 가정했다. 

하지만 이전 정보가 의미가 있는 순서적 정보에는 달라진다. 

순차적으로 과거 정보를 반영할 수 있는 모델이 필요하다. 

그래서 나온 것이 Sequence model이다. 

 

 

4) Sequence model 종류

1. one to many

- Image Captioning : image -> sequence of words

이미지 데이터에서 설명글을 출력할 수 있습니다.

- language model

2. many to one (내가 주로 연구해야 할 부분)

- Sentiment Classification : sequence of words -> sentiment

텍스트에서 감정이 긍정적이냐 부정적이냐 분류하기.

- 시계열 예측

어떤 지역의 최근 날씨가 주어졌을 때 향후 날씨 예측.

 

3. many to many (encoder -> decoder)

- Machine Translation : sequence of words -> sequence of words

영어문장을 한글어로 변환하기.

4. many to many

- Name entity recognition (개체명 인식)

TEXT에서 언급된 사람, 회사, 장소 등의 개체를 인식하여 출력.

- Video classification on frame level

영상 프레임별로 예측, 현재의 프레임과 더블어 전의 프레임 모두들을 고려한 출력.

 


 

 

2. Sequenc model(시퀀스 모델)로 사용할 수 있는 Recurrent Neural Network

1) RNN의 과정

- input

우선 시퀀스 데이터 즉 정보는 벡터로 표현되어 model에 input됩니다.

(가령 TEXT인 경우는 벡터로 표현하기 위해 Word embedding이라는 작업을 합니다.)

- state

input인 벡터(가공된 정보)는 순서(Timestep)에 따라 순환신경망의 상태(State, 초록색 상자)에 저장됩니다.

이 상태(state)는 함수로 변형될 수 있습니다.

즉 함수(f)는 파라미터 W(가중치)와 이전 상태(old state), input로 구성되어 있습니다.

- update

그리고 W가 튜닝되면서 계속 발전(Update)해나갑니다.

- output

그리하여 매 Timestep마다 새로운 인풋이 들어오면서 다른 반응 결과를 출력합니다.

이를 통해 다른 Timestep에서 다른 예측을 하는 것을 원하게 됩니다.

 

2) RNN 특이사항

- 매 time step마다 동일한 funtion과 동일한 parameters 사용되어야 합니다.

=> input, output size에 영향을 받지 않고, 무관하게 적용가능하게 되어집니다.

3) RNN의 state 함수

* h : hiden layer, x : 입력, y : 출력

X(t) : 현재 입력 벡터 값

W(xh) : 입력(x)에서 hiden layer사이의 파라미터

h(t-1) : 이전 timestep hiden layer의 상태

W(hh) : 현재 hiden layer와 직전의hiden layer 사이에서의 파라미터

h(t) : 현재 timestep hiden layer의 상태

W(hy) : hiden layer에서 출력(y) 사이의 파라미터

* 차원 예시 : 경우에 따라 달라짐.

X(t) : (m X 1)

W(xh) : (D X m)

h(t-1) : (D X 1)

W(hh) : (D X D)

W(hh) * h(t-1) + W(xh) * X(t) => (D X D) X (D X 1) + (D X m) X (m X 1) = (D X 1)

 

4) RNN의 문제

- 개념 이해

RNN은 출력과 먼 위치에 있는 정보를 기억할 수 없다. 

즉 RNN은 최근의 정보일수록 더 예측에 반영할 수 있게 설계되어 있다.  

결국 RNN은 Long-Term Dependencies가 없다. 

 

Long-Term Dependencies가 있다면 아래 예시를 해결할 수 있을 것이다.

예를 들어 "I gerw up in France, I speak fluent French"

French를 예측하기 위해서는 훨씬 이전 단어들로부터 Context를 파악해야 한다.

이를 위해서는 Long-Term Dependencies가 있어야 한다. 

 

 

- 수식적 이해

RNN은 입력정보와 그 입력정보를 사용하려는 출력지점 거리가 멀 경우 역전파 할 시 기울기가 점차 줄어지든가 커져서 학습능력이 저하됩니다.

(역전파시 기울기가 전 층 기울기와 계속 곱하는 연산으로 구해지기 떄문. 즉 출력층의 기울기가 만약 0.9면 입력층 쪽은 0.9 * 0.9 * 0.9 ... 이런 연산이 적용이 됨. )

1.

즉 Larget singular value > 1

Exploding gradients

=> 해결법 : 기울기 클리핑

기울기 한계점을 정해두어서, 만약에 한계점보다 더 크다면 크지않도록 조정하는 것입니다.

2.

즉 Larget singular value < 1

Vanishing Gradients

=> 해결법 : LSTM model

RNN model에서 LSTM model로 변경합니다.

 

 


 

 

3. Recurrent Neural Network을 개선한 Long Short Term Memory

1) Long Short-Term Memory (LSTM)의 의미

오래 전 혹은 최근의 단어들을 기억할 수 있는 아키텍쳐가 LSTM이다.

LSTM은 오래전 정보도 기억할 수 있는 long-term dependencies를 지니고 있다. 

 

2) 구성하는 부분 역할

- Cell state의 역할

정보를 기억(저장)하는 역할이다.

 

- 3개 gate의 역할

정보가 추가되고, 제거되는 것을 조정하는 역할이다. 

 

- Cell state + 3개 gate의 역할

기억도 잊을 것은 잊고, 저장할 것은 저장하도록 한다.

왜냐하면 Cell은 용량이 있다. 

중요한 정보만 기억하는 것이 효율적이다. 

 

3) LSTM의 과정

- input : RNN과 동일하다.

우선 데이터 즉 정보는 벡터로 표현되어 model에 input됩니다.

(가령 TEXT인 경우는 벡터로 표현하기 위해 Word embedding이라는 작업을 합니다.)

- state : RNN과 다릅니다.

무엇이 다르냐? cell state가 추가됩니다.

즉 LSTM의 state는 hiden state와 cell state 총 2개입니다.

input인 벡터(가공된 정보)가 순서(Timestep)에 따라 이전 상태(old hiden state)와 함께 현재 상태(hiden State)에 저장되기 앞서 기억상태(cell state)가 참전하는 처리과정을 겪습니다.

이 처리과정에서는 3개의 gate(i, f, o)가 cell state의 참전(활성화)여부를 결정합니다.

- update : RNN과 동일합니다. (물론 함수가 달라졌으니 역전파 수식은 달라집니다.)

그리고 W가 튜닝되면서 계속 발전(Update)해나갑니다.

- output : RNN과 동일합니다.

그리하여 매 Timestep마다 새로운 인풋이 들어오면서 다른 반응 결과를 출력합니다.

이를 통해 다른 Timestep에서 다른 예측을 하는 것을 원하게 됩니다.

 

4) LSTM의 핵심 : cell state 함수 -> hiden state

- f ⊙ c(t-1)

기존의 정보를 얼마나 잊어버릴 것인가?

f(forget gate)는 과거 정보를 잊기 위한 게이트입니다. 

h(t-1)와 X(t)를 받아서 시그모이드를 취해준 값이 forget gate가 내보내는 값입니다.

출력범위가 0에서 1사이이기 때문에 값이 0에 가까우면 이전 상태의 정보는 거의 잊는 것이고, 1이라면 이전 상태의 정보를 많이 기억하게 됩니다.

 f의 의미는 old cell state얼마나(정도) 포함시켜줄거냐에 대한 여부 의미입니다.

ex) 새로운 것을 설명하는데 이전 정보는 그리 도움되어지지 않는다. ​

 

- i  g

새로운 정보를 얼마나 기억할 것인가?

현재 정보를 기억하기 위한 게이트입니다. 

h(t-1)와 X(t)를 받아서 시그모이드를 취해준 값과, 같은 입력의 tanh를 취해준 값을 product연산하여 input gate를 통해 내보내는 값입니다. i 값의 범위는 0~1이고 g의 범위는 -1~1의 값입니다.

 i의 의미는 현재 cell state 얼마나(정도) 포함시켜줄거냐에 대한 여부 의미입니다.

 g의 의미는 새로운 정보를 의미합니다. -1 ~ 1 사이의 정보를 추출하는 것이며,

이것은 RNN에서 정보를 추출하는 것과 일반적으로 같습니다.

- f ⊙ c(t-1) + i  g

기존의 정보를 얼만큼 잊고, 새로운 정보로 얼만큼 대체 할 것인가?

생존해있는 old cell state(c(t-1))에 얼마만큼 i  g를 더해주겠냐!!!

 

- o ⊙ tanh(c(t))

C(t)는 기억만 하는 것이다. C(t)를 받아서 조정하여, h(t)로 출력해야 의미가 있는 것이다. 

계산된 c(t) 즉 최종 cell state얼마나(정도) hiden state(현재 상태)에 포함시켜줄거냐에 대한 여부 의미

출력에 적합한 스케일을 조정하는 Activation을 사용하든가 혹은

출력을 -1 ~ 1 사이에 벗아나지 않도록 스케일을 조정해야 한다. 

 

 

 

 

 

 

- 마지막 h(hiden state)는 2가지 경로로 움직인다.

1. higher layer or prediction

2. next state

 

​5) 왜 LSTM이 RNN보다 더 좋은가?

RNN에서 y는 쉽게 변합니다.

그런데 LSTM에서는 cell state가 flow하면서

3개의 gate(forget, input, output)이 점진적으로 추가되면서 변화됩니다.

이 변화가 추가되는 것이 +부분입니다. (old cell state가 추가되는 부분)

이 +부분 CNN의 RESNET과 비슷한 원리라고 생각하면 됩니다.

RNN에서는 역전파시 기울기소실문제 발생했습니다.

그런데 LSTM에서는 저 +부분 덕분에 기울기소실문제가 지워집니다.

왜냐하면 +부분이 역전파시 old state방향으로 기울기를 그냥 전달한다.