Post

[Paper]RNN

RNN은 순차적인 데이터와 시계열 데이터를 처리하는 데 특화된 인공신경망 모델이다.RNN은 입력 데이터의 시퀀스에 대해 이전 상태의 정보를 기억하고 현재 상태의 출력을 계산하는 반복적인 구조를 가지고 있습니다. 이를 통해 RNN은 순차적인 패턴과 의존성을 모델링할 수 있습니다.

Ⅰ. RNN(Recurrent Neural Network)

  • 순서가 있는 데이터를 입력으로 받음.
  • 변화하는 입력에 대한 출력을 얻음.
  • 시계열, 자연어와 같이 시간의 흐름에 따라 변화하고, 그 변화가 의미를 갖는 데이터

ⅰ. Why not a vanilla neural net?

6

  • one to many
    • ex. image captioning(image → sentence)
  • many to one
    • ex. sentiment classification(sentence → sentence)
  • many to many(encoder, decoder)
    • many to one + one to many,context C vector(sequence of vectors in attention model.)
    • ex. machine translation(seq of words → seq of words)
  • many to many
    • ex. video frame classification(seq of frame → seq of class)
  • Problems
    • Vanilla neural net을 사용하면 input과 output의 길이가 고정되어야 해서 가변 길이 입력 처리를 못함.
    • 또한, feature sharing이 이루어지지 않아 이전 상태의 정보를 전달하는 매커니즘이 없음.

따라서 아래와 같은 RNN이 제시되었다.

ⅱ. Recurrent Neural Net(RNN)

7 Figure 1

  • 이전 층(Layer), 또는 스텝의 출력이 다시 입력으로 연결되는 신경망 구조.(현재 상태가 이전 상태에 종속)
  • Parameter sharing : 각 스텝마다 이전 상태를 저장하는 기억 시스템
    • RNN : same weights across time steps
    • CNN : same kernel across image regions
    • if not use same weights.
      • 가변길이 학습이 불가능.
      • 공간적 특성을 공유하지 못함.

        공간적 특성이란?
        데이터나 현상이 공간에 대한 속성을 가지고 있는 것을 의미하며 시계열에서는 특정 주기로 받아들일 수 있다.
  • Feed Forward Net(Vanilla neural net)은 단방향 구조로 RN과 다르게 이전 스텝의 출력의 영향을 받지 않음.

ⅲ. Dynamical system

\[s^{(t)} = f(s^{(t-1)}l \theta) = f_{\theta}(s^{(t-1)})\]
  • Unfolding

    \[s^{(3)} = f_{\theta}(s^{(2)}) = f_{\theta}(f_{\theta}(s^{(1)}))\]

    위와 같이 같은 파라미터($\theta$)를 모든 step에서 똑같이 적용하여 파라미터 갱신을 안정화.

    Figure 1. 에서의 식을 확인해보면, 아래와 같다.

    \[h^{(t)} = f_{\theta}(h^{(t-1)}, x^{(t)})\] \[h^{(t)}:new state, h^{(t-1)}:old state,x^{(t)}:input\]

임의의 길이를 가진 순서데이터 $x^{(t)}, x^{(t-1)}, … , x^{(1)}$에서 고정된 길이의 벡터 $h^{(t)}$로 가면서 RNN은 $h^{(t)}$를 활용하여 일부 정보의 손실이 발생하는 것을 학습한다.

ⅳ. Forward propagation(SimpleRNN)

Notes_230617_140429_386

$$l_t = W_{hh}h^{(t-1)} + W_{hx}x^{(t)} + b_h$$ $$h^{(t)} = tanh(l_t)$$ $$a_t = W_{hh}h^{(t-1)} + W_{hx}x^{(t)} + b_h$$ $$y^{(t)} = softmax(a_t)$$

python 코드 구현

1
2
3
4
5
6
def forward(self, x):

  self.h = np.tanh(np.dot(self.W_hh, self.h_prev) + np.dot(self.W_hx, x) + self.b_h)
  self.y = np.dot(self.W_yh, self.h) + self.b_y
  
  return self.y

왜 self.y에 softmax 함수를 기입하지 않았는가 하는 문제는 아래에서 다루겠습니다.

ⅴ. Backward propagation

앞서 설명한 순전파의 공식을 기반으로 활용한다.

Softmax with loss 역전파 과정.

image 출처 : https://yun905.tistory.com/11

Cross Entropy 역전파

CE 역전파 Figure 1 : Cross Entropy 역전파 과정

Softmax 역전파

softmax 역전파 Figure 2 : Softmax 역전파 과정

$h_t$에서 Loss 계산까지의 역전파 과정

h_t Figure 3 : $h_t$부터 손실함수 계산까지의 역전파 과정

RNN cell에 대한 역전파 과정.

RNN cell Figure 4 : RNN cell에 대한 역전파 과정

python 구현

전체코드와 학습 예제코드는 RNN.py 에서 확인가능합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
def backward(self, x, target, learning_rate):
  # metrics
  metrics = self.MSE(self.a, target)

  # Figure 3의 왼쪽 점선 박스
  da = self.a - target  # Figure 2 - 6
  dW_y = np.dot(da, self.h.T) # Figure 3 - 6
  db_y = da # Figure 3 - 3
  dh = np.dot(self.W_y.T, da) # Figure 3 - 5

  # Figure 4
  dtanh = dh * (1 - self.h ** 2) # Figure 4 - 2

  dW_h = np.dot(dtanh, self.h_prev.T) # Figure 4 - 8
  dW_x = np.dot(dtanh, x.T) # Figure 4 - 9
  db_x = dtanh # Figure 4 - 3
  
  # 가중치 업데이트
  self.W_h -= learning_rate * dW_h
  self.W_x -= learning_rate * dW_x
  self.W_y -= learning_rate * dW_y
  self.b_x -= learning_rate * db_x
  self.b_y -= learning_rate * db_y

