LM(Languge Model, 언어 모델)
LM
- 언어 모델: 문장과 같은 단어 시퀀스에서 각 단어의 확률을 계산하는 모델
- Word2Vec 또한 여러가지 언어모델 중 하나이다.
- $l$개의 단어로 구성된 문장은 아래와 같이 나타낼 수 있다.
- CBoW가 target word를 예측할 확률 $P(w_t)$ 는 아래와 같이 나타낼 수 있다.
- Word2Vec이 나오기 전까지 많은 언어 모델은 목표 단어 왼쪽의 단어만을 고려하여 확률을 계산했다.
- $t$번째로 단어를 예측하기 위해서 0번째부터 $t-1$번째 까지의 모든 단어 정보를 사용한다.
- $l$개의 단어로 이루어진 문장이 만들어질 확률은 아래와 같이 나타낼 수 있다.
- 위 언어 모델을 사용하여 ‘I am a student’라는 문장이 만들어질 확률을 구하면 아래와 같이 나타낼 수 있다.
- 앞 단어가 등장했을 때 특정 단어가 등장할 확률은 조건부 확률로 구하게 된다.
SLM(Statistical Language Model, 통계적 언어 모델)
- 신경망 언어 모델이 주목받기 전부터 연구되어 온 전통적인 접근 방식이다.
SLM의 확률 계산
- SLM에서는 단어의 등장 횟수를 바탕으로 조건부 확률을 계산한다.
- 전체 말뭉치의 문장 중 시작할 때 ‘I’로 시작하는 문장의 횟수를 구할 때, 전체 말뭉치의 문장이 1000개이고, 그 중 ‘I’로 시작하는 문장이 100개라면,
- ‘I’로 시작하는 100개의 문장 중 바로 다음에 ‘am’이 등장하는 문장이 50개 라면,
- 모든 조건부 확률을 구한 뒤 서로를 곱해주면 문장이 등장할 확률 $P(\text{‘I’,’am’,’a’,’student’})$ 을 구할 수 있다.
SLM의 한계점
- 횟수 기반으로 확률을 계산하기 때문에 Sparsity(희소성) 문제를 갖고 있다.
- 학습시킬 말뭉치에 등장하지 않는 표현이라면 절대 만들어 낼 수 없다.
- 실제로 사용되는 표현임에도 말뭉치에 등장하지 않았다는 이유로 많은 문장이 등장하지 못하게 되는 문제를 희소 문제라고 한다.
- 통계적 언어 모델의 이런 문제를 개선하기 위해 N-gram이나 Smooting, Back-off와 같은 방법이 고안되었다.(찾아보기)
NLM(Neural Langauge Model, 신경망 언어 모델)
- NLM에서는 횟수 기반 대신 Word2Vec이나 festText 등의 출력값인 Embedding Vector를 사용한다.
- 말뭉치에 등장하지 않더라도 의미적, 문법적으로 유사한 단어라면 선택될 수 있다.
RNN(Recurrent Neural Network, 순환 신경망)
- Sequential Data(연속형 데이터)를 처리하기 위해 고안된 신경망 구조이다.
- Sequential Data: 어떤 순서로 오느냐에 따라 단위의 의미가 달라지는 데이터(대부분의 데이터가 순차 데이터이다. 일반적으로 이미지 데이터는 속하지 않는다.)
RNN의 구조
- 3개의 화살표
- 입력 벡터가 은닉층에 들어가는 것을 나타내는 화살표
- 은닉층으로부터 출력 벡터가 생성되는 것을 나타내는 화살표
- 은닉층에서 나와 다시 은닉층으로 입력되는 것을 나타내는 화살표
- 3번 화살표는 기존 신경망에서는 없었던 과정이다.
- 이 화살표는 특정 시점에서의 은닉 벡터가 다음 시점의 입력 벡터로 다시 들어가는 과정을 나타낸다.
- 출력 벡터가 다시 입력되는 특성 때문에 ‘순환 신경망’이라는 이름이 붙었다.
- 오른쪽 그림 처럼 시점에 따라 펼쳐본다면,
- $t-1$ 시점에서는 $x_{t-1}$ 와 $h_{t-2}$가 입력되고 $o_{t-1}$ 이 출력된다.
- $t$ 시점에서는 $x_t$ 와 $h_{t-1}$ 가 입력되고 $o_t$ 이 출력된다.
- $t+1$ 시점에서는 $x_{t+1}$ 와 $h_t$ 가 입력되고 $o_{t+1}$ 이 출력된다.
- $t$ 시점의 RNN 계층은 그 계층으로의 입력 벡터 $x_t$와 1개 전의 RNN 계층의 출력 백터$h_t-1$을 받아들인다.
- 입력된 두 벡터를 바탕으로 해당 시점에서의 출력을 아래와 같이 계산한다.
- 가중치는 $W_h, W_x$ 2개가 있다.
- 각각 입력 $x$를 $h$로 변환하기 위한 $W_x$와 RNN의 은닉층의 출력을 다음 h로 변환해주는 $W_h$이다.
- $b$는 각 편향(bias)을 단순화하여 나타낸 항이다.
- 이렇게 하면 $t$ 시점에 생성되는 hidden-state 벡터인 $h_t$ 는 해당 시점까지 입력된 벡터 $x_1, x_2, \cdots, x_{t-1}, x_t$ 의 정보를 모두 가지고 있다.
- Sequential 데이터의 순서 정보를 모두 기억하기 때문에 Sequential 데이터를 다룰 때 RNN을 많이 사용한다.
1 |
|
RNN의 형태
one-to-many
- 1개의 벡터를 받아 Sequential한 벡터를 반환한다.
- 이미지를 입력받아 이를 설명하는 문장을 만들어 내는 Image Captioning에 사용된다.
many-to-one
- Sequential 벡터를 받아 1개의 벡터를 반환한다.
- 문장이 긍정인지 부정인지 판단하는 Sentiment Analysis에 사용된다.
many-to-many(1)
- Sequential 벡터를 모두 입력받은 뒤 Sequential 벡터를 출력한다.
- Seq2Seq 구조라고도 부른다.
- 번역할 문장을 입력받아 번역된 문장을 내놓는 Machine translation에 사용된다.
many-to-many(2)
- Sequential 벡터를 입력받는 즉시 Sequential 벡터를 출력한다.
- 비디오를 프레임별로 분류(Video Classification per frame)하는 곳에 사용된다.
RNN의 장점과 단점
장점
- 모델이 간단하고 어떤 길이의 Sequential data라도 처리할 수 있다.
단점
Parallelization(병렬화) 불가능
- 벡터가 순차적으로 입력된다.
- 이는 Sequential 데이터 처리를 가능하게 해주는 요인이지만, 이러한 구조는 GPU 연산의 장점인 병렬화를 불가능하게 만든다.
Exploding Gradient(기울기 폭발), Vanishing Gradient(기울기 소실)
- 치명적인 문제점은 역전파 과정에서 발생한다.
- 역전파 과정에서 RNN의 활성화 함수인 tanh의 미분값을 전달하게 되는데, tanh를 미분한 함수의 값은 아래와 같다.
- 최댓값이 1이고 (-4, 4) 이외의 범위에서는 거의 0에 가까운 값을 나타낸다.
- 문제는 역전파 과정에서 이 값을 반복해서 곱해주어야 한다는 점이다.
- 이 Recurrent가 10회, 100회 반복된다고 보면, 이 값의 10제곱, 100제곱이 식 내부로 들어가게 된다.
- Vanishing Gradient(기울기 소실)
- 만약 이 값이 0.9일 때 10제곱이 된다면 0.349가 된다.
- 이렇게 되면 시퀀스 앞쪽에 있는 hidden-state 벡터에는 역전파 정보가 거의 전달되지 않게 된다.
- Exploding Gradient(기울기 폭발)
- 만약 이 값이 1.1일 때 10제곱만해도 2.59배로 커지게 된다.
- 이렇게 되면 시퀀스 앞쪽에 있는 hidden-state 벡터에는 역전파 정보가 과하게 전달된다.
- 기울기 정보의 크기가 문제라면 적절하게 조정하여 준다면 문제를 해결할 수 있지 않을까라는 생각을 통해 고안된 것이 LSTM(Long-Short Term Memory, 장단기 기억망)이다.
LST & GRU
LSTM(Long Term Short Memory, 장단기기억망)
- RNN에 기울기 정보 크기를 조절하기 위한 Gate를 추가한 모델을 LSTM이라고 한다.
- 요즘은 RNN이라고 하면 당연히 LSTM이나 GRU를 지칭한다.
LSTM의 구조
- LSTM은 기울기 소실 문제를 해결하기 위해 3가지 Gate를 추가했다.
- forget gate ($f_t$): 과거 정보를 얼마나 유지할 것인가?
- input gate ($i_t$): 새로 입력된 정보는 얼마만큼 활용할 것인가?
- output gate ($o_t$): 두 정보를 계산하여 나온 출력 정보를 얼마만큼 넘겨줄 것인가?
- hidden-state 말고도 활성화 함수를 직접 거치지 않는 상태인 cell-state가 추가됐다.
- cell-state는 역전파 과정에서 활성화 함수를 거치지 않아 정보 손실이 없기 때문에 뒷쪽 시퀀스의 정보에 비중을 결정할 수 있으면서 동시에 앞쪽 시퀀스의 정보를 완전히 잃지 않을 수 있다.
LSTM의 역전파
LSTM의 사용
- 언어 모델 뿐만 아니라 신경망을 활용한 시계열 알고리즘에는 대부분 LSTM을 사용하고 있다.
GRU(Gated Recurrent Unit)
GRU의 특징
- LSTM에서 있었던 cell-state가 사라졌다.
- cell-state 벡터 $c_t$ 와 hidden-state 벡터 $h_t$가 하나의 벡터 $h_t$로 통일되었다.
- 하나의 Gate $z_t$가 forget, input gate를 모두 제어한다.
- $z_t$가 1이면 forget 게이트가 열리고, input 게이트가 닫히게 되는 것과 같은 효과를 나타낸다.
- 반대로 $z_t$가 0이면 input 게이트만 열리는 것과 같은 효과를 나타낸다.
- GRU 셀에서는 output 게이트가 없어졌다.
- 대신 전체 상태 벡터 $h_t$ 가 각 time-step에서 출력되며, 이전 상태의 $h_{t-1}$ 의 어느 부분이 출력될 지 새롭게 제어하는 Gate인 $r_t$ 가 추가되었다.
LSTM 코드 실습
Keras 이용 RNN/LSTM 텍스트 감정 분류
- IMDB 영화 리뷰 데이터
1 |
|
Keras 이용 LSTM 텍스트 생성기
1 |
|
RNN 구조에 Attention 적용
기존 RNN(LSTM, GRU) 기반 번역 모델의 단점
- RNN이 가진 가장 큰 단점 중 하나는 기울기 소실로부터 나타나는 장기 의존성(Long-term dependency)문제이다.
- 장기 의존성 문제란 문장이 길어질 경우 앞 단어의 정보를 일어버리게 되는 현상이다.
- 장기 의존성 문제를 해결하기 위해 나온 것이 셀 구조를 개선한 LSTM과 GRU이다.
- 기계 번역에서 기존의 RNN 기반의 모델(LSTM, GRU)이 단어를 처리하는 방법은 아래와 같다.
Attention
- 위 문제는 고정 길이의 hidden-state 벡터에 모든 단어의 의미를 담아야 한다는 점이다.
- 아무리 LSTM, GRU가 장기 의존성 문제를 개선하였더라도 문장이 매우 길어지면 모든 단어 정보를 고정 길이의 hidden-state에 담기 어렵다.
- 이런 문제를 해결하기 위해 고안된 방법이 Attention이다.
- Attention은 각 인코더의 Time-step 마다 생성되는 hidden-state 벡터를 간직한다.
- 입력 단어가 N개 라면 N개의 hidden-state 벡터를 모두 간직한다.
- 모든 단어가 입력되면 생성된 hidden-state 벡터를 모두 디코더에 넘겨준다.
검색 시스템의 아이디어
- 검색 시스템의 3단계
- 찾고자 하는 정보에 대한 Query 입력한다.
- 검색 엔진은 검색어와 가장 비슷한 key를 찾는다.
- 해당 key와 연결된 Value를 유사도 순서대로 보여준다.
디코더에서 Attention의 동작
- 디코더의 각 time-step 마다의 hidden-state 벡터는 쿼리로 작용한다.
- 인코더에서 넘어온 N개의 hidden-state 벡터를 key로 여기고 이들과의 연관성을 계산한다.
- 이 때 계산은 내적(dot-product)을 사용하고 내적의 결과를 Attention 가중치로 사용한다.
- 아래 그림은 디코더 첫 단어에 대한 어텐션 가중치가 구해지는 과정이다.
- 쿼리(보라색)로 디코더의 hidden-state 벡터, 키(주황색)로 인코더에서 넘어온 각각의 hidden-state 벡터를 준비한다.
- 각각의 벡터를 내적한 값을 구한다.
- 이 값에 softmax 함수를 취해준다.
- 소프트맥스를 취하여 나온 값에 Value(주황색)에 해당하는 인코더에서 넘어온 hidden-state 벡터를 곱해준다.
- 이 벡터를 모두 더하여 Context 벡터(파란색)를 만들어준다. 이 벡터의 성분 중에는 쿼리-키 연관성이 높은 벨류 벡터의 성분이 더 많이 들어있다.
- 최종적으로 5에서 생성된 Context 벡터와 디코더의 hidden-state 벡터를 사용하여 출력 단어를 결정하게 된다.
- 디코더는 인코더에서 넘어온 모든 hidden state 벡터에 대해 위와 같은 계산을 실시한다.
- 그렇기 때문에 Time-step마다 출력할 단어가 어떤 인코더의 어떤 단어 정보와 연관되어 있는지, 즉 어떤 단어에 집중할 지 알 수 있다.
- Attention을 활용하면 디코더가 인코더에 입력되는 모든 단어의 정보를 활용할 수 있기 때문에 장기 의존성 문제를 해결할 수 있다.
- 위 그림은 문장을 번역(Je suis etudiant -> I am a student) 했을 때, 각 단어마다의 Attention 스코어를 시각화 한 그림이다.
- 왼쪽 단어가 생성될 때 오른쪽 단어와 연관되어 있음을 확인할 수 있다.
LSTM with Attention 코드 실습
1 |
|