RNN
RNN(Recurrent Neural Network)이란 순환 인공 신경망으로, 유닛 간의 연결이 순환적 구조를 갖는 특징을 가진다. 음성인식, 동영상 등의 sequential data를 처리하는 데에 사용된다.
그렇다면 sequential data는 왜 RNN을 사용할까? 기존의 NN/CNN의 경우 고정된 크기의 입력만을 잘 다루므로 길이가 가변적인 sequential data를 다루기엔 적합하지 않다. 반면, RNN은 hidden state에서 이전 data에 대한 기억을 갖고 있으므로 이전 sequence를 바탕으로 새로운 sequence를 이해할 수 있다. 같은 함수와 parameter set을 사용해서 이 과정을 계속하여 반복한다면 아무리 긴 sequence여도 처리할 수 있다.
예를 들어 살펴보자. $x$ 라는 vector들의 sequence를 RNN으로 처리하고자 한다. hidden state를 업데이트하는 식은 다음과 같다. $$h_t = f_W(h_{t-1},x_t)$$ $h_t$는 현재 상태, $h_{t-1}$는 이전 상태를 의미하며, $x_t$ 는 현재의 input vector, $f_W$는 parameter set W에 대한 함수이다. 여기서는 $tanh$ 함수를 사용하므로 식은 다음과 같다. $$h_t=tanh(W_{hh}h_{t-1}+W_{xh}x_t)$$ $$y_t=W_{hy}h_t$$ 마지막 output layer에서 나온 값들을 softmax를 적용하여 cost값을 구하고 gradient descent 알고리즘을 통해 cost를 최소화하는 방향으로 학습시킨다. 또한, back propagation through time (BPTT)를 사용하여 $W_{hh}$,$W_{xh}$,$b$ 값을 최적화시킨다.
RNN으로 구성할 수 있는 network 종류에는 one to one, one to many, many to one, many to many가 있다. one to many는 이미지를 단어로 표현하는 image captioning에 사용되고, many to one은 단어들을 통해 감정을 파악하는 sentiment classification에 사용된다. many to many는 번역이나 동영상을 식별하는 video classification에 사용된다.
RNN이 Recurrent Neural Network인 이유는 sequence 요소를 입력받을 때마다 같은 작업을 반복적으로 수행하기 때문이다. 출력되는 값은 이전 작업에서 계산했던 내용들에 dependent하며, 메모리에 해당하는 hidden state는 입력 sequence와 관련된 정보를 저장하고 학습은 BPTT로 수행한다. 하지만 gradient descent model을 사용하여 앞쪽의 정보들을 전달하는 방식은 time step이 길어질수록 앞쪽의 정보가 뒤쪽에 영향을 주지 못하는 문제가 발생하여 장기 의존성 문제가 생긴다. $$ w = w - \alpha * \frac{\partial E}{\partial W}$$ $$ \frac{\partial E}{\partial W} = \frac{\partial E1}{\partial W} + \frac{\partial E2}{\partial W} + \frac{\partial E3}{\partial W} + \cdots$$ $$ \frac{\partial E3}{\partial W} = \frac{\partial E3}{\partial h3}* \frac{\partial h3}{\partial W_{xh}} + \frac{\partial E3}{\partial h3}* \frac{\partial h3}{\partial h2} * \frac{\partial h2}{\partial W_{xh}} + \frac{\partial E3}{\partial h3}* \frac{\partial h3}{\partial h2} * \frac{\partial h2}{\partial h1} * \frac{\partial h1}{\partial W_{xh}}$$ 이는 결국 gradient vanishing 혹은 gradient exploding 문제를 야기하는데, gradient 값이 1보다 작을 경우 학습이 길어질 수록 계속 곱해지면서 0에 가까워지므로 $w$의 값이 거의 변하지 않는 gradient vanishing이 된다. 반면, gradient 값이 1보다 클 경우 학습이 길어질 수록 계속 곱해지면서 너무 커져서 $w$의 값의 변동이 너무 심해지고 학습이 불안정해진다.
이를 극복하기 위해 LSTM이나 GRU가 주로 사용된다.
LSTM
LSTM이란 Long Short-Term Memory로, RNN에서 memory cell가 추가된 형태이다. 이전$h_{t-1}$와 새로운 입력 $x_t$가 주어졌을 때 memory cell의 어떤 부분을 지울지 결정하고 어떻게 더할지 결정하는 과정을 반복하여 학습한다.
memory cell은 decide to forget or memorize 라고 정의하면 될 것 같다. 얼마나 더할지를 결정하는 함수는 sigmoid 함수를 사용할 수 있다. forget gate에서 $C_{t-1}$에 $x_t$와 hidden state $h_{t-1}$의 sigmoid를 거친 확률값이 들어와 이를 몇 %나 기억할지를 결정한다. 옆의 식에서 주의해야할 것은 $f_t$는 $C_{t-1}$ 정보를 얼마나 지우고 남길지의 비율을 계산하는 것이다. input gate에서 $i_t$는 $\tilde{C_t}$를 얼마나 기억할지의 비율이다. 이때, $\tilde{C_t}$에서 $tanh$ 함수는 RNN에서 사용되는 출력 함수와 동일한 것을 알 수 있다.
마지막으로, hidden state $h_{t-1}$와 $x_t$가 sigmoid 함수에 들어가 확률적으로 곱해져서 cell state의 어느 부분을 들여와서 출력할지 결정하여 출력하고 다음 hidden state로 전달한다. 여기서 계산된 hidden state $h_t$는 해당 time step에 출력하는 vector 혹은 값과 같음을 알 수 있다.
GRU
GRU란 Gated Recurrent Unit으로 LSTM과 거의 비슷하지만 구조적으로 forget gate와 input gate가 합쳐져서 더 간단한 구조를 가진다. forget gate와 input gate를 하나의 update gate로 합치고 cell state와 hidden state를 합친 구조이다.
즉, LSTM에서의 $f_t$와 $i_t$가 GRU에서 $z_t$로 합쳐진 형태인 것이다.
[출처] 한양대학교 장준혁 교수님 인공지능개론 수업
'인공지능' 카테고리의 다른 글
[인공지능개론] Clustering (0) | 2024.08.20 |
---|---|
[인공지능개론] RNN② (0) | 2024.08.20 |
[인공지능개론] CNN③ (0) | 2024.07.11 |
[인공지능개론] CNN② (0) | 2024.05.08 |
[인공지능개론] CNN① (0) | 2024.05.08 |
댓글