본문 바로가기

학습공간/빅데이터활용실무

[8주차] Recurrent Neural Networks (RNN)

반응형

 Recurrent Neural Networks (RNN)

제일 먼저 떠오르는 것은 딥 러닝을 기반으로 시계열 데이터를 처리할 때 가장 많이 사용되는 구조라는 것이다. 구체적으로 딥 러닝에서 어떤 부분이 기존 MPL (Feed-forward Neural Networks)와 다른지 공부해보도록 한다.

• Feed-forward Neural Networks (FNN)
- An FNN is a stack of fully-connected layers.
- 그림과 같이, 뉴럴 넷은 각 레이어 별 완전 연결로 구성되어 있다. 따라서, 각 레이어 별 parameter 개수도 많을 뿐만 아니라, 계산 비용도 복잡하고, 오버 피팅의 위험성도 크다. RNN 에서는 어떤 부분이 개조되어 사용되었는지 살펴보도록 한다.
Feed-forward Neural Networks

• Comparison of FNN and RNN
- Input Data : Vector (FNN) ⋯ 단일
- Input Data : Sequential Data (RNN) ⋯ 연속 (time series, video, audio)
- 고정 크기의 벡터(fixed-size vector)가 들어가면, 스칼라(scalar)나 벡터(vector) 형태를 출력하는 것이 일반적인 형태였으나, Sequential Data 처리는 입력/출력 모두 a scalar/vector or variable length sequance of vectors X = (x¹, x², … ,xⁿ)이다.
http://karpathy.github.io/2015/05/21/rnn-effectiveness/

- Main Operations:
(일반 FNN의 hidden layer)Recurrent connections 추가 형태
  ① 인접한 시간 단계에 걸친 연결 (FNN의 상위 집합)
  ② 매개 변수를 공유(sharing parameters)하고,
  ③ 시퀀스 시간 단계에서 정보를 선택적으로 전달(selectively passing information)
  -. 각각의 타임 스탭 별 히든 레이어는, 이전 히든 레이어의 정보와 현재 정보를 모아 activation function 통과 (주로 tanh 사용)
Recurrent connections 추가 의미는 펼쳐보았을 때 모두 동일한 매개 변수를 공유한다는 것이다.

 

 Recurrent Neural Networks : 순환 신경망

서론에서 소개했던 Sequential Data 처리에 대한 다양한 타입을 알아보도록 한다.

• Given a Training Dataset ⋯ many to many (generally)
\[ 𝐷 = \{( (𝑥_𝑖^{(1)},⋯,𝑥_𝑖^{(𝑚𝑖)}), (𝑦_𝑖^{(1)},⋯,𝑦_𝑖^{(𝑚𝑖)}) )\} \sideset{_{}^{}}{_{𝑖=1}^𝑛}{} \]
일반적인 many to many 형식의 학습 데이터는 길이 (𝑚𝑖) 벡터(varying length (𝑚𝑖) sequences)들이다.
이때, RNN의 output (prediction of \(𝑦^{(𝑡)}\)) 식은,
\[ \eqalign{ &𝒉^{(𝑡)} = {\color{Red}𝑔_ℎ}(𝑾𝒉^{(𝑡−1)}+𝑼𝒙^{(𝑡)}+𝒃) \\ &\hat{𝑦}^{(𝑡)}={\color{Red}𝑔_𝑦}(𝑽𝒉^{(𝑡)}+𝒄) }\, {\color{Red}\mbox{⋯ often, tanh}} \]
⇒ 각각의 타임 스탭 별 히든 레이어 = Activation{(이전 히든 레이어 output) + (현재 input 정보)}.

