논문 리뷰: ERNIE-GEN
논문 정보 (URL, 저자 등)
Baidu
개요
•
Self-Supervisied Generation 모델을 학습할 때 직전 Ground-Truth 토큰을 입력으로 주는 것이 문제가 있다고 주장 (Teacher Forcing 을 사용 함으로서 발생하는 학습과 추론 사이의 괴리)
◦
실제로 inference 를 할 때에는 이전 단어를 생성해서 이를 다시 입력으로 넣어 주는데, 이 때 단어가 잘못 생성되면 그 뒤의 문장들이 크게 영향을 받음.
◦
하지만 학습 과정에서는 teacher forcing 을 사용하기 때문에 학습 과정에서 이러한 문제가 발생하지 않음
•
Infilling Generation
◦
어떤 토큰을 decoding 할 때에 직전 ground-truth 단어를 입력으로 넣어 주지 않고, [ATTN] 단어를 넣어줌
◦
[ATTN] 단어를 넣어 줌으로서 모델이 decoding 시에 마지막 단어에 집중하는 것이 아닌, 전체 문맥에 보다 집중을 하는 효과를 강제로 만들수 있음
◦
단어가 실수로 잘못 생성 됨으로서 발생하는 error propagation 을 문제를 어느정도 개선시킬 수 있음
•
Noise-Aware generation
◦
T 번째 토큰을 예측할 때 이전에 추론된 T-1 ~ 0 번째 토큰을 입력으로 넣어 주는 방식이 대부분임
◦
이 방법은 T-1 ~ 0 번째 토큰들 중에서 일부분을 random 토큰으로 치환하는 방법.
◦
효과 : decoding 실수를 하는 상황에 익숙하게 만들어, 앞의 턴의 토큰들이 잘못 생성 되었더라도 이후 토큰들의 문장들을 잘 생성할 수 있도록 학습할 수 있음.
•
Span-by-Span Generation Task
◦
pretraining 과 fine-tuning 시에 masking 된 span을 한번에 예측하도록 학습을 진행함 (예 span 이 3개의 토큰으로 이루어져 있으면, 한번에 3개의 토큰을 모두 예측해야 함)
◦
semantically-complete span 예측을 학습 함으로서 보다 사람 같은 텍스트를 생성할 수 있도록 하였음.
◦
예측할 대상의 span 을 추출할 때에는 random 하게 추출하지 않고, 미리 대량의 bi-gram, tri-gram, unigram vocab 을 만들어 놓고, 랜덤하게 뽑힌 span 이 해당 vocab 에 속하는 경우에만 span 으로 사용함
◦
word-by-word generation task 와 같이 joint learning 을 함.
모델
전체 학습 구조
•
Pretraining
1.
Pretraining 시에 Masking 할 Fragment 들을 Sampling 합니다.
2.
T번째 토큰을 Decoding 시에 입력으로 줄 T-1~0 번째 토큰에 Noise 를 줍니다 (random replace)
3.
학습 시에 span-by-span / word-by-word infilling generation 을 multi-task 로 학습합니다.
•
Fine-tuning
1.
위 과정으로 학습된 Pretraining 모델을 사용합니다.
2.
T번째 토큰을 Decoding 시에 입력으로 줄 T-1~0 번째 토큰에 Noise 를 줍니다 (random replace)
3.
Pretraining 과 다르게 masking 과정 없이 바로 target 문장을 생성합니다.
1. Multi-Granularity Target Fragments (마스킹 할 대상 선정)
•
여러 개의 span fragments 들을 샘플링 하는(Masking 할 대상을 선정하는) 작업이 필요로 함.
•
Multi-Granularity 는 큰 뜻은 아니고, 여러 세그먼트를 예측 + 다양한 길이의 토큰의 의미 인거 같음
•
P = {U(1, 4), U(4, 32)} 로 랜덤 길이 분포를 설정하고, 각각 0.4 , 0.6의 확률로 두 분포중 하나에서 길이를 뽑음. 첫번째 길이 1~4 는 짧은 세그먼트를 위한 분포이며 4~32 는 긴 세그먼트를 위한 분포
•
작은 fragment 를 통해서는 단어 간의 sementic 한 관계를 배울 수 있음
•
긴 fragment 를 통해서는 자주 사용하는 표현이나 문장들을 배울 수 있음
•
Masking 된 Fragment 들은 [MASK] 토큰으로 치환하지 않고, 그냥 Source Sequence 에서 삭제
2. Infilling-Generation (마스킹된 대상을 Decoding)
•
이렇게 뽑은 Segment 에 대해서 원본 텍스트 S 에서 Masking 을 진행하여 S' 을 만듬
•
MASS 나 UniLM 과 다르게 하나의 fragment 만 예측하는 것이 아니라, 여러개의 fragment 를 예측함
•
예측하고자 하는 Segment 의 Position id 를 Decoding 시에 입력으로 넣어 줌
3. Multi-Flow Attention (Word-by-Word Decoding + Span-by-Span Decoding)
•
span-by-span prediction 에서 attention mask로 에서 동일한 span 끼리는 참조하지 못하게 만듬
•
입력 문장 S, 이전 턴의 토큰들을 Key, Value 로 주고 Query 로 Decoding 하고자 하는 위치의 [ATTN] Embedding + Position Embedding 을 넣어 줌
•
(도와주세요 ㅠㅠ) 왜 a에 대한 representation 을 따로 계산하는지 모르겠음. t로 decoding 하면 안되나?
4. Infilling Decoding
5. Training Objective
데이터
Pretraining
•
Wikipedia + BookCorpus = totaling 16GB (BERT, UniLM 과 동일)
•
Nvidia Tesla V100 GPU x 32 장으로 4일 학습 (Base 모델)
•
Nvidia Tesla V100 GPU x 64 장으로 7일 학습 (Large 모델)
Fine-Tuning
총 5가지 테스크에 대해서 성능 실험을 진행하였음.
•
Gigaword Dataset (Summarization, headline generation)
•
CNN/Daily Mail (Summarization)
•
SQuAD Question Generation
•
Persona-Chat (Dialog Generation)
•
CoQa (Dialog QA Geneation)
실험
Gigaword Dataset
•
10k training samples:
◦
동일한 데이터, 동일한 모델 크기 (UniLM, 340 param, 16G Data) 임에도 월등한 성능을 보임
•
3.8M training samples
◦
PEGASUS(3.8T) 보다 적은 양의 데이터(16G)와 파라미터를 사용했음에도 불구하고 성능이 높음
CNN/Daily Mail
•
본 테스크에서도 UniLM, MASS 보다도 성능이 우수하고, 심지어 T5 (11B 파라미터) 보다도 성능이 좋음.
SQuAD Queestion Generation
Persona-Chat
CoQA
Ablation Study
•
위에서 제시한 각 방법들이 얼마나 효과가 있는지 검증하는 실험을 진행하였음.
•
a) 실험에서는 Infilling Generation 방법과 일반적인 generation 방법간의 성능 비교
•
b) 실험에서는 Noise-Aware Generation 방법과 일반적인 generation 방법간의 성능 비교
•
c) 실험에서는 ERNIE-GEN 에서 각각 Noise-Aware generation, Infilling Generation 을 제외했을 때 성능
관련된 논문
•
MASS 와 UniLM
◦
encoder와 decoder 를 다른 self-supervised task 에 대해 jointly pretraining 하는 방법에 집중하고 있음. 하지만 이 논문들은 exposure bias (학습과 추론간의 불일치) 에 대한 이슈를 다루지 않았음
◦
두 논문은 n-gram masking 을 진행할 때, 하나의 n-gram segment 만 masking 하여 예측을 하였음. 본 논문에서는 여러개의 segment 가 타겟으로 지정될 수 있음.