Seq2Seq Learning & Pre-trained Models - (1)
Sequence to Sequence learning
- seq2seq의 2 논문 (Sutskever et al.,2014, Cho et al., 2014)과 Jay Alamar의 블로그( https://jalammar.github.io/)를 추천
- 핵심 구성 아이디어
- 인코더: 입력 정보를 처리해 저장. 출력을 context vector라고도 함.
- 디코더: 인코더의 결과를 입력으로 받아 시퀀스로 출력.
RNN
시퀀스 데이터를 처리하기 위해 개발된 뉴럴 빌딩 블락.
입력 시퀀스와 출력 시퀀스의 길이에 따라 one2one, one2many, many2one, many2many로 나눌 수 있으며, 현재 timestamp에 대한 은닉층은 이전 timestamp에 은닉층의 파라미터를 입력받는 것이 특징이다. gradient vanishing, long term dependency, 병렬처리 등의 문제가 있다.
RNN이 기계 번역과 같은 seq2seq에 들어가게 되면, 가장 마지막 hidden state만 context vector(decoder의 input)로 사용하기 때문에 가장 마지막 input의 영향이 크고, long term의 context는 반영하기 어려운 점이 있다.
이를 위해 LSTM, GRU가 개발되어 어느정도 완화되었다.
Attention
따라서, Attention Mechanism이 등장한다. 모델이 각 input sequence 중에서 현재 output timestamp에서 중요하게 생각하는 것이 어떤 것인지를 추가적인 가중치를 통해 학습하도록 하는 것이다.
seq2seq에서는 크게 2가지 논문이 발표되었다.
- Bahadanau Attention, 2015: Attention score를 계산하는 네트워크 추가해 학습.
- Luong Attention, 2015: 학습하지 않고 context vector와 디코더의 현재 시간의 hidden state를 weighted concat해 tanh 취한다. 바다나우의 성능과 크게 다르지 않음 → 효율적.
이 때, context 벡터는 처럼 마지막 hidden state 뿐만 아니라 입력의 모든 hidden state를 context vector로 사용한다.
context 벡터는 디코더의 hidden state 벡터를 이용해 scoring된다.
이를 softmax해 디코더의 hidden state와 concat하며, concat 뒤에 디코더의 feedforward neural network의 input으로 들어가, 디코더의 해당 timestamp의 output이 출력된다.
Transformer
시퀀스를 순차적으로 처리하는 것이 아니라 한꺼번에 처리하기 때문에 병렬화가 가능하다.
- Input Embedding
word2vec, glove와 같은 pre-trained embedding 활용 가능
- Positional Encoding
위치 정보를 보존하기 위해 사용하며, sin 과 cos 함수를 이용해, 각 포지션에 해당하는 위치의 값은 0이되고 멀리갈 수록 큰 값을 가지도록 하는 함수를 이용해 행렬을 만든 뒤 이를 입력시퀀스에 더한다. 이 때, postion 인코딩은 학습하지는 않는다.
(이 후에 임베딩을 추가하는 것인지 등이 확인 필요. 원본은 학습파라미터가 없는 것으로 생각됨)
https://blog-deepest.medium.com/position-encoding의-종류와-분석-ab1816b0f62a
https://github.com/google-research/google-research/blob/master/summae/transformer.py#L327
- Encoder
이 때, Self attention에서는 각 토큰에 대해 dependency를 갖지만, FFNN 부분에서는 각 토큰들 간에 dependency가 없다.
- Self Attention
- Query: 현재 단어의 표현
- Key: 쿼리에 대한 레이블과 같은 것
- Value: value는 실제 단어의 표현
→ it이라는 단어가 나오면 실제로 이 it이 앞의 어떤 표현을 나타내는지 알 수 있게 됨
이 3가지는 임베딩 토큰에 각 Q, K, V에 해당하는 임베딩 행렬을 곱해 구한다. 토큰 임베딩이 512라면, q, k, v 벡터는 더 작게 표현되도록 64로 표현되게 한다.
이 후, q, k를 곱한 값을 통해 soft max로 현재 토큰과 다른 q, k에 해당하는 값이 얼마나 중요한 역할을 하는지
이를 행렬곱으로 나타내면, 아래와 같다.
- Multi head Attention은 위 어탠션을 여러개 둔 뒤, weight matrix를 두어 최종적으로 input sequence와 같은 차원이 되도록 한다.
이 후, 초기 입력을 더하고(Residual) layer norm을 취한다.
- Point wise Feed Forward Network
이를 1D CNN을 통해 표현할 수 있으며, output channel 수를 2048, 그리고 다시 512로 해주는 것과 같다.
- Self Attention
- Decoder
- Masked Multi-head Attention
Seq2Seq와 같이 디코더에서는 뒷 부분의 score를 보면 안되기 때문에, 뒷 부분에 해당하는 score값을 모두 -inf로 설정해 계산한다.
이런 masking은 score 계산 뒤 한번에 해줄 수 있다.
- Masked Multi-head Attention
- Time Complexity
- BLEU (Bilingual Evaluation Understudy) score
ELMo - Embeddings from Language Models
- 논문 개요
다양한 NLP 모델들의 핵심요소는 사전학습된 단어 표현이다.
높은 품질의 단어 표현은 2가지를 포함해야 함
- 복잡한 단어의 특성 (ex. 구문적 의미론적 특성, syntax semantics)
- 언어학적 문맥에 따라 변해야 함 (ex. polysemy 다의어)
- ELMO 특징
각 토큰의 표현은 전체 문장에 대한 함수로 할당된다.
대용량 코퍼스를 양방향(bi-directional) LSTM을 기반한 언어모델(language model)로 학습해 토큰의 벡터로 사용한다.
토큰의 표현을 LSTM의 최종 층만 사용하는 것이 아니라, 전체 층의 결과를 선형결합하여 사용한다.
이 때, 깊은 LSTM layer는 context, 낮은 LSTM layer는 syntax(구문)에 해당하는 특징을 학습.
context나 syntax의 중요도에 (task에 따라) 유연한 결합이 가능.
위에서 s0, s1, s2는 각 level에서의 concat한 벡터들의 가중치이며, 각 가중치들은 downstream task에 따라 학습되는 파라미터이다. ex. POS 태깅 → low level(s0)의 가중치가 큼, 감성분석 → deep level의 가중치(s2)가 클 것으로 예상할 수 있음.
첫 token에 대한 representation으로는 GLoVe, Word2Vec, FastText와 같은 pre-trained된 임베딩을 사용하거나, 문자기반의 CNN표현을 새로 만들 수 있다.
- Details
ELMo의 목적은 양방향 언어모델이기 때문에 다음과 같은 로그 우도를 높이는 것이다.
이 때, 입력부분의 학습 파라미터 와 출력 부분의 학습 파라미터 는 공통으로 사용하지만, LSTM은 순방향 역방향에서의 파라미터가 각각 다르다.
- Elmo for downstream task
각 토큰은 L개의 Bi-LSTM 층이 있을 때, 2L+1개의 표현을 갖는다. 1은 char-CNN 또는 pre-trained 임베딩이다. 순방향과 역방향을 concat하면, L+1개의 표현을 갖게 된다.
L+1개의 표현 각 hidden layer에 대한 가중치는 softmax-normalized weights인 로 학습하여 정해진다. 즉 task마다, 어떤 층이 중요한지 가중치를 학습하게 된다. 또한, 는 Elmo 표현벡터를 scaling 하는 파라미터로, 이것도 학습 파라미터이다.
- Analysis
- softmax-normalized weights
성능: task에 맞게 학습하는 것 > 동등한 가중치를 갖는 것 > 가장 윗단의 hidden state 사용 > word embedding
- Down stream task에서 ELMo 표현을 어디에 사용하는가
논문에서는 down stream task의 모델의 input과 output 모두 ELMo 표현을 합치는 것이 성능이 더 좋았다.(Task에 따라 조금 다르다)
- Word sense disambiguation & Pos Tagging
단어 중의성 해소는 context를 중요하게 생각하는 task인데, biLM의 second layer > first layer의 성능을 나타내는 것을 확인할 수 있다.
Pos-Tagging은 syntax를 중요하게 생각하는 task인데, biLM의 second layer < first layer의 성능을 나타내는 것을 확인할 수 있다.
이것은 BiLM의 layer들은 서로 다른 유형의 정보를 나타내며, downstream 작업 시 모든 Layer를 포함하는 이유를 설명한다.
- Visualization of learned weights
SRL(Semantic role labeling): Who did what to whom에 답하는 것
Coref(Conference Resolution): 문장 내 대명사 “it”이 존재하고 해당 대명사가 지칭할 수 있는 명사가 많을 때, “it”이 지칭하는 정확한 대상은 무엇인가?
SNLI(The Stanford Natural Language Inference, Textual Entailment): 두 문장이 주어졌을 때, 첫 번째 문장이 두 번째 문장을 수반하는가 혹은 위배되는가?
SST-5(Sentiment analysis): 영화데이터 감성분석 5단계 긍부정
SQuAD(Q&A)
- softmax-normalized weights
- Details
GPT - Generative Pre-Training of a Language Model
- Motivation
Supervised Down Stream task를 해결하기 위해, Unlabeled Text Corpora를 잘 활용하자
- ELMo vs. GPT
ELMo와 다르게 트랜스포머의 디코더의 앞 부분만 사용
- GPT 구조
- GPT Unsupervised LM
목적: L1 최대화
- 모델 구조
- Supervised Fine-tuning
- 라벨링된 데이터셋 C는 입력 시퀀스 와 상응하는 라벨을 이라 한다.
이 입력을 위에서 사전학습된 모델을 지나 나온 최종 transformer block에 나온 값을 이라 하면, linear layer의 파라미터 를 지나 아래와 같이 표현할 수 있다.
- 이는 아래 로그 가능도를 최대화하는 문제이다
- 이 때, 추가로 기존 사전학습된 부분을 아래와 같이 의 크기 제한을 두고, 라벨링 데이터셋을 함께하는 경우, 일반화 성능이 향상되고 수렴이 빨라진다.
이를 auxiliary objective를 추가했다고 한다.
- 라벨링된 데이터셋 C는 입력 시퀀스 와 상응하는 라벨을 이라 한다.
- Task에 따른 GPT의 입력 형태
- Analysis
- Transformer layer 수에 따른 성능, 사전학습 업데이트 횟수와 task에 따른 LSTM과 트랜스포머 성능 비교(zero-shot 성능)
특히, 오른쪽은 이러한 generative pre-training(LM을 사전학습하는 것)을 학습할 수록이 다양한 task의 학습을 지원하며, zero-shot 성능을 안정화하게 된다. 또한 트랜스포머기반 사전학습은 LSTM보다 zero-shot 성능의 분산이 작았다.
- Ablation study: 조건을 제거해가며, 성능 변화 확인
auxiliary 목적 추가 + 사전학습, 사전학습 제외, aux목적 제외, LSTM + aux 목적의 결과이다. 데이터셋이 작은 왼쪽 4개에서는 aux목적을 추가하지 않는 것이 성능이 더 좋았고, 사전학습 유무가 큰 성능 변화를 가져오는 것을 확인할 수 있다.
- Transformer layer 수에 따른 성능, 사전학습 업데이트 횟수와 task에 따른 LSTM과 트랜스포머 성능 비교(zero-shot 성능)
- GPT Unsupervised LM
References
- Lectures: https://www.youtube.com/watch?v=0lgWzluKq1k&list=PLetSlH8YjIfVzHuSXtG4jAC2zbEAErXWm&index=16
- BLEU Score: https://donghwa-kim.github.io/BLEU.html
- Jay Alammer Blog: https://jalammar.github.io/
- Seq2Seq:
- Transformer: https://arxiv.org/pdf/1706.03762.pdf
- ELMo: