BART: Denoising Sequence-to-Sequence Pre-training for Natural Language Generation, Translation, and Comprehension

README·2024년 1월 15일
0

논문? 리뷰?

목록 보기
3/11
post-thumbnail

BART

BART는 2019년 Facebook AI에서 발표한 논문으로 BERT 계열 모델과 GPT 계열 모델의 특성을 합친 모델입니다. 다양한 태스크에서 좋은 성능을 보였지만 특히 문장 생성 태스크에서 더 좋은 성능을 보여주었습니다.

요약

BART는 seq2seq 모델을 위한 denoising autoencoder입니다. BART의 학습은 주어진 텍스트에 임의로 noise를 만든 다음 그 텍스트를 다시 온전한 문장으로 만드는 방법으로 진행합니다. BART는 BERT와 GPT, 그 외의 여러 모델들의 구조들을 결합하고 일반화시킨 트랜스포머 계열의 신경망 기계 번역 모델입니다.

BART 소개

BART는 Bidirectonal Transformer 모델과 Auto-Regressive Transformer 모델의 특성을 모두 가지고 있으며 seq2seq 모델을 기반으로 한 denoising autoencoder입니다. BART 또한 BERT처럼 사전 학습을 이용하는데 사전 학습의 대략적인 과정은
(1) 텍스트에 임의의 noising 함수를 적용하여 훼손된 텍스트를 생성한다.
(2) seq2seq 모델이 훼손된 텍스트를 원본으로 복구하는 과정을 거치며 학습을 한다.
위와 같습니다.
BART는 텍스트 생성 작업에서 특히 좋은 성능을 보이지만 텍스트 독해 작업에서도 좋은 성능을 보여줍니다. GLUE와 SQuAD에서 RoBERTa와 비슷한 성능을 보여주었고 그 외 여러 가지 task에서도 state-of-art 기록을 세웠습니다.

모델 구조

BART 모델은 bidirectional encoder와 autoregressive decoder로 구성되어 있고 base model은 encoder, decoder가 각각 6개의 레이어를, large model은 각각 12개의 레이어를 사용합니다.
BART는 일반적인 seq2seq 트랜스포머 모델을 사용하지만, GPT를 따라서 활성화 함수를 ReLU에서 GeLUs로 변경하였고 초기 파라미터를 N(0,0.02)N(0, 0.02)에서 설정합니다.
BART의 모델 구조는 BERT의 모델 구조와 유사하지만, 아래와 같은 차이점들이 있습니다.
(1) decoder의 각 레이어는 encoder의 최종 hidden layer와 cross-attention을 수행한다.
(2) BERT에서는 예측 단계 이전에 추가적인 feed-forward network를 사용하지만, BART에서는 사용하지 않는다.
또한 BART의 모델 파라미터 개수는 동일한 사이즈의 BERT 모델에 비해서 약 10% 정도 더 많습니다.

사전 학습

BART는 훼손된 문서들을 학습 자료로 사용하고 reconstruction loss(decoder에서의 출력과 원본 문서 간의 차이를 CrossEntropy로 계산한 것)를 최소화 하는 것을 목적으로하여 모델을 학습합니다. 기존의 denoising autoencoder들과는 달리 BART는 문서에 가해지는 noising 방식에 상관 없이 사용이 가능합니다.
해당 논문에서는 다양한 텍스트 변환 방식을 사용했는데 살펴보자면
Token Masking: BERT에서 사용된 방법으로 무작위 토큰을 샘플링하고 [MASK] 토큰으로 교체합니다.
Token Deletion: 무작위 토큰을 삭제합니다. 이 방식에서 모델은 삭제된 토큰의 위치를 맞추는 방식으로 학습을 합니다.
Text Infilling: 다수의 text span(텍스트 뭉치?)을 샘플링하고 하나의 [MASK] 토큰으로 변경합니다. 길이가 0인 span도 존재할 수 있는데 이 경우는 [MASK] 토큰의 삽입으로 볼 수 있습니다.
Sentence Permutaiton: 문서를 마침표 기준으로 분할한 뒤 순서를 뒤섞습니다.
Document Rotation: 문서에서 무작위로 토큰을 하나 선택하고 그 토큰을 시작점으로 문서의 순서를 바꿉니다. 예를 들자면 [ABCDE]라는 문서에서 C라는 토큰이 선정되면 [CDEAB]로 문서의 순서를 변경합니다. 이 방식에서 모델은 문서의 시작점을 찾는 방법으로 학습을 진행합니다.