ⅵ. BPTT(Backpropagation Through Time)

Notes_230617_142000_4fc

  • RNN을 학습하는데 사용되는 역전파 알고리즘의 한 형태
  • 네트워크를 시간 방향으로 펼친 신경망의 오차역전파로 entire sequence를 학습.
  • 시계열 데이터의 시간 크기가 커지면 역전파 시 불안정해지면서 기울기 소실 문제 발생.

예제코드는 BPTT.py 에서 그래디언트 폭발이 일어나는 것을 확인가능합니다.

ⅵ. Truncated BPTT

Notes_230617_142029_e63

  • 그래디언트 소실 및 폭발을 방지하기 위해 개발된 역전파 알고리즘의 한 형태.
  • 큰 시계열 데이터를 다룰 때 사용하는 오차역전파법
  • 신경망을 적당한 길이(chunk)로 끊는다.(단, 역전파에 연결만 끊고 순전파의 연결은 끊어지지 않는다.)
    • minibatch sgd랑 유사함.

ⅵ. Time RNN

TimeRNN 출처 : https://asthtls.tistory.com/1078

  • BPTT 문제점의 대안으로 제안된 알고리즘.
  • 시간 축을 펼쳐 네트웤르르 여러 개의 레이어로 구성한 후, 각 레이어를 시간 순서대로 연결하여 레이어 간의 연결이 짧아져 그래디언트가 더 짧은 거리를 전파하게 됨.

전체코드는 BPTT.py 에서 확인가능합니다.

ⅶ. Bidirectional RNN

기존의 RNN 구조들은 간편한 구조를 지녔지만, 이전 시점의 정보만 고려할 수 있었습니다. 따라서 output $y^t$가 input sequence 전체에 의존하는 경우(ex. speech recognition, handwrite recognition, seq2seq learning) 일반적인 RNN으로는 문맥\(_{context}\) 앞뒤의 정보를 모두 고려해야하는 작업에서의 한계가 양방향 RNN\(_{Bidirectional RNN}\)이 나오게 된 배경이 되었습니다.

Bidirection RNN Figure 1 : input seq $x$ to target seq $y$ with loss $L^t$ at each step t

  • $h$ : recurrence propagateds forward in time
  • $g$ : recurrence propagateds backward in time
  • $o^t$ : output units can benefit from past and future $h^t$

ⅷ. Deep RNN

Deep RNN은 RNN의 여러 은닉층을 쌓아 더 복잡한 패턴을 학습하는 능력을 향상 시킨 모델입니다. 일반적인 RNN은 단일 은닉층을 가진 구조로서 순차적인 패턴을 학습하는 데에 유용합니다. 그러나 문제의 복잡성이나 계층적 구조를 반영하는 것에 한계가 있습니다. 이러한 한계를 극복하기 위해 도입된 Deep RNN의 세 가지 주요 이유는 아래와 같습니다.

  1. hidden recurrent state can be broken down
    은닉 상태(hidden state)를 여러 계층으로 쪼갤 수 있습니다. 전체를 하나의 은닉 상태로 갖는 단순 RNN 방식과 달리, 각 계층에서 구분된 은닉 상태를 가지는 방식으로, 데이터의 다양한 추상 수준의 표현을 학습할 수 있게 됩니다. 이를 통해, 모델이 더 복잡한 패턴과 문맥 정보를 포착하는 데 도움이 됩니다.
  2. deeper computation can be introduced
    Deep RNN은 여러 은닉층을 쌓음으로써 더 깊고 복잡한 계산을 표현할 수 있는 모델 구조를 제공합니다. 각 층은 입력 데이터와 이전 시점의 상태 정보를 결합하여 계층별 상태 정보를 생성하며, 이러한 계산의 중첩은 고차원적인 패턴을 인식하는 데 유리합니다. 이런 특징 덕분에 Deep RNN은 시계열 데이터나 텍스트 데이터와 같이 복잡한 구조를 가진 데이터를 처리하는 데 더욱 효과적이라 할 수 있습니다.
  3. path-lenthenening effect can be mitigated
    단순한 RNN 구조에서는 시퀀스가 길어질수록 시간 경과에 따른 그래디언트 소실과 폭발 문제(gradient vanishing and exploding problem)가 발생할 확률이 증가합니다. 이는 모델이 장기 의존성(long-term dependencies)를 학습하는 데 어려움이 생기게 합니다. 반면에, Deep RNN은 여러 계층의 구조를 활용하여 그래디언트의 전달이 개선되고, 이로 인해 경로 길이가 길어지는 효과를 완화할 수 있습니다. 게다가, LSTM이나 GRU 등의 게이트 메커니즘이 있는 RNN 변형 구조와 결합되어, 이러한 문제를 더 효과적으로 완화할 수 있습니다.

요약하면, Deep RNN은 복잡한 계층적 구조와 문맥 정보를 좀 더 효과적으로 학습하고 전달할 수 있다는 장점과 함께, 그래디언트 소실과 폭발 문제를 완화하여 복잡한 시퀀스 데이터 처리에 좋은 성능을 발휘합니다.

Ⅱ. REFERENCES

  1. 딥러닝 - RNN
  2. Truncated BPTT, Time RNN



This post is licensed under CC BY 4.0 by the author.