우노
[DL] RNN, LSTM, GRU 란? 본문
Naive Neural Network
- "Yesterday, Harry Potter met Hermione Granger"라는 문장을 입력 받았을 때,
- 문장의 각 단어가 사람 이름이라면 1, 아니라면 0을 매핑하는 Naive한 개체명 인식 신경망을 만든다고 가정해보자.
- 입력 문장의 각 단어는 Voca(단어사전)의 index를 통해 사전 개수 만큼의 차원을 가지는 one-hot vector로 매핑될 것이며,
- 단어는 총 9개이므로, 9개의 one-hot vector가 구성될 것이다.
- 따라서, 해당 단어가 사람 이름이라면, 해당 one-hot vector의 y값은 0으로 매핑
- 해당 단어가 사람 이름이 아니라면, 해당 one-hot vector의 y값은 1로 매핑되며 학습이 진행될 것이다.
- 하지만 이러한 방법은 잘 동작하지 않는다.
- 위처럼 개체명 인식 문제가 아닌, 기계 번역과 같은 경우에는, 입력과 출력 시퀀스의 길이가 동일하지 않을수 있기 때문이다.
- 또한, 위와 같은 방법은 서로 다른 위치에서 학습된 단어의 특성이 공유되지 않는다.
- 이를 해결하기 위해, RNN(Recurrent Neural Network)이 존재한다.
RNN (Recurrent Neural Network)
RNN의 기본 구조는 아래 그림과 같다.
좌에서 우로 문장을 읽는다면, 처음 읽는 단어 x<1>를 신경망의 입력으로 사용한다.
그리고 내부 신경망(hidden layer, output layer)를 통해, 해당 단어가 사람의 이름인지 y^<1>을 예측한다.
그리고 두번째 단어 x<2>를 읽고, y^<2>를 예측한다.
이 때, y^<2> 예측 시 x<2>만 사용하는 것이 아니라, 첫번째 단어로 연산한 정보의 일부를 사용하게 된다.
구체적으로는 첫번째 시점의 activation 값이 두번째 시점에 전달되게 된다.
이처럼 RNN을 통한 개체명 인식은, 이전 단계의 연산결과와 매개변수들이 공유되며 마지막 단계까지 진행되게 된다.
RNN 학습을 시작하기 전에 a<0>이 사용되는 것을 볼 수 있는데,
이것은 보통 무작위로 초기화하거나, 0으로 초기화한다. (0으로 초기화하는 경우가 가장 일반적이다.)
Basic RNN의 단점
- Basic RNN 모델의 단점은, 앞서 나온 단어들의 정보만을 사용해서 예측을 한다는 것이다.
- 예를 들어, 아래와 같은 문장이 주어지고, y^<3> 예측을 한다고 가정한다면 Basic RNN 모델은 x<4>, x<5>, x<6>의 정보를 사용하지 않는다.
- He said, "Teddy Roosevelt was a great President."
- He said, "Teddy bears are on sale."
- 단지 x<1>, x<2>의 정보만을 사용해 예측하기 때문에, y^<3>인 Teddy가 사람인지 아닌지 구분하기 어려워진다.
RNN의 Forward Propagation
RNN의 순전파를 알아보자
초기에 사용되는 a<0>는 일반적으로 0 vector로 초기화된다.
다음으로 a<1>을 구하기 위해선 [ Waa<0> + Wax<1> + ba ] 에 activation function을 적용해 구한다.
- activation function으로는 tanh나 ReLU가 사용된다.
다음으로 첫번째 단어의 예측 y^<1>은 다음과 같이 구할 수 있다.
- activation function으로는 sigmoid나 softmax가 사용된다.
따라서 일반화하면 다음과 같다.
그리고, 위 식에서 a
는 아래와 같이 단순화시킬 수 있다. - Wa는 [Waa⋮Wax]를 의미하는데,
- 만약 a가 (100, 1) vector이고, x가 (10,000, 1) vector라면
- Waa는 (100, 100) matrix, Wax는 (100, 10000) matrix을 갖게 되고,
- 두 가중치 matrix를 연결하면 Wa는 (100, 10100) matrix가 된다.
- 따라서, Wa와 연산되는 [ a<t−1>, x
]는 (10100, 1) 벡터가 된다.
또한, y^
는 아래와 같이 단순화시킬 수 있다.
RNN의 Back Propagation
RNN의 Back Propagation이 어떻게 동작하는지 알아보자.
Back Propagation은 아래 그림과 같이 Forward Propagation의 반대로 진행된다.
따라서, 우선 아래 그림의 초록선과 같이 순전파 과정에서 Wa, ba를 통해 a
를 구하고, Wy, by를 통해 예측값 y^ 를 구한 뒤 Back Propagation 계산을 위해, 실제값과 예측값의 Loss를 계산하고, 총 Loss 값을 구한다.
Loss function으로는 Cross Entropy Loss(Logistic Regression Loss)를 사용할 수 있는데,
각 element의 Loss와 총 Loss는 다음과 같다.
순전파와 Loss 계산이 끝났으면, 아래 그림의 빨간선과 같이 Back Propagation을 진행하며 매개변수들을 업데이트 한다.
Language model using RNN
RNN을 통해 Language model을 만드는 방법에 대해서 알아보자.
Language model이란 무엇일까?
우리가 Speech recognition(음성 인식) 시스템을 만들고 있으며,
아래 그림과 같이, 두 개의 문장을 듣고, 더 말이 되는(가능성이 높은) 문장을 골라내야한다고 가정해보자.
첫 번째 문장의 확률이 3.2 x 10^-13, 두 번째 문장의 확률이 5.7 x 10^-10이라면
음성 인식 시스템은, 말이 되는 문장으로 두 번째 문장을 선택하게 된다.
이렇게, 문장이 주어졌을 때 각 문장의 확률을 구하는 모델이 Language model이다.
Vanishing gradients with RNN
- 두 문장이 주어졌다고 가정해보자.
- 'The cat, which already ate ...., was full'
- 'The cats, which already ate ...., were full'
- 위 문장에서, 문장 초반부의 cat/cats에 따라 문장 후반부의 was/were 가 달라지는 것을 알 수 있다.
- 이는, 문장 초반부의 단어가 문장 후반부에 영향을 끼친다는 것을 의미한다.
- 하지만, RNN은 이와 같은 장기적인 의존성을 확인하는데 효과적이지 않다.
- Basic RNN 모델은 Vanishing gradient 문제가 발생할 수 있기 때문이다.
- RNN은 기본적으로 많은 토큰들을 다루기 때문에, 깊은 신경망으로 이루어져있으며, Back Propagation을 사용해 가중치를 업데이트한다.
- 이 때, 문장 초반부의 단어가 결과에 미치는 영향은, 문장 후반부의 단어가 결과에 미치는 영향으로부터 계산되는데,
- 신경망이 깊어질수록 Vanishing gradient로 인해, 문장 초반부의 단어가 결과에 미치는 영향이 적어진다.
- 따라서, RNN은 가까운 곳에 있는 입력에 영향을 더 많이 받을 수 밖에 없다.
- 이것이 Basic RNN 알고리즘의 약점이다.
- 이를 해결하기 위해, LSTM (Long Short Term Memory)가 제안됐다.
LSTM (Long Short Term Memory)
LSTM은 Basic RNN의 장기 의존성(Long-Term Dependency) 문제를 해결하기 위해 제안됐다.
Basic RNN의 구조는 아래 그림과 같다.
- Basic RNN은 단순한 neural network 모듈을 반복시키는 체인과 같은 구조를 가지고 있다.
- 표준 RNN 모듈은 tanh layer 한 층을 가지고 있다.
LSTM의 구조는 아래 그림과 같다.
- LSTM도 Basic RNN과 같이 체인과 같은 구조를 가지고 있지만,
- 각 반복 모듈은 다른 구조를 가지고 있다.
- 단순한 1개의 layer 대신에, 4개의 layer가 특별한 방식으로 서로의 정보를 주고 받도록 돼있다.
모듈 요소
- 노란색 박스는 학습된 neural network layer를 나타낸다.
- 분홍색 동그라미는 vector 합과 같은 pointwise operation을 나타낸다.
- 각 선은 한 노드의 output을 다른 노드의 input으로, vector 전체를 보내는 흐름을 나타낸다.
- 합쳐지는 선은 concatenation을 의미하고,
- 갈라지는 선은 정보를 복사해서 다른 쪽으로 보내는 fork를 의미한다.
LSTM 구조
Cell State
- LSTM의 핵심은 Cell State인데, 모듈 그림에서 수평으로 그어진 윗 선에 해당한다.
- 메모리와 같은 존재이며, 컨베이어 벨트와 같아서 State가 꽤 오래 경과하더라도 Gradient가 잘 전파된다.
- 또한, Cell State는 Gate라고 불리는 구조에 의해 정보가 추가되거나 제거되며
- Gate는 training을 통해 어떤 정보를 유지하고 어떤 정보를 버릴지 학습한다.
Gates
- LSTM은 3개의 Gate를 가지고 있고, 이 gate들은 cell state를 보호하고 제어한다.
- forget gate (f) : 과거 정보를 잊기 위한 게이트
- input gate (i) : 현재 정보를 기억하기 위한 게이트
- output gate (o) : 최종 결과를 내보내기 위한 게이트
- LSTM은 3개의 Gate를 가지고 있고, 이 gate들은 cell state를 보호하고 제어한다.
Sigmoid
- 모든 Gate는 시그모이드 함수를 사용하고, 시그모이드 함수의 출력 범위는 0~1이다.
- 따라서, 그 값이 0이라면 "아무 것도 넘기지 말라"가 되고, 값이 1이라면 "모든 것을 넘겨드려라"가 된다.
Forget Gate
- 과거 정보를 얼마나 잊을지에 대한 단계이며, "forget gate"라고 불린다.
- 이 단계에서는, h(t−1)와 x(t)를 받아서, sigmoid layer를 통해 0과 1 사이의 값을 C(t−1)에 보내준다.
- 그 값이 1이면 "이전 상태의 모든 정보를 보존해라"가 되고, 0이면 "이전 상태의 모든 정보를 버려라"가 된다.
Input Gate
- 현재 정보를 얼마나 기억할 것인지에 대한 단계이며, "input gate"라고 불린다.
- 이 단계에서는, h(t−1)와 x(t)를 받아서, sigmoid layer를 통해 i(t)를 구한 뒤
- tanh layer를 통해 새로운 후보 값들인 ~C(t)라는 vector를 만들고,
- i(t)와 ~C(t)의 정보를 합쳐, cell state를 업데이트할 재료를 만들게 된다.
State Update
- 이전 cell state인 C(t−1)를 업데이트해서 새로운 cell state인 C(t)를 만드는 단계이다.
- 이전 cell state를 얼마나 잊을건지(forget gate) 곱셈
- 현재 cell state를 얼마나 반영할건지(inpute gate) 덧셈
- 최종 결과를 다음 상태의 cell state로 내보낸다.
Output Gate
- 다음 State로 내보낼 output(hidden state)을 구하는 단계이다.
- cell state에 tanh를 취한 뒤
- h(t−1)와 x(t)를 받아 sigmoid layer를 통해 O(t)를 계산한 후
- O(t)와 tanh 결과를 곱해 output(hidden state)을 내보낸다.
GRU (Gated Recurrent Unit)
GRU는 LSTM과 비슷한 이유로 만들어졌는데, LSTM을 구성하는 Time-Step의 Cell을 조금 더 간소화한 버전이다.
GRU는 LSTM보다 학습 속도가 빠르다고 알려져있지만, 여러 평가에서 GRU는 LSTM과 비슷한 성능을 보인다고 알려져 있다.
데이터 양이 적을 때는, 매개 변수의 양이 적은 GRU가 조금 더 낫고,
데이터 양이 더 많으면 LSTM이 더 낫다고 알려져 있다.
LSTM 구조
GRU 구조
차이점
- GRU는 LSTM과 다르게 Gate가 2개이며, Reset Gate(r)과 Update Gate(z)로 이루어져있다.
- Reset Gate는 이전 상태를 얼마나 반영할지
- Update Gate는 이전 상태와 현재 상태를 얼마만큼의 비율로 반영할지
- 또한, LSTM에서의 Cell State와 Hidden State가 Hidden State로 통합되었고
- Update Gate가 LSTM에서의 forget gate, input gate를 제어한다.
- GRU에는 Output Gate가 없다.
- GRU는 LSTM과 다르게 Gate가 2개이며, Reset Gate(r)과 Update Gate(z)로 이루어져있다.
Reset Gate
- 이전 상태의 hidden state와 현재 상태의 x를 받아 sigmoid 처리
- 이전 hidden state의 값을 얼마나 활용할 것인지에 대한 정보
Update Gate
- 이전 상태의 hidden state와 현재 상태의 x를 받아 sigmoid 처리
- LSTM의 forget gate, input gate와 비슷한 역할을 하며,
- 이전 정보와 현재 정보를 각각 얼마나 반영할 것인지에 대한 비율을 구하는 것이 핵심이다.
- 즉, update gate의 계산 한 번으로 LSTM의 forget gate + input gate의 역할을 대신할 수 있다.
- 따라서, 최종 결과는 다음 상태의 hidden state로 보내지게 된다.
'AI > Deep Learning' 카테고리의 다른 글
[DL] Word2Vec, CBOW, Skip-Gram, Negative Sampling (3) | 2021.02.18 |
---|---|
[DL] One-Hot Vector, Word Embedding (1) | 2021.02.17 |
[DL] Sequence Model이란? (3) | 2021.02.15 |
[DL] Neural Style Transfer (1) | 2021.02.10 |
[DL] One Shot Learning, Siamese Network, Triplet Loss, Binary Loss (1) | 2021.02.10 |