일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- terminal
- seq2seq
- install
- github
- tab
- deeplearning
- Ai
- computer_setting
- slideshare
- computer
- language_model
- natural_language_processing
- Standford
- json
- Statistics
- cs231n
- Vim
- pip
- nlp
- cs224n
- Stanford
- gensim
- linux
- git
- error
- paper_review
- review
- code
- machinelearning
- text
- Today
- Total
NLP/AI/Statistics
순환신경망: LSTM(Long Short Term Memory) 본문
앞에서 기본적인 순환신경망인 RNN(Recurrent Neural Network)에 대하여 설명하였다.
RNN이 가지는 장기의존성 문제를 해결하기 위해 LSTM (Long Short-Term Memory) 모델이 소개되었으며,
이번 글에서는 LSTM의 특징과 내부 구조에 대하여 설명한다.
LSTM은 간단히 설명하자면, RNN의 변형 구조로써 게이트 메커니즘을 추가한 모델이라고 할 수 있다.
RNN의 내부 구조에 입력 게이트, 망각 게이트, 출력 게이트를 추가하여 장기 의존성 문제를 해결하고자 한다.
이러한 LSTM의 구조는 다음의 그림과 같다.
기본적으로 입력층, 은닉층, 출력층이 연속된 시퀀스의 형태인 것은 RNN과 동일하다.
다만, 은닉층에서의 내부구조가 더 복잡하게 설계되어 있는 것을 알 수 있다.
내부 구조에서는 입력 게이트, 망각 게이트, 출력 게이트를 통해 불필요한 정보를 지우고 필요한 정보를 기억하도록 하는 필터링 역할을 수행한다.
위의 그림에서 파란색으로 표기된 $w_x, w_h, w_y$는 RNN에서의 그림과 동일하게 각각 입력 가중치, 은닉 가중치, 출력 가중치를 의미하며
빨간색으로 표기된 $h_t$는 $t$ 시점에서의 은닉 벡터이다.
그리고 RNN에서는 없던 초록색의 $c_t$는 $t$ 시점에서의 셀 (cell) 벡터를 의미한다.
#. 그림에서 간결한 표현을 위해 bias는 별도로 그림에 포함하지 않았다.
셀 벡터는 LSTM의 게이트 메커니즘의 계산을 통해 구해집니다.
이 때 생성되는 이전 시점 $c_{t-1}$은 RNN에서 히든 벡터 $h_{t-1}$가 시점 $t$의 입력 벡터 $x_t$와 함께 입력되는 것처럼 LSTM에서는 $c_{t-1}$를 함께 입력합니다.
즉, LSTM에서 시점 $t$에 입력되는 벡터는 총 $x_t$, $h_{t-1}$, $c_{t-1}$로 세 가지가 됩니다.
이제 게이트 메커니즘의 세 가지 게이트를 각각 살펴볼 것이며
이 때 세 가지 게이트(입력 게이트, 망각 게이트, 출력 게이트)는 모두 sigmoid $\sigma$함수를 사용한다.
sigmoid 함수를 통해 0과 1 사이의 값을 출력하게 되고 이러한 값들을 통해 게이트의 정보량을 조절하게 된다.
첫 번째로 입력 게이트(input gate) 이다.
위의 그림은 LSTM에서 입력 게이트 부분에 해당한다.
입력 게이트는 입력으로 들어온 입력 벡터 (입력 토큰)에 대한 정보를 기억하는 역할을 한다.
입력 게이트는 두 가지 연산을 수행한다.
- $i_t = \sigma(w_{xi}x_{t} + w_{hi}h_{t-1} + b_{i})$
- $g_t = tanh(w_{xg}x_{t} + w_{hg}h_{t-1} + b_{g})$
$i_t$는 시점 $t$에 대한 입력 벡터 $x_t$와 이에 대한 입력 가중치 $w_{xi}$를 곱한 값과 이전 시점 $t-1$로부터 전달되는 은닉 벡터 $h_{t-1}$과 이에 대한 은닉 가중치 $w_{hi}$를 곱한 값을 더하여 $sigmoid$를 거쳐 연산된다.
#. $sigmoid$를 거쳐 0과 1 사이의 값으로 출력된다.
그리고 $g_{t}$도 유사한 방식으로 시점 $t$에 대한 입력 벡터 $x_t$와 이에 대한 입력 가중치 $w_{xg}$를 곱한 값과 이전 시점 $t-1$로부터 전달되는 은닉 벡터 $h_{t-1}$과 이에 대한 은닉 가중치 $w_{hg}$를 곱한 값을 더한 후 $tanh$를 거쳐 연산된다.
#. $tanh$를 거쳐 -1과 1 사이의 값으로 출력된다.
#. 위에서 $i_t$와 $g_t$는 각 게이트에서 수행되는 연산으로써 가중치를 별도로 표기하기 위해 $w_{xi}$와 $w_{hi}$, $w_{xg}$와 $w_{hg}$로 각각 표기하였다.
즉, 입력 게이트에서 $i_t$와 $g_t$의 두 가지 값을 얻게 된다.
두 번째로 망각 게이트(forget gate) 이다.
망각 게이트는 불필요한 정보를 삭제하기 위한 게이트이다.
입력 게이트의 연산과 동일한 방식으로,
망각 게이트에 대하여 $t$ 시점에서의 입력 벡터 $x_t$와 입력 가중치 $w_{xf}$를 곱하고 이전 시점 $t-1$에서 전달되는 은닉 벡터 $h_{t-1}$과 은닉 가중치 $w_{hf}$를 곱한 값을 더한 후 $sigmoid$를 거치는 방식으로 연산된다.
즉, 망각 게이트에서 $f_{t} = \sigma(w_{xf}x_{t} + w_{hf}h_{t-1} + b_{f})$를 출력한다.
$sigmoid$를 통해 0과 1 사이의 값이 출력되는데,
해당 값이 0에 가까울 수록 정보를 많이 삭제하고 1에 가까울수록 정보를 기억하도록 한다.
이러한 값을 통해 셀 상태를 구하게 된다.
다음으로 출력 게이트를 알기 이전에 셀 상태 (cell state)에 대하여 알아보면,
아래의 그림과 같다.
식으로 살펴보면 다음과 같다.
$c_{t} = f_{t} \circ c_{t-1} + i_{t} \circ g_{t}$
우선 입력 게이트로부터 연산된 두 개의 값 $i_t$와 $g_t$를 원소 곱 $\circ$을 하도록 한다.
#. 원소 곱(entrywise product): 동일한 크기의 두 행렬에서 같은 위치의 원소끼리의 곱
이렇게 계산되는 $i_t \circ g_t$는 해당 시점에서 기억할 정보가 된다.
입력 게이트를 통해 연산되는 두 개의 값을 연산하기 이전에
셀 상태(cell state)는 이미 망각 게이트에서 삭제할 정보와 기억할 정보를 추출한 일부의 정보만을 받아 이전 시점 $t-1$로부터 받은 셀 상태의 값과 곱하여 $c_{t-1} \circ f_{t}$를 얻는다.
즉, 현재 시점에서 셀 상태는 $f_t$와 $i_t \circ g_t$의 결과 값을 받게 되고 이 두 값을 더한다.
두 값을 더하여 얻어진 $c_t$를 시점 $t$에 대한 셀 상태라고 하며 이는 또다시 다음 시점 $t+1$로 전달된다.
셀 상태의 계산을 위한 입력 게이트와 망각 게이트 간의 상관관계를 정리해보면,
만약 입력 게이트의 값이 0일 경우 $c_{t}$는 $f_t \circ c_{t-1}$의 연산으로 이전 시점의 셀 상태 $c_{t-1}$와 망각 게이트의 영향을 받아 이전 시점의 정보에 의존하게 된다.
반대로 망각 게이트의 값이 0일 경우 $c_{t}$는 $i_{i} \circ g_{t}$의 연산으로 입력 게이트의 값만을 고려하게 되고
이전 셀 상태 $c_{t-1}$에서의 정보를 고려하지 않게 되어 오직 현재 시점을 통한 정보에 의존하게 된다.
즉, 망각 게이트의 값은 얼마나 이전 시점의 정보를 반영할 것인지를 의미하고
입력 게이트의 값은 얼마나 현재 시점의 정보를 반영할 것인지를 의미한다.
마지막으로 출력 게이트(output gate) 이다.
출력 게이트는 현재 시점 $t$의 은닉 벡터 $h_{t}$를 결정하는 게이트이다.
우선 출력 게이트에 대하여 입력 벡터 $x_t$와 입력 가중치 $w_{xo}$를 곱한 값과 이전 시점의 은닉 벡터 $h_{t-1}$과 은닉 가중치 $w_{ho}$를 곱한 값을 더하여 $sigma$를 거쳐 $o_t$를 연산한다.
$o_t = \sigma(w_{xo}x_t + w_{ho}h_{t-1} + b_o)$
출력 게이트를 통해 연산된 $o_t$는 셀 상태 (cell state)의 연산 값 $c_t$을 $tanh$에 거친 값 (-1과 1 사이의 값)과 연산하여 $h_{t}$를 도출한다.
즉, $h_{t} = o_{t} \circ tanh(c_{t})$이 된다.
이 때 $h_{t}$는 출력 게이트 값 $o_t$와 셀 상태의 연산 값 $c_{t}$의 정보를 함께 연산함으로써
정보의 양을 조절한 효과를 얻게 된다.
또한, $h_{t}$는 다음 시점 $t+1$를 위한 은닉 벡터뿐만 아니라 출력층으로 도출되어 현재 시점에 대한 예측값을 출력한다.
[참고자료] wikidocs.net/22888
'NLP' 카테고리의 다른 글
Attention Mechanism (0) | 2020.12.08 |
---|---|
Sequence to Sequence (0) | 2020.12.08 |
순환신경망: RNN(Recurrent Neural Network) (0) | 2020.11.16 |
문서 유사도: 코사인 유사도, 자카드 유사도, 유클리드 거리 (0) | 2020.10.19 |
Word Representation: TF-IDF (0) | 2020.10.15 |