아래 그림은 위에서 설명한 문서 noising 방식들을 그림으로 나타낸 예시입니다.

파인튜닝

BART는 파인튜닝을 통해서 다양한 작업을 수행할 수 있다고 하고 아래는 논문에 제시된 예시들입니다.
Sequence Classification Tasks: Sequence classification task는 Sequence 단위의 문자열을 어떤 기준에 맞게 분류하는 작업입니다. 해당 작업에서는 encoder와 decoder에 같은 input을 입력한 후 최종 decoder token의 최종 hidden state를 분류기의 입력값으로 이용합니다.
Token Classification Tasks: Token Classification Task는 Sequence classification task와 비슷하지만, Sequence 단위의 문자열 대신 Token 단위로 분류를 합니다. 예시로는 주어진 예제에서 정답의 위치를 찾는 SQuAD가 있다고 합니다. 해당 작업에서는 완전한 문서를 encoder와 decoder의 입력값으로 사용을 하고 decoder 가장 위의 hidden state를 각 단어의 representation으로 사용하고 이를 통해 토큰을 분류합니다.
Sequence Generation Tasks: BART는 autoregressive decoder를 포함하는 모델이기 때문에 sequence genration task에 직접적으로 파인튜닝을 할 수 있다고 합니다. 해당 작업에서는 encoder에 input sequence를 입력값으로 사용하여 decoder에서 output을 생성할 수 있습니다.
Machine Translation: 기존의 연구에서 모델에 사전 학습된 encoder를 결합해 성능을 향상시킬 수 있지만 decoder와 결합해 사용하는 것은 성능 향상에 제약이 있었다고 합니다. 하지만 BART 모델 전체를 하나의 사전 학습된 decoder로 사용하는 방법으로 이 제약을 넘을 수 있다고 합니다. 이를 좀 더 자세하게 설명하자면 BART encoder의 embedding layer를 무작위 값으로 초기화하고 encoder가 영어가 아닌 다른 언어를 입력받았을 때 BART 모델이 영어로 de-noise 할 수 있는 형태로 만들어 전달을 해 줄 수 있도록 학습을 진행한다는 것입니다.
이때 새로운 encoder의 학습 과정은 두 단계인데 첫 번째 단계로 BART의 파라미터 중 encoder의 parameter, positional embedding, encoder 첫 layer의 self-attention input projection matrix를 제외한 파라미터들을 freeze를 시키고 학습을 시킵니다. 두 번째 단계로 적은 iteration만 수행하며 모델의 모든 parameter를 학습합니다.

아래 그림은 Machine Translation에서 새로운 Encoder를 Bart 모델에 결합한 모습을 그림으로 표현한 것입니다.

다른 모델들과의 비교

BART는 사전 학습 과정에서 다양한 noising 방법들을 적용 가능한데 해당 논문에서는 base-size 모델(encoder와 decoder 레이어 각각 6개, hidden size는 768)을 다양한 방법으로 실험한 결과를 제시하고 있습니다.

비교 모델

Language Model: GPT와 비슷하게 단방향으로 학습하는 Transformer language model로 BART의 decoder에서 cross-attention을 제외한 것과 비슷합니다.
Permuted Language Model: XLNet을 기반으로 하였고 token의 1/6을 샘플한 후 무작위 순서로 autoregressive하게 생성하는 모델입니다. 다른 모델들과의 비교를 위해 relative positional embedding과 attention across segment를 구현하지 않았다고 합니다.
Masked Language Model: BERT와 비슷하게 token의 15%를 [MASK]로 대체했고 모델이 원래 token을 예측하도록 학습을 했습니다.
Multitask Masked Language Model: UniLM처럼 Masked Language Model을 추가 self-attention mask와 함께 학습을 했다고 합니다.
Masked Seq-to-Seq: MASS를 참고하였고 token의 50% 분량을 차지하는 span을 masking하였고 seq2seq 모델이 masking된 token을 예측하도록 훈련하였다고 합니다.

