Deep Learning/NLP

Deep Learning/NLP

[DL] RNN(Recurrent Neural Network) / LSTM(Long short term Memory)

김쪼욘 2020. 6. 9. 00:03

기상, 주가, text 데이터와 같이 시간축을 따라 순서대로 나열되어 있는 데이터를 시퀀스 데이터라고 부른다. 이러한 경우 각 입력 데이터 뿐만아니라 입력 데이터의 순서 또한 또다른 형태의 정보를 가지고 있다. 이런 특성을 고려하여 Recurrent Neural Network는 이전의 본 샘플을 기억하고 이를 기반으로 새로운 이벤트를 처리할 수 있도록 한다.

 


| RNN & Feed Foward 신경망

단순하게 입력층이 은닉층으로 흐른후 출력층으로 전달되는 피드포워드 신경망과 다르게 순환 신경망은 이전 스텝의 출력이 다음 스텝의 입력층으로 흐르게 된다. 

단층 RNN

그림으로 표현하자면 다음과 같다.

 

그림을 보게 되면 A라는 RNN모델에서 은닉층의 각 유닛은 두개의 화살표를 받게 된다.(입력이 두개) 

  1. 입력층으로 부터 받은 입력 : $x_{(t)}$
  2. 같은 은닉층에서 t-1 타임스텝의 활성화 출력 : $h_{a(t-1)}$

만약 위 그림에서 B라는 은닉층이 하다 더 쌓인 다층 RNN구조라면 B라는 이름을 가진 각 은닉 유닛은 다음 두개의 입력을 받게 된다.

  1. 이전층의 현재 타임스텝 활성화 출력 : ${h_a(t)}$
  2. B라는 은닉층의 이전 타임스텝 활성화 출력 ${h_b(t-1)}$

 

| 은닉층 활성화 출력

기본적으로 은닉층의 활성화 출력 계산은 선형 조합으로 계산한다.

  • $W_{xh}$ : 입력과 은닉층 h사이의 가중치 행렬
  • $W_{hh}$ : 순환 에지에 연관된 가중치 행렬 -> 단일 순환신경망에서 각 은닉유닛이 받는 두개 입력의 가중치
  • $W_{hy}$ : 은닉층과 출력층 사이의 가중치 행렬

두 입력값을 활성화 함수에 통과시켜 계산한 활성화 출력 식

$h^{t} = \phi(W_{xh}X^{(t)} + W_{hh}h^{(t-1)}+b_{h})$

 

위식을 이용해 각 은닉 유닛의 활성화 출력을 계산후 출력유닛의 활성화를 다음과 같이 계산한다.

이 식만 보았을 때 은닉층의 은닉 유닛만큼  출력이 생긴다.

$y^{t} = \phi(W_{hy}h^{(t)}+b_{y})$

 

| LSTM(Long Short -Term Memory)

RNN의 전체 손실은 기본적으로 t=1 ~ t =T까지의 각 타임스텝의 모든 손실함수의 합이다. (BPTT : BackPropagation Throuh Time)

따라서 모든 손실은 이전 유닛에 의존하기 때문에 손실함수의 그래디언트에 이전타임 스텝의 곱셈항이 생기게 된다 ( 이부분은 그래디언트에 대해 자세히 공부하고 나중에 작성해 보도록 하겠다.)

 

위와 같은 문제로 인해 은닉유닛의 가중치의 크기에 따라 그래디언트 폭주 또는 그래디언트 소실이 나타나게 된다.

 

  • $|W_{hh}|$ <1 : 긴 시간 의존성을 가지면 곱셈항이 매우 작아짐
  • $|W_{hh}|$ >1 : 긴 시간 의존성을 가지면 곱생항이 매우 커짐 

이러한 문제를 해결하기 위해 각 가중치의 절대값을 1로 유지하는 간단한 방법이 있다. 실전에서는  T-BPTT, LSTM 등을 통해 해결한다.

 

LSTM 구조

LSTM의 구성요소로는 메모리 셀이 있다.( $C(t)$ ) 이 메모리 셀에는 그래디언트의 소실 및 폭주를 막기 위해 가중치의 절대값을 1로 유지하는 순환 에지가 있다.

 

간단하게 셀 상채를 나타내는 $C(t-1)$ 이 $C(t)$로 이동할 때에 입력값에 대한 forget gate를 지난 값을 곱한뒤에 input gate를 지난 값을 더해주는 형태를 가지고 있다.

즉 타임스텝의 셀 상태는 어떤 가중치와도 직접 곱해지지 않고, gate를 지난뒤 변경되어 현재 타임스텝의 셀 상태를 변경 시키는 것이다.

 

LSTM 셀의 세가지 gate

각 gate에는 현재 타임 스텝의 입력과 이전 타임스텝의 은닉 활성화 출력이 입력으로 들어가게 된다.

 

1. 삭제 게이트 (forget gate) : 메모리 셀이 무한정 성장하지 않도록 셀 상태를 다시 설정해 통과할 정보와 억제할 정보를 결정한다.

2. 입력 게이트 (input gate) : 셀 상태를 업데이트 하는 역할을 담당한다. 

  ▶이 두가지 게이트를 사용해 현재 타임스텝에서의 셀 상태를 계산할 수 있게 된다.

 $C^{(t)} = (C^{(t-1)})C^{(t)} = (C^{(t-1)}\times f_t)+(i_t\times C_t)$

3. 출력 게이트 (output gate) : 은닉 유닛의 출력 값을 업데이트 한다. $O_t$

  ▶ 3개의 게이트를 사용해 은닉 유닛의 출력을 한 수 있다.

$h^{(t)} = O_t \times tanh(C^{(t)})$

 

 

LSTM에서 더 발전된 형태의 모델들 (GRU e.g.)이 있어 다음에는 그런 종류의 모델을 공부해 보려한다. RNN이나 LSTM과 같은 모델은 keras API를 통해 손쉽게 구현할 수 있어 실습해보면 좋을 것 같다.

 

 

 

 

 

'Deep Learning > NLP' 카테고리의 다른 글

[DL] RETAIN 모델 논문정리 / interpretable AI  (6) 2020.11.11