-
BART: Denoising Sequence-to-Sequence Pre-training for Natural Language Generation, Translation, and Comprehension 논문 리뷰논문 리딩 2022. 10. 23. 19:24
https://arxiv.org/abs/1910.13461
BART: Denoising Sequence-to-Sequence Pre-training for Natural Language Generation, Translation, and Comprehension
We present BART, a denoising autoencoder for pretraining sequence-to-sequence models. BART is trained by (1) corrupting text with an arbitrary noising function, and (2) learning a model to reconstruct the original text. It uses a standard Tranformer-based
arxiv.org
Abstract
- BART는 손상된 문서를 복원하는 방법으로 사전학습하는 enc-decoder 구조의 모델
- 문서를 noising 하는 다양한 방식을 제시하여 좋은 성능을 찾음
- 텍스트 생성에서 특히 효과적이지만, 텍스트 이해도 좋은 성능을 보임
- BART 프레임워크 내에서 다른 사전학습 방법들을 적용해보며 성능을 비교
Introduction
Self-supervised method는 NLP의 다양한 task에서 큰 성공을 거둠. 이 중 랜덤하게 마스킹된 토큰을 맞추는 MLM이 가장 성공적이었지만, 특정 task에만 집중하여 적용성이 떨어졌음.
- Bidirectional과 Auto-Regressive Transformer를 결합
- seq2seq 모델로 만든 denoising autoencoder
- denoising autoencoder: 입력에 랜덤 노이즈를 추가한 autoencoder
- 원본 텍스트의 길이를 바꿔버리는 등 기존보다 큰 변형을 가할 수 있음 → 더 어려운 task로 사전 학습이 가능
- 여러가지 noising 기법 중 text infiiling과 sentence shuffling을 함께 적용했을 때의 성능이 좋았다 → 이 방법은 BERT의 NSP와 word masking 기법을 일반화하여 적용한 것
- 기계 번역의 경우, BART 인코더 앞단에 추가 transformer layer를 붙이는 새로운 방법을 제시해 높은 성능을 보임
Model
1. Architecture
- 기본적인 트랜스포머 구조 + Activation으로 ReLU 대신 GeLU 사용
- Base: 6 enc layers & 6 dec layers
- Large: 12 enc layers & 12 dec layers
- BERT와의 아키텍처적 차이점
- 디코더의 각 레이어가 인코더의 마지막 hidden 레이어와 cross-attention을 수행
- BERT는 단어 예측에 FFN이 추가로 붙지만, BART는 그렇지 않다.
- BERT에 비해 10% 더 많은 파라미터
2. Pre-training
- BART는 손상된 문서를 복원하는 방법으로 사전학습된다.
- 그러나, 기존의 denoising autoencoder들과 다르게 다양한 문서 손상을 학습할 수 있다. → 극단적으로 문서 정보가 싹 없어지면 LM의 역할을 수행하게 된다.
- Token Masking
- BERT와 마찬가지로 랜덤하게 토큰을 [MASK]로 치환
- Token Deletion
- 랜덤하게 지워진 토큰의 위치를 맞추도록 학습
- Text Infilling ⭐️
- text span을 한꺼번에 하나의 [MASK]로 치환
- span의 길이는 λ=3인 푸아송 분포를 따르도록 랜덤 추출
- 0-length의 경우 [MASK] 토큰을 그대로 추가
- SpanBERT로부터 영감을 얻음
- SpanBERT는 기하분포로부터 span length 추출
- SpanBERT는 text span을 하나의 [MASK]로 치환하지 않음
- Sentence Permutation
- 문서 내에서 마침표를 기준으로 문장을 구별해낸 다음, 문장들을 랜덤하게 셔플
- Document Rotation
- 문서 내에서 한 토큰을 선정해 그 토큰으로부터 문서가 시작하게끔 앞 토큰들은 한꺼번에 뒤로 보낸다. -> 문서의 진짜 시작 토큰이 어디었는지를 맞춰야함
Fine-tuning BART
1. Sequence Classification Tasks
- 인코더와 디코더에 동일한 input을 넣어줌
- 디코더의 마지막 히든 스테이트의 마지막 디코더 토큰을 linear layer에 넣어 라벨을 분류
- Bert에서의 [CLS] 토큰과 유사
- end에 추가 토큰을 붙여 디코더의 토큰 representation이 전체 인풋에 대한 디코더 state를 잘 attend할 수 있도록 함
2. Token Classification Tasks
- 인코더와 디코더에 문서 전체를 넣어줌
- 각 단어의 representation로써 디코더의 마지막 hidden state를 사용하여 토큰을 분류
3. Sequence Generation Tasks
- 인코더는 input sequence를 전달받고, 디코더는 autoregressive하게 출력을 생성
4. Machine Translation
- 새로운 인코더 parameter를 추가하여 BART의 인코더 임베딩 레이어를 대체
- 새롭게 추가하지 않은 본래 BART 전체(인코더&디코더)를 디코더로 사용
- 새로운 인코더는 외국어를 인풋으로 받아 BART가 영어로 noise를 없앨 수 있는 수준의 아웃풋을 기존 BART의 input으로 전달
- 이 때 원래 BART가 사용하지 않던 어휘를 아웃풋으로 줘도 됨
- 학습은 두 단계로 진행
- 기존 BART의 positional embeddings, BART 인코더의 첫째 층의 self-attention을 제외하고 모두 freeze시킨 상태에서 새로운 인코더를 학습
- 적은 iter동안 모든 파라미터를 학습
Comparing Pre-training Objectives
Base 사이즈의 모델들에 동일한 데이터를 이용하여 다양한 Pre-training 방법들을 적용하는 실험 진행
1. Comparison Objectives
- Books & Wikipedia data를 이용해 1M step을 사전 학습
- Language Model (GPT)
- BART 디코더를 cross-attention 없이 GPT와 유사하게 학습
- Permuted Language Model (XLNet)
- 토큰의 1/6을 샘플링하여 랜덤한 순서로 autoregressive하게 생성
- Masked Language Model (BERT)
- 토큰의 15%를 샘플링하여 [MASK]로 바꾸고 독립적으로 각 [MASK]를 맞추도록 학습
- Multitask Masked Language Model (UniLM)
- 다양한 self-attention masks를 이용해 학습
- left2right(or right2left) masked, unmasked, 50% masked를 1:1:1의 비율로 학습
- Masked Seq-to-Seq (MASS)
- 전체의 절반 길이의 span을 마스킹하고 이를 seq2seq 모델로 예측
- 디코더에 prefix를 주어 fine-tuning하는 방법을 적용했을 때, 다른 모델들과 다르게 BART는 대체로 prefix를 주지 않는 편이 더 나았다고 한다.
2. Results
- Task에 따라 사전 학습 방법의 성능이 크게 달라진다. 잘 맞는 Task가 극명하다.
- 토큰 마스킹은 필수적이다.
- Text Infilling을 적용한 BART의 성능이 대부분 Task에서 좋았다.
Large-scale Pre-training Experiments
RoBERTa와 비슷한 large 데이터, large 모델 상황에서의 성능 측정
1. Experimental Setup
- 12 enc layers & 12 dec layers
- hidden size: 1024
- batch size: 8000
- train step: 500000
- BPE tokenizing
- text infilling & sentence permutation
- diable dropout for last 10% of training step
- data size: 160Gb
2. Discriminative Tasks
- RoBERTa와 비교해 성능이 밀리지 않음 → BART의 디코더가 분류 문제에서의 성능을 저하시키지 않음
3. Generation Tasks
- Beam size: 5로 설정
- 모든 생성 Task에서 SOTA급 성능을 보임
4. Translation
- 추가 인코더로 6-layer transformer를 사용
- Fixed와 Tuned는 각각 기존 BART 아키텍처의 freeze를 설정한 때와 해제한 때를 나타냄
Conclusions
- 손상된 문서를 복구하는 방법으로 사전 학습하는 모델인 BART를 제안
- RoBERTa와 비슷한 수준으로 분류 문제 해결 및 생성 문제에서 SOTA 달성
아래는 논문의 이해를 위해 BART의 공식 Hugging Face 코드를 참고한던 중 알게 된 사실과 의문점을 정리한 것이다.
Implementation of BART
GitHub - huggingface/transformers: 🤗 Transformers: State-of-the-art Machine Learning for Pytorch, TensorFlow, and JAX.
🤗 Transformers: State-of-the-art Machine Learning for Pytorch, TensorFlow, and JAX. - GitHub - huggingface/transformers: 🤗 Transformers: State-of-the-art Machine Learning for Pytorch, TensorFlow, a...
github.com
- BART의 공식 코드에선 decoder_input_ids를 shift_tokens_right 함수를 통해 만들어낸다.
- shift_tokens_right의 기능은 아래와 같다.
- 전달받은 input_ids를 오른쪽으로 한 칸씩 옮긴다.
- 맨 뒤 토큰은 버린다.
- 맨 앞에 eos token을 붙인다!
- 다음과 같이 정리할 수 있다. (encoder에서 마스킹을 적용했다고 가정)
user_input [<s>, _안녕, 하세요, _denver, 입니다, </s>] encoder_input [<s>, _안녕, <mask>, 입니다, </s>] decoder_input [</s>, <s>, _안녕, 하세요, _denver, 입니다] target [<s>, _안녕, 하세요, _denver, 입니다, </s>]
의문점
- 디코더 인풋의 시작이 eos_token?
- bos_token을 쓰는 상황과의 상충을 피하기 위해서라면 이해할 수 있다.
decoder_input [<s> , <s>, _안녕, 하세요, _denver, 입니다]target [<s>, _안녕, 하세요, _denver, 입니다, </s>] - 위와 같은 경우, 처음엔 bos 다음에 bos를 내보낸 후 두번째에선 bos 다음에 첫 단어를 내보내야 하기 때문 → 학습이 어려워짐
- bos_token을 쓰는 상황과의 상충을 피하기 위해서라면 이해할 수 있다.
- 그렇다면 bos_token은 반드시 필요한걸까?
- 논문에서는 bos_token에 대한 언급이 없다.
- 그러나 facebook/bart-base 등의 모델들이 기본적으로 bos를 붙이도록 토크나이징한다.
- 저자들이 pretraining 할 때 bos를 붙였을지도 궁금하다.
질문이나 잘못 기재된 내용에 대한 피드백 언제든지 환영합니다. 함께 배워나가요!
'논문 리딩' 카테고리의 다른 글
Restricting the Flow: Information Bottlenecks for Attribution 논문 리뷰 (0) 2022.06.03 A Review of Text Style Transfer using Deep Learning, TAI, 2021 논문 요약 (0) 2022.01.26