참고 자료
딥러닝은 라벨링이 되어있는 대량의 데이터가 존재하는 task에서 좋은 성능을 보이지만, sequence를 sequence에 매핑하는데는 사용되지 않았다. 본 논문에서는 end-to-end approach가 가능한 sequence learning 방법을 제안한다.
LSTM을 여러개 쌓은 multilayered LSTM을 사용했으며, encoder와 decoder는 각각 multilayered LSTM으로 이루어진다. Encoder는 입력 sequence를 고정된 길이의 context vector로 만들고, decoder는 context vector를 출력 sequence를 만든다.
WMT 14 dataset을 사용해 BLEU score를 측정했을 때, 본 논문에서 제안하는 Seq2Seq이 가장 높은 성능을 보였다. 학습 과정에서 입력 sequence를 거꾸로 넣었을 때 모델 성능이 더 높았다.
Deep Neural Networks(DNNs)는 높은 성능을 보이지만, 입출력 차원을 미리 알고 그 크기가 고정된 경우에만 적용할 수 있어 음성인식(speech recognition), 기계번역(machine translation)과 같은 sequential 문제에는 적용할 수 없다. 본 논문에서는 고정된 크기의 벡터를 얻는 LSTM 1개(encoder)와 해당 벡터로부터 출력 sequence를 얻는 LSTM 1개(decoder)를 사용해 sequence to sequence 문제를 해결한다.
WMT 14 dataset English to French translation task의 BLEU score를 측정했을 때, 본 논문에서 제안하는 Seq2Seq이 가장 높은 성능을 보였다. 학습 과정에서 입력 sequence를 거꾸로 넣었을 때 모델 성능이 더 좋았으며, sequence가 긴 경우에도 잘 작동했다.
LSTM: out-of-vocabulary error
SMT: 33.30 (baseline)
Seq2Seq: 34.81 → 80k vocab,
SMT + Seq2Seq: 36.5 (이전에 가장 스코어가 높은 모델은 37.0)
Recurrent Neural Network(RNN)은 T개의 입력 단어로 이루어진 입력 sequence가 주어졌을 때 T개의 단어로 이루어진 출력 sequence를 생성한다. 한 시점 t에서 hidden state를 구하는 과정은 위의 그림과 같다.
현재 시점(t)의 hidden state는 이전 시점(t-1)의 hidden state(h_t-1)와 현재 시점(t)의 입력값(x_t)을 받아 갱신된다.
RNN은 입력과 출력의 크기가 다르면 사용하기 어려운 단점이 있다. 이를 해결하기 위한 가장 단순한 방법은 RNN을 사용해 다양한 길이의 입력 sequence를 고정된 길이로 변환할 수 있다. 하지만, 학습에 RNN을 사용하면 long-term dependency 문제가 발생해 본 논문에서는 LSTM 사용을 사용했다.
1) Long-term dependency(장기 의존성)
The clouds are in the sky.
에서는 sky
를 에측할 때 관련된 정보 clouds
가 가까이 위치하기 때문에 많은 문맥을 알지 않아도 마지막 단어가 sky
라는 것을 예측할 수 있다.
하지만, I grew up in France and wanted to be a plumber who the best is in the world and speak fluent French.
와 같은 예시에서는 French
를 예측할 때는France
와 멀리 위치하기 때문에 정답임을 예측하기 쉽지 않다.
두 번째 예시 처럼 관련된 요소가 멀리 떨어져 있는 경우 sequence에 장기 의존성이 존재한다고 한다.
2) Vanishing/Exploding gradient
이전 state → 다음 state로 넘어갈 때 gradient를 조금만 작게 해도 gradient가 0에 가깝게 되고, gradient를 조금만 크게 해도 gradient가 너무 커져 gradient를 조절하기 어려운 문제를 말한다.
이를 해결하기 위해 'gradient를 상수로 넘기지 말고 gradient를 조절하는 gate를 달아서 조절하자' 아이디어로 LSTM에서는 gradient를 조절하는 gate는 단순한 activation function이 아니라 하나의 network가 들어있다.
RNN은 문장이 길어지면 역전파 시 vanishing gradient 문제 발생한다. LSTM은 RNN의 hidden state에 cell state를 추가해 문장이 길어지면서 발생하는 문제를 개선했다. 후에 attention 개념을 활용해 long-term dependency를 해결한다.
Long Short-Term Memory(LSTM)의 목표는 조건부 확률 예측(계산)이다. T개의 입력 sequence가 들어왔을 때 T’개의 출력 sequence가 나올 확률을 계산하며, 이 때 입출력 sequence의 길이는 달라도 된다. 아래 수식은 standard LSTM-LM formulation이다.
LSTM을 학습하는 과정에서 본 논문은 두 가지 방법을 사용했다.
the cat is black
의 순서인 source문장의 순서를 뒤집어 black is cat the
를 입력으로 넣는다. minimal time lag
가 감소하고, establishing communication
시간이 줄어들어 성능 향상이 있다고 본 논문에서는 추측했다. 또한, 논문에서는 영어->프랑스어 번역 task를 수행했는데 영어와 프랑스어는 어순이 비슷하기 때문에 문장 앞부분의 단어들의 거리가 가까우면 앞부분 단어 번역을 잘 수행하고, 앞부분 단어 예측을 잘 하면 뒷부분 단어 예측에도 영향을 미치기 때문이라고도 볼 수 있다.decoder가 예측한 값을 다음 input으로 활용해 예측을 진행한다.
앙상블 LSTM을 사용했을 때 최대 34.81 beam_size=2만 사용해도 충분히 높은 성능을 보인다.
SMT + LSTM을 사용했을 때 BLEU score 36.5이다.
LSTM hidden state를 PCA를 활용해 2d 시각화한 모습으로, 같은 의미의 문장끼리 클러스터링 되어있는 것을 볼 수 있다.
모델의 예측값과 정답 간의 차이를 계산한 값으로 precision, brevity penalty, clipping을 종합해 계산된다.
- Precision: n-gram을 통한 순서쌍이 얼마나 겹치는지
- Brevity penalty: 문장 길이에 따른 score 보정
- Clipping: 같은 단어가 연속적으로 나올 때 score 보정
언어 모델을 평가하기 위한 지표로 machine translation, text summarization과 같은 generation task의 성능 비교를 위해 주로 사용된다. perplexed
라는 단어는 헷갈리는
이라는 뜻으로 PPL은 수치가 낮을수록 언어 모델의 성능이 좋다.
카운트 기반 언어 모델로 이전에 등장한 모든 단어를 고려하지 않고 n개의 단어만 고려한다.
- 코퍼스에서 n개의 단어 뭉치 단위로 끊어 하나의 토큰으로 간주한다.
"For dinner I'm making __"
문장에서 빈칸에 들어갈 단어의 확률은P(burgers|For dinner I'm making)
>P(cement|For dinner I'm making)
이다.- 문장 W일 확률은 각각 N개의 단어로 이루어질 확률과 동일하다.
P(W) = P(w1, w2, ..., wN)
- unigram 모델에서는
P(W) = P(w1)*P(w2)*...,P(wN)
이다.
글 잘읽었습니다! 우선 바로 제 생각 말씀드리자면
1. 나연님의 인사이트가 리뷰글에 더 들어갔으면 좋겠다.
2. 논문 각 파트별 요약보다는 중요한 부분들을 모아 재구성한 정리였다면 더 좋지 않았을까
3. 읽게된 계기나 읽고난 후의 소감이 있으면 더 재미있는 글이 될 것 같다.
이정도가 될거 같아요. 저도 아직 논문 리뷰를 쓰는게 많이 어렵지만 이 세 부분은 꼭 하려고 노력하고 있습니다. 논문만을 정리한 글들은 흔하지만 각자의 생각을 넣은 글은 흔하지 않기 때문에 이 것이 큰 경쟁력이 되지않을까 생각해요.
안녕하세요 나연님, 김남현입니다. 글 잘 읽었습니다. 저는 부끄럽게도 딥러닝 논문을 읽어본 적이 거의 없고, AI 관련 지식은 초보 단계이지만 열심히 이해하려고 노력했습니다. 논문 내용에 관련해서 제가 말씀드릴 건 없고, 오로지 문체에 관련해서만 피드백을 드리려고 합니다.
RNN의 문제점을 다룬 부분처럼 글을 쓰셨으면 좋을 거 같습니다. 나연님께서는 나중에 이 글을 다시 보시더라도 논문 내용을 기억하기 쉽도록 글을 쓰셨다고 했습니다. 제 경험상 아무리 쉬운 내용이라도, 설령 그것이 간단한 메모라도 짧게 단어 여러 개로만 적어둔다면 몇 주 뒤에 시간이 지나서 다시 보면 제가 어떤 연유로 이러한 메모를 남겼는지 기억조차 안 날 때가 많았습니다. 더 와닿게 설명하자면 알고리즘 문제의 코드를 떠올리시면 될 것 같습니다. 복잡한 문제일수록 나연님께서 몇 주 전에 작성한 코드를 봤을 때 문제 풀이 흐름을 따라가는 상세한 주석이 없다면 코드를 보고 해석하는 데에 시간이 오래 걸릴 거예요. 저는 알고리즘 공부에 관심이 많은데, 오래 전에 풀었던 문제 중에 인상 깊었던 것을 블로그에 정리하려 할 때마다 이러한 경험을 하고 있습니다...
당장 시험 준비용으로 핵심 내용만 정리한 글이라면 이런 스타일도 괜찮겠지만, 미래에 나연님이 본인과 다른 사람에게 전달할 목적으로 쓰신 글이라면 이야기를 풀어나가는 것처럼 조금 더 상세하게 용어 설명과 특정 부분에 대한 이유를 이해하신 대로 쓰시는 편이 나을 것 같습니다.