일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- GPT-1
- Conversation System
- BELU
- KLUE
- huggingface
- Prompt Tuning with Rules for Text Classification
- 취업
- multi-head attention
- Transformer
- MT-DNN
- text classification
- scaled dot-product attention
- Chatbot
- layer normalization
- FSML
- boj
- KLUE-RE
- 백준
- bert
- Relation Extraction
- Transformers
- fine-tuning
- NLP
- BLEU Score
- beam search
- Dialogue System
- Eliza
- BoostCamp
- ai-tech
- pytorch
- Today
- Total
dukim's blog
[WK07-Day033][21.09.16.Thu] BERT, MT-DNN, GPT-3, ALBERT, ELECTRA, ETC 본문
[WK07-Day033][21.09.16.Thu] BERT, MT-DNN, GPT-3, ALBERT, ELECTRA, ETC
eliza.dukim 2021. 9. 27. 06:43Intro
- 강의에서 소개된 논문 + 멘토링에서 다룬 논문 요약
학습 내용
[논문 읽기 모임] BERT, MT-DNN
BERT
- Devlin et al., BERT : Pre-training of deep bidirectional transformers for language understanding, NAACL 2019
BERT vs GPT-1 vs ELMo
- BERT는 단방향이 아닌 양방향 학습을 통해 성능을 높임(Transformer의 Encoder 사용)
- ELMo는 bi-LM을 사용하지만 중간 레이어는 단방향이므로 Shallow Bi-directional
- GPT-1은 단어 시퀀스를 단방향으로 학습(Causal LM)
주요 특징
- Special token : [CLS], [SEP], [MASK], [PAD]
- 참고: GPT-1은 special token을 fine-tuning시만 사용하지만 BERT는 pre-training에서도 사용
- BERT 모델 입력 : 토큰 임베딩 + 세그먼트 임베딩 + 포지션 임베딩
- FFN에서 ReLU 대신 GeLU
- WordPiece Tokenizer
Pre-training task
Masked Language Modeling(MLM, a.k.a. Cloze test)
- 빈칸 넣기 과제, 양방향 학습이 가능해짐
- GPT의 경우엔 예측해야할 단어들(현재 시점 이후의 단어)간의 attention이 불가능하지만, BERT는 모든 단어에 대해 attention 계산 가능
- 입력된 토큰 시퀀스 중 15% 토큰에 대하여 다음과 같은 처리를 하고 원래의 토큰을 예측하도록 함
- 80% : [MASK] 토큰으로 대체
- 10% : 임의의 토큰으로 대체
- 10% : 그대로 둠
- 2, 3번째와 같은 처리를 한 이유: [MASK] 토큰이 downstream task에서는 등장하지 않기 떄문에 pre-training 방식과 실제 적용과의 불일치가 발생함. 이를 보완하기 위한 장치, 이후 XLNet에서는 이마저도 적절한 방식이 아니라고 지적하면서 새로운 방식을 제안
- 전체의 15% 토큰에 대해서만 학습이 이뤄지므로 left-to-right 방식의 GPT 보다 느리게 수렴함, 이후 ELECTRA에서 이에 대한 해결책을 제시함
- 코드 상에서 Token-level classification
Next Sentence Prediction(NSP)
- 두 문장이 서로 연속된 문장인지 여부 판단
- 절반은 True, 나머지 절반은 False(다른 문서에서 추출한 문장)
- 코드 상에서 pooler layer가 [CLS] token의 hidden states로 학습(
IsNext
,NoNext
)
Pre-training 절차
- Batch size : 256 sequence * 512 tokens = 128,000 tokens/batch)
- Step : 1,000,000 steps(Epoch로 환산시 3.3B word corpus에 대해 약 40 epoch)
- Optimizer : Adam with learning rate = 1e-4, $\beta_1 = 0.9, \beta_2 = 0.999$
- L2 Weight decay : 0.01
- Learning rate schedule : linear decay, warm-up over the first 10,000 steps
- Dropout : 0.1 for all layers
- Loss : meaned MLM loss + NSP loss
- 학습 속도를 높이기 위해 pre-train의 처음 90% steps 동안은 max seq len 128, 나머지 10% steps 동안엔 512
Fine-tuning 절차
대부분 pre-training과 동일한 hyperparameter 사용
- batch size, learning rate, epochs 제외
- search space
- batch size : 16, 32
- learning rate(Adam): 5e-5, 3e-5, 2e-5
- number of epochs: 2, 3, 4
- downstream task의 data set이 클수록(100K+ samples), hyperparameter에 덜 민감함
sequential-level tasks: (a), (b) : [CLS] 토큰의 마지막 hidden state 벡터를 classifier layer의 입력으로 사용
token-level tasks: (c), (d) : (c): 각 토큰이 문제 풀이와 관련 있는 시작점인지, 끝점인지를 예측, (d)는 각 위치에 해당하는 entity class를 예측
Results
11개 NLP tasks에 대해 제시(GLUE 8개 + SQuAD v1.1 + SQuAD v2.0, SWAG)
GLUE
- 모든 Task에서 기존 SoTA였던 GPT를 뛰어넘음
- 모든 Task에서 기존 SoTA였던 GPT를 뛰어넘음
SQuAD v1.1
Wikipedia에 대해서 수집한 100k 개의 질문 답변 쌍으로, 주어진 질문에 대한 답을 지문 안에서 시작점과 끝점의 위치를 찾는 task
[CLS] Question [SEP] Passage [SEP]
의 형태로 모델에 입력fine-tuning 단계에서 start vector $S \in \mathbb{R}^H$, end vector $E \in \mathbb{R}^H$를 도입, paragrah 내의 단어 $i$의 마지막 hidden state vector를 $T_i$라 할 때, paragrah 내의 모든 단어에 대해 다음과 같이 softmax를 계산
- 단어 $i$가 시작점일 확률 $P_i = \frac{e^{S \cdot T_i}}{\sum_j S \cdot T_j}$
- 단어 $i$가 끝점일 확률 $P_i = \frac{e^{E \cdot T_i}}{\sum_j E \cdot T_j}$
i 부터 j까지의 span의 점수 : $S \cdot T_i$, where $i \ge j$, 이것의 값이 가장 큰 것을 정답으로 선택
training objective : 정답인 시작점과 끝점의 log-likelihood 가 최대가 되도록 학습
hyperparameter : learning rate 5e-5, batch size 32, epoch 3
data augementation : TriviaQA dataset으로 학습한 다음 다시 SQuAD에 대해 학습, 적용시 F1 score에서 0.1-0.4점 정도의 근소한 차로 점수 상승
SQuAD v2.0
SQuAD v1.1의 확장판으로 지문 내에 답이 없는 경우도 존재
정답이 없는 경우의 확률을 위의 방식에서 지문 내에 각 단어의 임베딩 $T_i$에 대해 확률을 계산하듯이,
[CLS]
토큰 임베딩 $C$의 확률을 계산하는 방식으로 처리, $s_{null} = S \cdot C + E \cdot C$정답이 있을 경우의 확률을 기존 방식대로 계산($\hat{s_{i,j}} = \text{max}_ {j \ge i} S \cdot T_{i} + E \cdot T_j$)하고, 다음과 같이 $\hat{s_{i,j}}$과 대소 비교하여 정답 존재 여부를 예측함.
$\hat{s_{i,j}} > s_{null} + \tau$ 여기서 $\tau$는 threshold로 dev set의 F1을 최대화하도록 설정하는 hyperparameter
hyperparameter : learning rate 5e-5, batch size 48, epoch 2
TriviaQA는 사용하지 않음
SWAG
The Situations With Adversarial Generations(SWAG)
113k 개의 문장쌍 완성 과제로, 일반 상식에 기반한 추론 능력을 평가
주어진 문장에 이어질 4가지 후보 문장 중 가장 적절한 것을 선택
[CLS] given sentence [SEP] possible continuation_# [SEP]
의 형태로 모델에 입력각 후보 문장에 대해
[CLS]
토큰의 임베딩 벡터를 구한 뒤 task-specific parameter vector에 내적하여 각각의 점수를 구하고, softmax layer로 normalize하여 최종 분류hyperparameter : learning rate 2e-5, batch size 16, epoch 3
Ablation studies
- 다음 내용을 다루고 있지만 지금 이걸 살펴볼 이유는 없을 것 같다. 항목만 파악해두고 스킵
- Pre-training task의 효과를 세 가지 조건(NSP, No NSP, Left-To-Right & No NSP)으로 비교
- 모델 사이즈의 효과
- ELMo 처럼 Feature-based Approach로 사용하는 경우
MT-DNN
- Liu et al., Multi-Task Deep Neural Networks for Natural Language Understanding, ACL 2019
- BERT + Multi-Task Learning
- Pre-trained 된 BERT에 여러 종류의 NLU tasks를 Multi-Task Learning 시킴
- (코멘트) 각각의 Task를 입출력 양식에 따라 4개의 Cluster로 만들어 학습한 점이 특이했다
MT-DNN Architecture
Training a MT-DNN model
Results
- Summary of the benchmark dataset : GLUE, SNLI and SciTail
- 각 데이터셋에 대한 크기, label 수 및 평가지표
- (코멘트) BERT 논문의 실험결과에 WNLI가 제외되었던 이유는 당시 GLUE 리더보드에서 발생한 이슈 때문(데이터셋 구성상의 실수로 하나의 majority class로 예측하면 accuracy가 65.1%가 나오는데, 제출한 모든 모델이 이를 넘지 못함, BERT에서도 majority class로만 예측한 결과를 제출함)
- 성능 평가 결과 기존 BERT의 성능을 능가함, 여기서 $\text{MT-DNN}_{no-fine-tune}$은 multi-task-learning으로 학습할 때 사용했던 head layer를 그대로 사용한 결과이며, 일반 MT-DNN은 각 task 별로 다시 head-layer를 초기화하여 학습한 모델
[강의 내용] GPT-3, ALBERT, ETC.
GPT-3
- Brown et al., Language Models are Few-show Learners, NeurIPS 2020
- LM의 규모를 키울수록 모든 task에서 few-shot 성능이 높아진다는 것을 보여줌
- T5가 11B, Turing-NLG가 17B 였는데, 175B parameter의 모델을 제시함
- 너무 길어서(40 + 32 pages) 강의에 소개된 요약 내용만 정리, 추후 읽어야할 논문
Model Architecture
GPT-2와 구조 동일(modified initialization, pre-normalization, reversible tokenization 포함), 단 Sparse Transformer와 비슷하게 dense와 locally banded sparse attention pattern을 transformer layers에 사용
96 Attention layers, 12888 Hidden-dim, 96 Attention heads, 3.2M Batch size
큰 모델에 대해서는 더 큰 배치를 사용하되 learning rate는 줄임(참고 자료 - lunit 기술 블로그 - Batch Size in Deep Learning)
Summary
- Prompt: the prefix given to the model
- Prompt에 제시되는 예시의 개수에 따라 zero-shot, one-shot, few-shot
- 모델 규모가 커짐에따라 성능이 향상되며, 제시되는 예시의 수가 많을 수록 큰 폭으로 증가
ALBERT
- Lan et al., ALBERT: A LITE BERT FOR SELF-SUPERVISED LEARNING OF LANGUAGE REPRESENTATIONS, ICLR 2020
- 규모가 큰 NLP 모델을 큰 성능 손실 없이 경량화하는 연구
- 모델 규모를 줄이기 위한 기법 제안
- Factorized Embedding Parameterization
- Cross-layer Parameter Sharing
- Pre-training objective로 기존 NSP 대신 SOP(Sentence Order Prediction) 제안
- Large 모델의 경우 동일 데이터셋에 대해 BERT 보다 1.7배 빠른 학습
Factorized Embedding Parameterization
- PLM에서 embedding parameter는 모델 전체 parameter 중에서 상당수를 차지함
- 이를 줄이기 위해서 Embedding layer의 각 token의 dimension을 factorization technique으로 줄임
- 아래 그림에서 V를 vocab size, H를 hidden-state dimension, E를 word embedding dimension이라 할 떄, 다음과 같이 E를 줄이고, 여기에 학습가능한 weight matrix를 곱한 값을 embedding vector로 사용
- 예를 들어 V = 30,000, H = 768, E = 128 이라 할 때
- 기존 embedding layer의 parameter 수 : 30,000 * 768 = 23,.040,000
- ALBERT의 embedding layer의 parameter 수 : 30,000 * 128 + 128 * 768 = 3,938,304
Cross-layer Parameter Sharing
모든 n개의 Transformer block을 동일한 parameter로 사용하여 parameter 수를 줄임
아래 세 가지 조건을 실험한 결과, 모든 조건에서 성능 하락이 있었으나 Factorized Embedding Parameterization을 사용한 조건($E=128$)에서는 성능 하락 폭이 적었고(-1.5 on Avg), 특히 Shared-Attention 조건에서 성능하락이 제일 적었다.
- Shared-FFN: Transformer block 간에 Feed-Forward Network parameters 만을 sharing
- Shared-Attention: Transformer block 간에 Attention parameters 만을 sharing
- All-shared: 위 두 조건 모두 적용
Sentence Order Prediction
BERT의 Next Sentence Prediction task가 지나치게 쉬운 task라 효과적이지 않음을 지적
하나의 문서 내에서 두 개의 연속된 segment의 순서를 예측(연속된 두 segment가 정상적인 순서면 True, 뒤집힌 순서면 False)
- 참고 : 전체 텍스트(문서)의 일부분을 segment라 함, 입력 형태에 대한 자세한 설명 및 비교 실험은 RoBERTa 논문 참고, ALBERT에서는 RoBERTa에서 segment pair를 이용한 방식이 다른 방식(e.g. sentence-pair 등)보다 성능에서 이점을 얻을 수 있다고 보고하여 해당 방식을 선택함
Experimental Setup
Pre-training
- Dataset : BERT와 동일(BookCorpus, English Wikipedia, 16GB of uncompressed text)
- Max seq len : 최대 512, 이보다 짧은 길이의 샘플을 10% 확률로 생성
- Tokenizer: WordPiece를 사용한 BERT와는 달리 XLNet에서 처럼 SentencePiece 사용
- MLM : SpanBERT(Joshi et al., 2019)의 n-gram masking 사용(n의 최대값 = 3)
- Batch size : 4,096
- Optimizer : LAMB, learning rate 0.00176
- 125,000 steps
- 동일 조건 비교를 위해 직접 구현한 BERT에 대해서도 동일한 셋업 사용
Fine-tuning
Results
- GLUE benchmark
- SQuAD, RACE benchmarks
ELECTRA
- Clark et al., ELECTRA: Pre-training Text Encoders as Discriminators Rather Than Generators, ICLR 2020
- ELECTRA: Efficiently Learning an Encoder that Classifies Token Replacements Accurately
- MLM pre-training objective의 한계점(전체 토큰의 15%만 학습에 이용됨, [MASK] 토큰은 downstream task에서 등장하지 않음)을 지적하며 Replaced Token Detection을 이용한 효율성 높은 방식을 제안
- (참고) BERT 파생 모델들의 pre-training objective 요약 & 비교
- BERT = MLM + NSP
- RoBERTa = MLM
- ERINIE = MLM + NSP + dEA
- ALBERT = MLM + SOP(Sentence Order Prediction)
Model Architecture
GAN 처럼 Generator와 Discriminator로 이루어져 있지만 Adversarial Learning 방식은 아니다
- Generator와 Discriminator 간에는 gradient가 전달되지 않음
Generator
- Transformer Encoder
- 기존 MLM과 동일하게 [MASK] 토큰이 무엇인지 예측
- 예측을 통해 얻은 확률분포로부터 corrupt sample을 생성하여 discriminator로 전달
Discriminator
- Transformer Encoder, 단 generator 보다 큰 모델
- Generator에서 [MASK]에 대해 대체된 토큰이 original인지 replaced인지 분류하도록 학습
- downstream task에는 generator는 버리고 discriminator만 사용됨
장점
- 최종적으로 사용하는 Discriminator의 pre-training에 [MASK] 토큰을 제외시킴
- MLM이 전체 토큰의 15%로 학습하여 학습이 느린 것과 다르게 전체 토큰에 대해 학습
- Generator가 생성한 corrupt sample은 임의로 생성한 corrupt sample 보다 더 학습에 효과적
- (코멘트) : 개인적으로 Generator를 따로 쓸거면 굳이 이렇게 할 필요 없이 임의로 대체한 걸 사용하는게 낫지 않나 의문이었는데, Generator가 같이 학습하면서 초반에는 쉬운 샘플을, 후반부에는 점점 어려운 샘플을 제시하게 된다는 점에서 의문이 풀림
Results
Replaced Token Detection pre-training을 통해 기존 모델과 동일한 step을 더 적은 연산량(FLOPs)으로 처리하며 비슷한 성능을 보임(RoBERTa-500k steps vs. ELECTRA-large 400ksteps), BERT-base와 ELECTRA-base의 경우 동일한 사이즈, 동일한 연산량에서 더 높은 성능
기존 방식 대비 더 빠르고 더 높은 성능을 보여줌
Light-weight Models
- 모델 경량화 연구
- DistillBERT(NIPS, 2019 Workshop)
- teacher model의 출력 확률분포를 soft-label로 하여 student model을 학습시킴
- TinyBERT(Findings of EMNLP 2020)
- Two-stage learning framework: pre-training 과 task-specific learning 모두 distillation
- 각 레이어의 중간 출력값에 대해서도 teacher model과 student model이 유사해지도록 학습함
Fusing Knowledge Graph into Language Model
- 기존 PLM과 Knowledge Graph를 연결하는 연구
- PLM은 문맥이나 단어 유사도 파악은 잘 하지만, 주어진 문장 이외의 추가적인 정보를 활용하는 능력은 떨어짐
- e.g. QA Task "꽃을 심기 위해서 땅을 팠다"라는 문장이 주어질 때, "땅을 무엇으로 팠는가?"라는 질문에 대해 PLM은 주어진 문장의 정보만으로는 답변하기 어려움(각 상황별 사용하는 도구에 대한 상식 추론이 어려움)
- 외부 정보나 외부 지식들이 전통적인 인공지능 분야에서 Knowledge Graph로 표현됨
- e.g. (땅, 부삽, 파다), (땅, 중장비, 파다)
- 관련 연구
과제 수행
선택과제 3 Byte-Pair Encoding
- 결국 해결하지 못 하고 과제 해설을 참고했다. 생각외로 간단한 아이디어를 사용했다. 논문에서 제시된 코드에서 vocab을 갱신할 때마다 얻게되는 쌍을
idx2word
리스트에append
하는 것
피어세션
김제우: 지난 번 피어세션 발표 때 다루지 못 했던 8강 실습 코드 리뷰
전진: 선택과제 2번 코드 리뷰, fairseq의 실행 결과 메시지에 대한 해석
오동규: 선택과제 3번 코드 리뷰
- (정규표현식) 전방 탐색, 후방 탐색
- 긍정 전방/후방 :
(?=<regex>)
,(?<=<regex>)
- 부정 전방/후방 :
(?!<regex>)
,(?<!<regex>)
- 긍정 전방/후방 :
- (정규표현식) 전방 탐색, 후방 탐색
학습 회고
- 각 논문을 정리할 때, 직접 사용할 것을 고려해서 학습 세팅과 각 모델간의 성능 비교표를 논문 요약에 포함시켰다.
- 선택과제 3 BPE에서 상당한 시간을 소요했으나 풀지 못 했고, 다른 학습 일정이 밀렸다. 잘 풀리지 않는 문제를 너무 오래 도전하는 것 보다는 시간을 정해두고 컷하는 것이 좋을 듯하다.
추후 학습할 내용
- GPT-2, GPT-3, 그리고 관련 내용으로 Sparse Transformer에 대해서도 정리가 필요하다
- ALBERT 논문에서 소개된 SpanBERT의 n-gram masking과 LAMB optimizer 그리고 RoBERTa에 대한 학습 세팅과 그 결과에 대한 정리도 필요함
- ELECTRA 논문을 훑은 수준, 세부 학습 세팅과 결과를 보며 꼼꼼히 정리해야함
- 토크나이저 간 비교, 각 모델에서 사용한 토크나이저에 대한 정리 필요