비용 함수의 정의는 다음과 같고,
\[ 𝐽(𝐔,𝐕,𝐖,𝐛,𝐜) = \frac{1}{𝑛} \sum_{𝐷} {[\frac{1}{𝑚_𝑖} \sum_{𝑡=1}^{𝑚_𝑖} L(𝑦_𝑖^{(𝑡)}, \hat{𝑦}_𝑖^{(𝑡)} )]} \]
이것을 각각의 손실 함수에 대한 확률적인 해석으로 보면, log-likelihood (가능한 페어로) MLE 문제로 접근할 수 있다.
\[ \eqalign{ &\operatorname*{argmax}\limits_{𝐔,𝐕,𝐖,𝐛,𝐜}\, {log\, 𝑝(𝒚^{(1)},…,𝒚^{(𝑚)}|𝒙^{(1)},…,𝒙^{(𝑚)})} \\ &=\sum \sideset{_{}^{}}{_{𝑡=1}^𝑚}{} {log\, 𝑝(𝒚^{(𝑡)}|𝒙^{(1)},…,𝒙^{(𝑡)})} } \]
⇒ 시점 (𝑡) 에 대하여, 시간 (𝑡) 까지의 모든 가능도 (output 은 모든 input sequence 의존성을 띈다.)

• If given, ⋯ many to one ??
타임 스탭 T 결과에 대해서만 정의하거나, 모든 타임 스탭에 대한 집합으로 비용 함수를 정의

1개의 output 인 경우에는, 마지막 시점의 \(𝒉^{(𝑇)}\) 에 대한 비용 함수만을 정의하거나,
모든 히든 레이어의 결과를 합친 형태로 비용 함수를 정의하는 경우가 있다.
• If given, ⋯ one to many ??
one to many

※ 모든 타임 스탭의 입력값에 (초기)동일한 𝑥 를 넣어주면 기본 RNN 구조를 그대로 사용할 수 있다.
• Training RNN: Back-Propagation Through Time
  - 기존의 FNN(Feed-forward Neural Network) Back-Propagation 과는 조금 다른 학습 방법을 사용한다. 가령, RNN 히든 레이어가 1 개이고 message 길이가 5 라면, FNN 펼쳐놓은 형태로 해석하고 히든 레이어를 5개로 보고 5 개의 손실 함수를 각각 계산해서 푼다. 매개 변수가 공유되는 것 말고는 FFN 펼쳐놓은 형태와 똑같다.
Truncated Back-Propagation Through Time (BPTT)

만약, 1000 개 이상의 시퀀스가 있다고 한다면 몇 개의 Chunk 단위로 쪼개어 shifting size 만큼 이동하면서 합성해주는 Truncated Back-Propagation Through Time 방법을 사용할 수도 있다.

다음은, RNN의 대표적인 3 가지 전략에 대해서 소개한다.
① Teacher Forcing : RNN with Output Recurrence
  • 이전 시점의 출력값/예측값까지 고려하여 다음 시점을 예측한다.
    1) (training phase) 이전 시점의 출력값 \(𝒚^{(𝑡-1)}\)을 다음 input 정보로 같이 넣어준다.
    2) (inference phase) 실측값을 모르기 때문에 이전 시점의 예측값 \(\hat{𝒚}^{(𝑡-1)}\)을 다음 input 정보로 같이 넣어준다.

Better capture all the information about the past to predict the future

② Bidirectional RNN : Combination of (1) a sub-RNN(forward) and (2) a sub-RNN(backward)
  • 역방향 정보도 누적해가며 예측한다면 문장과 같은 전후맥락 파악에 도움이 될 것이다.
    1) (unidirectional RNN) only forwad direction을 수행한다.
    2) (bidirectional RNN) 한 쌍의 히든 레이어가 붙어서 both forward and backward directions을 수행한다.

③ Deep RNN : Stack of multiple hidden layers with recurrent connections 
 -. 여러 개의 RNN Hideen Layer 사용 시 경험적으로 더 좋은 성능을 보인다.

 

 Applications: 응용 RNN

RNN 구조를 응용하면, 좀 더 다양한 데이터 처리나 차원에 대한 축소/확장이 가능해진다. RNN의 Encoder-Decoder 아키텍처와 이를 응용한 여러가지 예시에 대해 소개하고자 한다.

 

