일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- Today
- Total
- activation function
- AdaGrad
- adaptive learning rate
- arithmetic reasoning
- Attention is all you need
- attention mechanism
- auto encoder
- Back Propagation Trough Time
- Backpropagation
- Bayes Theorem
- BCE
- Bert
- Bidirectional Encoder Representation from Transformer
- Binary classification
- BPTT
- Chain-of-Thought
- CNN
- commonsense reasoning
- Computer Vision
- Confusion Matrix
- convolutional neural network
- Cot
- cot reasoning
- counting
- Cross Entropy Loss
- deep learning
- degradation
- Dimension Reduction
- Few-shot
- fine-tuning
데이터 분석 일지
[Deep Learning] RNN (Recurrent Neural Network) 본문
[Deep Learning] RNN (Recurrent Neural Network)
-ˋˏ ♡ ˎˊ- 2024. 3. 7. 11:540. Foundation Concept of RNN
이전까지는 함수에 x를 입력 받으면 y를 출력하는 형식을 정의했었다. 하지만 RNN은 sequential data나 time series data를 다룰 수 있는 구조를 지닌다. RNN은 이전 time step의 출력을 입력으로 받는 특성을 가진다. 따라서 x와 이전 time step의 출력 h_(t - 1)을 입력으로 받아 현재 time step인 h_t를 출력하는 구조인 것이다.
FC layer나 CNN은 이전의 출력 정보를 입력으로 받지 않고, 순서 정보를 고려하지 않는 반면에, RNN은 순서 정보나 이전 데이터에 기반한 현재 데이터의 처리를 할 수 있다.
0. 1. Sequential Data vs Time Series Data
sequential data는 순서 정보가 중요한 data를 의미한다. time series data는 순서 정보가 중요한 동시에 해당 데이터의 발생 시점이 중요한 data를 의미한다. 즉 두 데이터의 차이는 time-stamp의 유무에 따른 차이인 것이다. squential data의 예로는 텍스트 데이터와 샘플링 주기가 일정한 영상 및 음성이 있다. 이때 텍스트 데이터의 순서 정보가 중요한 것이지, 언제 발생했는지가 중요한 것이 아니다. time series data의 예로는 주식 데이터나 센서 데이터가 있다.
1. Architecture
RNN은 x와 이전 time step의 출력인 h_(t - 1)을 입력으로 받고, h_t를 출력한다. 아래의 수식과 같이 x 중심의 linear layer와 h_(t - 1) 중심의 linear layer를 더한 후, non-linear 활성 함수로 tanh를 사용한다. 따라서 파라미터 값이 총 4개가 존재한다.
RNN이 동작하는 방식은 아래의 그림과 같다. 각 time step 마다의 y와 y_hat의 차이를 줄여나가는 loss 함수를 사용한다.
위의 RNN 구조는 single layer RNN이다. 아래의 그림은 multi-layered RNN의 구조를 나타낸다.
multi-layered RNN의 hidden state는 모든 hidden state를 더하여 얻는다. 또한 각 층 마다 각각 다른 파라미터를 가진다. 아래의 그림은 bidirectional multi-layered RNN의 구조를 나타낸다.
위의 구조에서는 hidden state를 정방향뿐만 아니라 역방향으로도 사용한다. 따라서 hidden state의 개수가 multi-layerd RNN의 두 배가 된다. 이 구조는 이전 hidden state를 쓰는 것 뿐만 아니라 다음 hidden state를 쓰기 때문에, 이전 정보로만 출력하는 작업이 아닌 POS tagging과 같이 문장 전체 정보를 가지고 출력하는 작업에서 많이 쓰인다.
정리하지면 아래와 같다.
- Single layer RNN에서 hidden state는 곧 output이다.
- Multi-layered RNN에서 output은 마지막 layer의 모든 time-step의 hidden state이고, hidden state는 마지막 time-step의 모든 layer의 hidden state이다.
- Bidirectional RNN에서 output은 hidden state의 2배가 되고, hidden state는 layer의 개수의 2배가 된다.
2. Application of RNN
RNN의 application은 크게 세 가지로 나눌 수 있고, 이를 두 가지 접근법으로 나누어 볼 수 있다.
2. 1. Approaches
첫 번째 접근법은 non-autoregressive (non-generative)로, 현재 상태가 앞/뒤 상태를 통해 정해지는 경우이다. 예를 들어 POS tagging과 text classification 등이 있다. 이 경우에는 전체 상태를 보고 출력하기 때문에 bidirectional RNN의 사용을 권장한다.
두 번째 접근법은 autoregressive (generative)로 현재 상태가 과거 상태의 의존하여 정해지는 경우이다. 예를 들어 Natural Language Generation, Machine Translation 등이 있다. 이 경우에는 과거 상태만 영향을 받기 때문에 bidirectional RNN은 사용할 수 없고, One-to-Many case에 해당한다.
2. 2. Many to Many
이 경우는 한 번에 모든 time-step의 입력을 넣고, 한 번에 모든 time-step의 출력을 나타낼 수 있는 구조이다. POS tagging을 예로 들자면, 입력으로 각 단어가 들어가고, 출력으로 각 단어의 tag가 나오게 된다.
2. 3. Many to One
이 경우는 한 번에 모든 time-step의 입력을 넣고, 마지막 time-step의 출력만 나타내는 구조이다. Text Classification을 예로 들자면, 입력으로 각 단어가 들어가고, 출력에 softmax 함수를 사용하여 확률 분포를 얻어낼 수 있다. 이때의 loss는 마지막 time-step의 출력의 loss만 계산하기 때문에 (전체 time-step의 출력을 받지 않기 때문에) 시그마를 씌우지 않고 계산한다.
2. 4. One to Many
이 경우는 하나의 입력을 가지고 하나의 출력을 나타내는 구조이다. 입력으로 초기 조건을 받고 출력으로 다음 단어나 문장을 출력하는 Natural Language Generation task를 수행할 수 있다. 이 경우에는 역방향의 hidden state는 사용할 수 없다.
machine translation의 경우, one to many에서 확장되어 squence to squence의 형태를 띄게 된다. 이 경우 encoder와 decoder를 가지는데, encoder는 many to one의 형태를 가지고 decoder는 one to many의 형태를 가진다. encoder의 마지막 출력을 decoder의 입력으로 사용하는 것이다.
3. Back Propagation Through Time
3. 1. Back Propagation with Multiple Forwarding Paths
x에서 y_hat으로 가는 경로가 여러가지일 때 이를 미분하는 방법은 각 경로별로 미분 한 값을 더해주는 것이다. 아래의 그림과 같은 구조에서는 h_(2, 1)에서의 미분값과 h_(2, 2)에서의 미분값을 더해주어 θ_1에 대한 미분값을 구할 수 있다.
위 그림에서는 x에서 y_hat으로 가는 경로가 두 가지 존재한다. 위의 그림에서 θ_1에 대한 미분을 구하는 수식은 아래와 같다.
$$\frac{\partial L}{\partial \theta_1} = \frac{\partial L}{\partial \hat{y}} (\frac{\partial \hat{y}}{\partial h_{2, 1}} \frac{\partial h_{2, 1}}{\partial h_1} + \frac{\partial \hat{y}}{\partial h_{2, 2}}\frac{\partial h_{2, 2}}{\partial h_1}) \frac{\partial h_1}{\partial \theta_1}$$
위의 성질을 이용하여 RNN에서도 back propagation을 수행할 수 있다.
3. 1. Back Propagation in RNN
many to one은 하나의 출력을 가진다. 또한 하나의 θ가 feed foward할 때마다 사용되었고 이를 back propagation한다면 미분 값이 다 더해지게 된다.
위의 many to one 구조에서 y_hat을 θ로 미분할 때, 모든 경로의 미분값을 더해주면 된다. 수식은 아래와 같이 나타낼 수 있다.
$$\frac{\partial L(\theta)}{\partial \psi} = \sum_{t = 1}^T \frac{\partial L(\theta)}{\partial \hat{y}}\frac{\partial \hat{y}}{\partial h_4}( \prod_{i = t}^{T-1} \frac{\partial h_{i +1}}{\partial h_i})\frac{\partial h_t}{\partial \psi}$$
many to many의 경우 여러개의 출력을 가진다. 또한 한 time-step의 feed foward에서도 여러 feed foward의 경로가 존재한다. 특히 multi-layered RNN을 사용하는 경우에는 feed foward의 경로가 더욱 많아질 것이다.
위의 many to many 구조에서 y_hat을 θ로 미분할 때, 모든 경로의 미분값을 더해주면 된다. 수식은 아래와 같이 나타낼 수 있다.
$$\frac{\partial L(\theta)}{\partial \psi} = \sum_{t = 1}^T \sum_{k = 1}^t \frac{\partial L(\theta)}{\partial \hat{y}_t}\frac{\partial \hat{y}_t}{\partial h_t}( \prod_{i = k}^{t-1} \frac{\partial h_{i +1}}{\partial h_i})\frac{\partial h_k}{\partial \psi}$$
3. 2. Gradient Vanishing
RNN의 구조상 여러 경로를 통하여 출력을 도출해낸다. 이에 따라 back propagation을 수행할 경로가 많아지고, 미분 값도 모두 더해지게 된다. 따라서 time-step의 개수만큼 레이어가 깊어진 것과 마찬가지이므로 tanh를 활성함수로 사용하는 RNN은 gradient vanishing이 발생한다.
자세하게 말하자면 위의 수식(many to many의 미분 수식)에서, 아래의 부분이 문제가 되는 것이다. tanh를 취한 것은 항상 1보다 작거나 같고, 이를 계속해서 곱하다보니 값이 무수히 작아질 수 밖에 없다.
$$\prod_{i = k}^{t-1} \frac{\partial h_{i +1}}{\partial h_i$$
4. LSTM(Long Short Term Memory)
RNN 내부에는 tanh가 있으므로, time-step이 길어짐에 따라 gradient vanishing이 발생한다. 따라서 긴 시퀀스는 학습이 어렵다는 문제가 발생한다. 즉, 시퀀스가 길수록 초기의 hidden state는 파라미터 업데이트에 관여할 수 없게 된다. 이를 장기의존성 문제라고 한다.
4. 1. Gate using Sigmoid
LSTM은 장기의존성 해결하기 위해 sigmoid를 사용한 gate를 사용한다. sigmoid는 0과 1 사이의 값을 반환하므로 sigmoid를 곱하면 마치 문을 열고 닫는 듯한 효과를 낼 수 있다. f(x)값에 σ(x)를 곱해주며 각 함수값을 얼마나 반영할지 결정할 수 있는 것이다. 이를 기본적으로 활용한 것이 LSTM인 것이다.
4. 2. Architecture
LSTM의 구조를 살펴보기 전에 구조에 쓰이는 기호를 알아보자. 각 그림에서 의미하는 기호는 다음과 같다.
노란 사각형은 신경망 레이어를 의미하고, 분홍색 원은 벡터를 추가하거나 곱하는 연산자를 의미한다. 일반 화살표는 벡터의 이동을 의미하고, 하나로 합쳐지는 화살표는 벡터가 concat되는 것을 의미하며, 두 개로 갈라지는 화살표는 벡터의 복제를 의미한다.
위의 LSTM의 구조 그림에서 자세히 봐야할 것은 x와 이전 hidden state 외에 입력되고 출력되는 화살표가 하나 더 늘어났다는 것이다. 이 추가되 화살표는 cell state를 의미한다. 이는 또하나의 hidden state로, gradient vanishing을 해결하는데 중요한 역할을 한다.
LSTM은 3개의 추가적인 sigmoid를 사용한 gate를 갖는다. 이는 각각 input gate, forget gate, output gate이다. 각각의 gate는 cell state를 적절히 조절하는 역할을 한다. cell state와 output gate 사이에 element-wise 연산을 수행하여 cell state의 정보를 얼마나 반영할지 계산된다. 이를 계산함으로써 hidden state가 결정된다
LSTM이 gradient vanishing 문제를 해결했지만, 무조건 긴 데이터를 모두 기억할 수 있는 것은 아니다. LSTM은 gate마다 weight parameter를 가지게 된다. 이에 따라 모델 구조가 복잡하고, 계산 비용이 높다는 단점을 가진다. 이를 개선하여 개발한 모델이 GRU이다.
4. 3. GRU (Gated Recurrent Unit)
GRU는 LSTM 구조의 복잡함을 개선하기 위하여 제안 되었고, LSTM보다 효율적인 계산을 할 수 있다. 이 모델은 reset gate, update gate의 두 개의 gate만 사용한다. 말 그대로 reset gate는 이전 정보를 얼마나 잊어야 될지를 결정하고, update gate는 이정 정보를 얼마나 가져와야할지를 결정한다. GRU에서 cell state는 따로 없고 RNN과 같이 이전 정보를 hidden state만 가진다. 구조는 아래의 그림과 같이 나타낼 수 있다.
5. Gradient Clipping
BPTT 알고리즘에 따라 time-step이 많아질수록 gradient의 덧셈이 많아진다. 즉, 긴 시퀀스의 경우 gradient가 커질 것이다. 시퀀스에 길이에 따라 적절한 learning rate의 크기를 찾아야한다. 이 방법을 gradient clipping이라고 한다.
5. 1. Intuitive Explanation
아래의 수식에서 loss를 θ로 미분한 gradient가 threshold인 τ보다 클 경우 clipping을 하겠다는 것이 기본적인 전략이다. 즉, k가 1보다 크면 clipping을 수행하는 것이다.
$$\frac{||\nabla_\theta L(\theta)||_2}{\tau} = k$$
clipping은 다음과 같이 수행한다. gradient를 k로 나누어주면 threshold의 크기와 같아지고, 이는 기존의 gradient와 방향은 같지만 크기가 줄어든 상태가 된다. 만약 clipping을 수행하지 않았더라면 아래의 그림처럼 gradient exploding 문제가 발생한다.
이처럼 gradient clipping을 사용하게 된다면 정해진 threshold가 gradient의 maximum이 되는 것이다. 우리는 이 maximum일 때도 동착하는 적절 learning rate를 찾으면 된다. 사실상 adam optimizer를 사용하게 된다면 gradient clipping을 굳이 하지 않아도 된다.
'Lecture or Textbook Review > Deep Learning' 카테고리의 다른 글
[Deep Learning] Computer Vision (0) | 2024.02.29 |
---|---|
[Deep Learning] CNN (Convolutional Neural Network) (0) | 2024.02.27 |
[Deep Learning] Geometric Perspective (0) | 2024.02.26 |
[Deep Learning] Probabilistic Perspective (0) | 2024.02.23 |
[Deep Learning] Representation Learning (0) | 2024.02.22 |