ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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

    https://github.com/huggingface/transformers/blob/12ce2941c7b67c0dedac0f0468b3ed854fa940ab/src/transformers/models/bart/modeling_bart.py#L75

     

    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>]

    의문점

    1. 디코더 인풋의 시작이 eos_token?
      • bos_token을 쓰는 상황과의 상충을 피하기 위해서라면 이해할 수 있다. 
        decoder_input [<s>, <s>, _안녕, 하세요, _denver, 입니다]
        target [<s>, _안녕, 하세요, _denver, 입니다, </s>]
      • 위와 같은 경우, 처음엔 bos 다음에 bos를 내보낸 후 두번째에선 bos 다음에 첫 단어를 내보내야 하기 때문 → 학습이 어려워짐
    2. 그렇다면 bos_token은 반드시 필요한걸까?
      • 논문에서는 bos_token에 대한 언급이 없다.
      • 그러나 facebook/bart-base 등의 모델들이 기본적으로 bos를 붙이도록 토크나이징한다.
      • 저자들이 pretraining 할 때 bos를 붙였을지도 궁금하다.

     

     

     

    질문이나 잘못 기재된 내용에 대한 피드백 언제든지 환영합니다. 함께 배워나가요!

     

    댓글

Designed by Tistory.