Pytorch를 활용한 Advanced Sequence models
김성동님의 Pytorch를 활용한 딥러닝 입문 중 Advanced Sequence Model 파트 정리입니다.
Machine Translation
Statistical Machine Translation
- Source Language(X)를 토대로 Target Language(Y)로 번역하는 Task
- 예시 : 스페인어를 Input으로 넣고, Output을 영어!
목적 함수
\(argmax_yP(y|x)\)
source 문장이 주어졌을 때, 가장 좋은 Target 문장을 찾는 것
\(argmax_yP(x|y)P(y)\) 으로 식을 분해
\(P(x|y)\)는 Translation Model : 어떻게 번역하는지 학습
Parallel Corpus가 필요 (병렬 코퍼스)
\(P(y)\)는 Language Model : 어순 및 문법 보정
\(P(x|y)\)를 \(P(x,a|y)\)로 변경
여기서 \(a\)는 Alignment로 Source language와 Target language의 단어간 상호 관련성을 의미
one to one, one to many, many to many alignment가 필요
- 실제로 이 확률을 계산하기 위해서는 모든 가능한 경우의 수를 다 대조해봐야 하기 때문에 너무 비싼 연산입니다. 실제론 너무 확률적으로 낮은 것들은 무시해버리고 Heuristic Search Algorithm 사용합니다
Neural Machine Translation
Sequence to Sequence
- 번역에 Neural Network를 사용했습니다. 2014년부터 기존의 Machine Translation 성능을 엄청 끌어올렸습니다
특별히 Sequence-to-Sequence라는 새로운 형태의 뉴럴넷 구조를 사용하기 시작!
- Encoder와 Decoder 역할을 하는 2개의 RNN을 사용
- Decoder는 Encoder의 Last Hidden state를 초기 Hidden state로 사용하여 Target 문장에 대한 Language model을 학습
- <START>, <END> 토큰 : 문장의 시작과 끝을 알려주며, 디코더 입장에선 condition에 따라 디코딩을 시작하고, end 토큰이 나오면 디코딩을 멈춰라
NMT는 확률 \(P(y|x)\)을 바로 계산합니다(Statisctical에선 2개로 나눠서 계산했음)
Source 문장(x)과 이전(T-1)까지의 Target 문장이 주어졌을 때 step T에 \(y_T\)일 조건부 확률
학습
- End to End Training
- Decoder의 각 time step에서 발생한 Loss(Cross-Entropy)를 사용하여 두 모델의 파라미터를 한번에 업데이트
- torchtext에러 Field의 파라미터 eos : end of sentence, init token : start of sentence
Greedy Decoding
- 각 step에서 가장 확률이 높은 단어(토큰)를 디코딩(단어 level)
- 가장 쉽고 계산 효율적
- 문장 level의 확률을 고려하지 못함
- 한번 디코딩한 단어는 무조건 사용되어야 합니다(취소나 변경이 안됨)
- 단어 레벨에서 가장 좋은 것을 찾는 것이 반드시 올바른 문장을 만드는 것은 아닙니다
Beam Search Decoding
- 만약 Vocabulary의 크기가 V라고 할 때, 길이가 T인 문장 레벨의 모든 가능한 경우의 수를 고려하려면 \(O(V_T)\)의 계산복잡도 필요한데, 이것은 약간 비효율적인 방법
- 따라서 Beam Search Decoding을 사용
- 각 step에서 가장 확률적으로 높은 K개만 고려하자! 최종적으로 \(K^T\) 조합 중 가장 확률이 높은 시퀀스를 선택!
- Greedy Decoding
- 구현이 간단함
- 계산 효율적
- 문장 level의 확률을 고려하지 못함
- Beam Search Decoding :
- 문장 level의 확률을 고려
- 좀 더 나은 디코딩 결과(Greedy와 비교해서) 구현 어려움
- 좀 더 비싼 계산 복잡도
- 학습 시 적용 어려움? (최근 나온 논문 -> Sequence-to-Sequence Learning as Beam-Search Optimization)
성능 평가
BLEU score
- BiLingual Evaluation Understudy
- 번역 시스템이 좋은지 안 좋은지 판단할 때 accuracy, f1 metric으로 평가하면 문제가 생김 => 여러 문장으로 표현할 수 있음
- 정답을 여러가지로 제시
- Modified Precision
- 문장 각각 해당 단어를 카운트해서 그 맥스값을 분자로 사용
- 과대 평가나 중복 Count를 막을 수 있음
유니그램
바이그램
N gram
- BLEU Score는 최적의 평가 방법은 아니지만 자동 평가지표로서 매우 유용함
- 인간이 전부 정성적으로 평가하면 매우 비싸고, 그냥 일반적인 평가지표(Precision/Recall/F1/Accuracy)를 사용하면 제대로 평가할 수 없기 때문에 대안으로 사용
- 현대의 MT의 평가는 대부분 BLEU를 통해 하고 있음
- https://github.com/Maluuba/nlg-eval (직접 구현 못해도 오픈소스로 다수 존재)
Other tasks using seq2seq
- Summarization (요약) : 본문 -> 요약문
- Dialogue (대화) : 상대방의 발언 -> 봇의 발언
- Parsing (파싱) : 단순 문장 -> 파싱된 결과
- Code generation (코드 생성) : 자연어 -> 파이썬 코드
Attention
- Source Language의 정보를 하나의 고정된 벡터로 인코딩하기 때문에 디코더는 한정된 정보만 사용할 수 있습니다(Information Bottleneck!)
- 디코더의 각 step에서 Source sequence의 특정 부분에 집중하여 디코딩!
- 고정된 벡터에 의존하는게 아니라 동적으로 Source sequence를 가중합하여 디코딩에 사용합니다
- 1) 디코더의 hidden state와 인코더의 hidden states를 내적하여 attention score를 각각 구합니다
- 2) attention score에 Softmax를 사용하여 확률로 바꾼다(합이 1)
- 3) 인코더의 각 step에서 attention distribution과 hidden state를 사용하여 가중합을 구한다. ⇒ Context Vector
- 4) 디코더의 hidden state와 Attention을 사용해 구해낸 Context vector를 concat하여 디코딩!
Result
- NMT system의 성능을 엄청 상승시켰음
- (Seq2Seq를 사용하는 다른 테스크들의 성능도 상승)
- Information Bottleneck을 해결함
- Vanishing gradient 문제 역시 완화(Gradient path 증가)
- 약간의 Interpretability 얻을 수 있음(Alignment)
Advanced-Attention
Abstractive Summarization
- Text Summarization 테스크
- 본문 -> 요약문
- 기존 요약 모델들은 조금만 길게 요약하려고 하면 같은 말이나 의미의 문장을 반복하는 경향이 있었음
- NMT와 비슷하게 sequence to sequence를 사용
Intra-Temporal Attention
- 이전 디코딩 step에서 집중했던 부분은 이번 step에서는 덜 집중하게 만든다 (중복된 요약을 막는 효과)
Self Attention
- 일반적인 Attention은 Encoder와 Decoder의 hidden state 사이에서 Attention score 구했습니다
- Self Attention은 Decoder의 hidden state들 사이에서 Attention score을 구합니다
- Seq2Seq뿐만 아니라 일반적인 RNN의 구조에서 각 hidden state 간의 attention을 적용하는 방법들을 Self-Attention(Intra-Attention)이라 부름. (Hidden states 간의 Multiple Weighted Sums)
Transformer
기존 RNN의 단점
- 기존의 RNN 기반의 Sequence model은 순차적인 연산탓에 병렬화하기 어려움(=느리다)
- Long term Dependency의 문제를 해결하기 위해 Attention mechanism 사용
Transformer 사용
- 기계 번역 테스크
- Encoder - Decoder 컨셉 유지
- RNN이나 CNN 구조 사용 X
모든 것을 Self-Attention으로 처리 (Multi-Head Attention)
- Key의 개수가 많아질수록 Softmax 안에 있는 QK^T의 값의 분산이 커질 수 있어서 Key vector의 크기로 스케일링
Q = V = K Word vector들을 쌓아서 서로가 서로에게 Attention(self-Attention)
한 단어와 다른 단어 사이의 어텐션(dot-product)은 한번에 하나씩 밖에 할 수 없기 때문에 워드 벡터에 Linear 연산 후, 병렬로 다른 단어들과도 h번의 attention을 수행(Multi-Head Attention)
카일스쿨 유튜브 채널을 만들었습니다. 데이터 사이언스, 성장, 리더십, BigQuery 등을 이야기할 예정이니, 관심 있으시면 구독 부탁드립니다 :)
PM을 위한 데이터 리터러시 강의를 만들었습니다. 문제 정의, 지표, 실험 설계, 문화 만들기, 로그 설계, 회고 등을 담은 강의입니다
이 글이 도움이 되셨거나 다양한 의견이 있다면 댓글 부탁드립니다 :)