• RNN Encoder-Decoder Architecture (many to many)
 -. many to many = many to one → [ c ] → one to many 구조를 사용한다.
 -. 즉, 어떤 시퀀스를 입력 받아서 길이가 다른 시퀀스에 맵핑하기 위해 벡터로 변환(many to one RNN) 한 뒤,
    다시 반대로 시퀀스로 변환(one to many RNN) 방법을 사용한다.
Encoder(RNN) - Context(fixed-length vector) - Decoder(RNN)

• Chanllenge of Long-Term Dependencies

- Problem Improvement : Long-Term Dependencies
위 그림에서 L5 에 대한 Gradient 구하는 문제를 본다고 하면, 체인 룰에 의해서 초기 값부터 현재의 값까지 모든 엘리먼트를 보아야 하고, 혹여나 tanh 나 sigmoid 함수를 사용했을 때 입력 값이 1보다 작게 나오게 될 경우 곱에 의해서 Vanishing 문제가 발생할 수 있다. 또한, ReLU 함수를 사용했다면 1보다 크게 나오게 될 경우 Exploding 문제도 발생할 수 있다.

이 Long-Term Dependencies 의 약점을 개선하기 위해서 Hidden Unit 내 Activation function(ex. tanh) 구조를 약간 복잡하게 개조하여 문제를 해결하고자 한다. 아래의 2 가지 해결 방법을 확인해 보자.
① Long Short-Term Memory (LSTM)
 -. 3 개의 게이트를 사용하여 Hidden Unit 구조를 복잡하게 구성하여 tanh 대비 유닛 수를 줄인다.
 1) input gate \(i^{(t)}\): whether \(c^{(t)}\) to use information in the current input \(x^{(t)}\) and the previous hidden state \(h^{(t-1)}\)
 2) forget gate \(f^{(t)}\): whether \(c^{(t)}\) to use information in the previous cell state \(c^{(t-1)}\)
 3) output gate \(o^{(t)}\): whether \(h^{(t)}\) to use information in the current cell state \(c^{(t)}\)

 ⇒ tanh 대비 parameters 수가 4 배가 된다.
② Gated Recurrent Unit (GRU)
 -. LSTM Parameters 수가 증가됨에 따라, 과거 게이트와 현재 게이트 2 개만을 이용하여 문제를 해결하기로 한다.
 1) reset gate \(r^{(t)}\): whether \(\tilde{h}^{(t)}\) to use information in the previous hidden state \(h^{(t-1)}\)
 2) update gate \(z^{(t)}\): convex combination of \(h^{(t-1)}\) and \(\tilde{h}^{(t)}\)

 ⇒ parameters 수를 줄이기 위해 cell state 개념을 사용하지 않음.

※ 특정 셀에서 정보를 계속해서 유지하고 있다가, 과거 정보를 어떤 의사결정에 의해 전처리 없이 그대로 미래로 던져준다면 Vanishing 문제를 막을 수 있다.
※ parameters 수가 많아지는 문제가 있는데, 일반적으로 tanh 보다 동일 parameter 수 대비 더 좋은 성능을 보이는 것으로 나타났다.
LSTM vs. GRU vs. tanh (Empirical study)
• Applications: Convolutional RNNs
 -. 영상 정보를 이미지 시퀀스로 변환하고, 벡터로 변환하여 RNN 구조를 사용할 수도 있다.
Convolutional RNNs

• Applications: Neural Machine Translation
 -. 앞의 many to many 구조에서 인코더/디코더를 사용하여 구현된 모델이다.
 -. many to many = many to one (RNN-Encoder) + [ c ] + one to many (RNN-Decoder)


• Applications: Image Captioning
 -. one to many 형태로, 사진을 입력 받으면 시퀀스 벡터로 변환(ex. 순서를 가진 단어)하는 모델이다.
 -. one to many = one to one (CNN-Encoder) + one to many (RNN-Decoder)
반응형