비교 Task

SQuAD: Wikipedia 문서에서 주어진 질문의 정답의 위치를 찾는 Task입니다.
MNLI: 두 문장을 입력받고 한 문장이 다른 문장을 함의하는지를 예측하는 bitext classification입니다.
ELI5: 장문의 QA 데이터셋입니다. 모델은 문서와 질문을 통해서 대답을 생성해야 합니다.
XSum: 뉴스를 읽고 굉장히 함축적으로 요약해야 하는 Task입니다.
ConvAI2: 문맥과 페르소나에 따라 대답을 생성하는 Task입니다.
CNN/DM: 뉴스를 읽고 요약을 하는 Task인데 요약본은 원본 텍스트와 밀접하게 관련되어 있다고 합니다.

비교 결과

각 Task의 모델별 점수는 아래 표와 같습니다.

실험 결과를 통해 알 수 있는 사실을 정리한 결과입니다.
사전 학습 방법의 성능은 Task에 따라 달라진다: 사전 학습 방법별 성능은 Task의 종류에 영향을 많이 받는 모습을 보였습니다. 예시로 기본 Language Model은 ELI5에서는 가장 좋은 성능을 보였지만 SQuAD에서는 가장 안 좋은 성능을 보였습니다.
Token masking은 매우 중요하다: Document rotation과 Sentence permutation 방법은 단독으로 사용되어서는 좋은 성능을 보이지 못했습니다. 좋은 성능을 거둔 방법은 token deletion, token masking, self-attention mask 중 하나를 사용했습니다.
Left-to-right 사전 학습은 생성 작업 성능을 향상시킨다: Masked Language Model과 Permuted Language Model은 생성 작업에서 다른 모델들보다 좋지 못한 성능을 보였습니다. 그리고 이 둘은 실험한 모델들 중 유이하게 left-to-right auto-regressive 모델링이 적용되지 않았습니다.
양방향 encoder는 SQuAD Task에서 매우 중요하다: 이전 연구의 결과에 따르면 left-to-right decoder는 SQuAD에서는 좋은 성능을 보이지 못하는데, classification 작업에서는 한 문맥에 뒤따라올 미래의 문맥들이 매우 중요하기 때문입니다. 하지만 BART는 양방향 layer의 개수를 절반으로 줄이고도 비슷한 성능을 얻었습니다.
사전 학습 방법만이 중요한 요소는 아니다: 논문의 실험 결과에서 Permuted Language Model은 XLNet에 비해 좋지 못한 성능을 보여주었습니다. 해당 논문의 저자는 이는 일부 구조를 제거하였기 때문인 것 같다고 하며 다른 구조들도 성능에 영향을 미칠 것이라고 하였습니다.
기본 Lanugage Model은 ELI5에서 가장 좋은 성능을 보였다: ELI5는 다른 모델이 BART보다 좋은 성능을 보인 유일한 Task입니다. BART는 Input과 Output의 연관성이 높을 때 좋은 성능을 보인다는 것을 알 수 있습니다.
BART가 가장 일관적으로 좋은 성능을 보였다: BART는 ELI5를 제외한 모든 Task에서 가장 좋은 성능을 보였습니다.

결론

BART는 훼손된 텍스트들을 원본에 매핑하는 방법으로 사전학습을 진행하는 모델로 discriminative task에서는 RoBERTa와 비슷한 성능을 보였고 그 외의 많은 텍스트 생성 task에서는 최고의 성능을 보였다고 합니다.

후기

오랜만에 논문을 읽고 정리하는 시간을 가져보았는데 여전히 어려운 것 같다. 그리고 논문을 읽다 보면 논문에 언급된 다른 모델들의 논문도 읽어보아야 할 것 같다는 생각이 드는데 그런 식으로 읽어가다 보면 언젠가는 지금보다는 논문을 잘 볼 수 있게 되어있기를 바란다.

profile
INTP 신입 개발자

0개의 댓글