본문 바로가기

교육/CS224N winter 2021

Lec10) Transformers and Pretraining

○단어 구조와 subword 모델

단어 임베딩 단계에서 수만개의 단어로 이루어진 vocabulary를 이용해 훈련셋을 만들었다고 가정하자. 모든 테스트 때 새롭게 마주한 단어는 UNK로 매핑된다.

이러한 유한한 vocabulary 가정은 많은 언어들에서 효과적이지 못하다. 대부분의 많은 언어가 복잡한 형태 또는 단어 구조를 나타낸다. 예를 들어 Swahili어는 백여개의 동사 활용이 존재하며 각 활용은 광범위의 다양한 활용을 내포한다. 따라서 훨씬 길고 더욱 복잡한 복합어가 될수록 각 단어는 더욱 적게 등장할 것이다.

 

Byte-pair 인코딩 알고리즘

NLP의 subword 모델링은 단어 수준 기저에 깔린 구조에 대한 추론을 위한 광범위한 방법을 포함한다. (단어 일부, 문자, 바이트)
• 현대에는 단어의 일부(하위 단어 토큰)의 vocabulary를 배운다.
• 훈련 및 테스트 시 각 단어는 알려진 subword 시퀀스로 분할된다.
Byte-pair 인코딩은 subword vocabulary를 정의하기 위한 간단하고 효과적인 전략이다.

  1. Character와 "end-of-word" 기호만 있는 vocabulary 시작
  2. 텍스트 모음을 사용하여 가장 일반적인 인접 문자 "a,b"를 찾습니다. 하위 단어로 "ab"를 추가합니다.
  3. Character pair의 인스턴스를 새 하위 단어로 교체하고 원하는 어휘 크기까지 반복
    ex) 시작 vocab: {a,b,...,z}, 완료 vocab: {a,...,z,apple,app#,#ly,...}

최근에는 사전 학습된 모델에서 유사한 방법인 WordPiece 등을 사용한다.

 

결과적으로 자주 등장하는 단어는 그 자체로 subword vocabulary가 되지만 자주 등장하지 않는 단어는 세부 컴포넌트로 나누어진다. 최악의 경우, 단어가 가지고있는 글자들로 전부 나누어진다. 이경우 10단어 짜리 문장의 토큰이 30개가 될 수도 있다.

## 는 여기서 subword에 무언가 다른 subword가 붙어야만 하는 위치이다.

 

Motivating word meaning and context

과정 초기에 배웠던 내용을 되짚어보자.

“You shall know a word by the company it keeps” (J. R. Firth 1957: 11)

위의 인용문구는 분포 의미론(Distributional semantics)의 요약이며, word2vec에 영감을 주었다. 그러나

“… the complete meaning of a word is always contextual, and no study of meaning apart from a complete context can be taken seriously.” (J. R. Firth 1935)

word2vec으로 단어를 임베딩 시에는 주변 단어의 문맥을 고려하지 않는다.

예시) I record the record: 문장 내에서 두 record는 다른 의미를 지니지만, word2vec은 주변 단어를 보지 않고 embedding하기 때문에 같은 임베딩을 수행한다. 

 

Where we were: pretrained word embeddings

2017년경)

  •  사전 훈련된 단어 임베딩으로 시작(문맥 고려하지 않음).
  •  Task에 대해 훈련하는 동안 LSTM 또는 Transformer에 문맥적 의미를 같이 학습.

다음 작업을 수행하게되면 반드시 고려되어야 할 것은

downstream task(예: QA)에 대한 학습 데이터는 언어의 모든 맥락적 측면을 가르치기에 충분할 정도로 많아야 한다. 이 때

네트워크의 대부분의 매개변수는 무작위로 초기화된다 (회색).

 

현대 NLP)

  • NLP 네트워크의 모든(또는 거의 모든) 매개변수는 사전 훈련을 통해 초기화된다.
  • 사전 훈련 방법은 모델에서 입력의 일부를 숨기고 해당 부분을 재구성하도록 모델을 훈련한다.
    예를 들어 skip-gram처럼 주변을 숨기고 단어를 통해 예측하게 한다던가

이렇게 사전 학습된 모델은 강력한 효과를 보여주었다. 전체 시쿼스에 대해 학습하기 때문에 더욱 강력한 언어 표현을 가지며,  출력층을 제외한 모델 내의 모든 매개변수들이 유기적으로 얽혀있는 상태로 잘 초기화 되며, 다음 단어를 예측하는 언어 모델과 같은 작업에 효과적이다.

 

결과적으로 모델은 사전학습에서 다음과 같은 문장들의 빈칸을 학습하게 된다.

  • Stanford University is located in __________, California. [일반상식] Palo Alto
  • I put ___ fork down on the table. [구문] the, my,...
  • The woman walked across the street, checking for traffic over ___ shoulder. [상호참조] her
  • I went to the ocean to see the fish, turtles, seals, and _____. [어휘 의미/주제] crab, ...
  • Overall, the value I got from the two hours watching it was the sum total of the popcorn and the drink. The movie was ___. [감성] bad
  • Iroh went into the kitchen to make some tea. Standing next to Iroh, Zuko pondered his destiny. Zuko left the ______. [추리 - 어려움] kitchen
  • I was thinking about the sequence that goes 1, 1, 2, 3, 5, 8, 13, 21, ____ [단순 산수] 피보나치 수열

The Transformer Encoder-Decoder [Vaswani et al., 2017]

The Transformer - model architecture

Pretraining through language modeling [Dai and Le, 2015]

언어 모델 task를 되짚어보자.

모델 $P_{\theta}(w_{t}|w_{1:t-1})$, 과거 문맥을 통해 다음 단어의 확률을 연산한다. 해당 학습을 위한 데이터는 특히 영어의 경우 많다. 특별한 라벨링이 필요없기 때문이다.

즉, 사전 학습은 이전에 언어 모델을 학습하던 것과 차이가 없다. 단순히 decoder가 transformer가 되고 많은 데이터에 대해 학습 후 매개변수들을 저장하는 것이다. 

감성분류 모델 학습 예시

결과적으로 일반적인 것은 많은 량의 텍스트로 언어모델을 학습하여 배운 후, 적은 데이터로  downstream task를 학습하여 finetuning 시킨다. 

 

Stochastic gradient descent and pretrain/finetune

왜 사전학습 후 finetuning하는 것이 도움될까?

가령 $\underset{\theta}{min}L_{\texttt{pretrain}}(\theta)$를 최적화하여 얻은 매개변수를 $\hat{\theta}$하자.

다음 finetuning을 $\hat{\theta}$으로 시작하여  $\underset{\theta}{min}L_{\texttt{finetune}}(\theta)$을 계산한다.

결과적으로 사전학습이 주는 효과는 1. local minima가 $\hat{\theta}$에 근처에 있어 일반화가 잘 됐다거나, 2.그리고/또는 finetuning 손실의 기울기가 잘 전파된 것이다.

>> 이는 여전히 연구중 분야이다

 

○Pretraining for three types of architectures

Neural architecture는 downstream task와 사전 학습 종류에 영향을 받으며 세 가지 종류로 구분할 수 있다

  • 디코더 (Decoders)
    • 지금까지 본 것과 같은 언어모델(LM)
    • 생성하기 좋으며, 미래를 볼 수 없다.
  • 인코더 (Encoders)
    • bidirectional LSTM이 one-directional 보다 성능이 좋았던 것과 같이 양방향 문맥을 학습할 수 있다.
      : 어떻게 학습할 것인가?
  • 인코더-디코더 (Encoder-Decoder)
    • 위 두 방식에서 어떤 장점을 가져올 수 있을까?
      : 가장 적절한 학습 방법은?

 

디코더 사전 학습 (Pretraining decoders)

언어 모델로 사전학습된 디코더를 사용할 때, 사전 모델이 $P_{\theta}(w_{t}|w_{1:t-1})$을 예측하도록 학습됐던 것을 무시한다. 이후 감성분류 작업을 한다면 분류기(Linear)를 마지막 단어의 은닉 상태(hidden state) 위에 올려서 finetuning을 학습한다. 당연히 분류기는 학습되지 않았기 때문에 해당 층의 매개 변수$(A, b)$는 임의로 초기화되며, 분류 결과의 손실을 통해서 전체 네트워크가 학습된다.

사전학습 된 디코더를 이용한 감성분류

디코더로부터 hidden state 연산: $h_{1},...h_{T}=\texttt{Decoder}(w_{1},...,w_{T})$

분류기에서 연산: $y\sim Ah_{t}+b$

 

디코더를 언어 모델로 사전학습하는 것이 자연스럽기에 $P_{\theta}(w_{t}|w_{1:t-1})$로 finetuning하여 generator로 사용해보자. 출력은 사전학습한 vocabulary의 시퀀스이기 때문에 대화(context=dialogue history)나 요약(context=document) 같은 작업에 도움이 된다. 감성 분류와의 차이점은 사전학습 단계에서 Lienar가 학습된다.

디코더로부터 hidden state 연산: $h_{1},...h_{T}=\texttt{Decoder}(w_{1},...,w_{T})$

분류기에서 연산: $w_{t}\sim Ah_{t-1}+b$

 

Generative Pretrained Transformer (GPT) [Radford et al., 2018]

2018년 GPT는 사전학습된 디코더로 좋은 성능을 보였다

  • 12개 층의 Transformer
  • 768차원 hidden states, 3072차원 feed-forward hidden layers
  • 40000까지 Byte-pair 인코딩 (굉장히 작은 크기)
  • BookCorpus로 사전 학습: 7000개의 책
    • Long-distance dependencies를 학습하기 위해 긴 span의 연속적인 텍스트가 포함되어 있습니다.
  • "GPT"라는 단어는 실제 논문에서 사용된 단어가 아니다. “Generative PreTraining” 또는 “Generative Pretrained Transformer”로 설명된다.

어떻게 해당 모델을 finetuning 작업에 맞게 입력을 변경하였을까?

Natual Language Inference: 문장들을 entailing/contradictory/neutral로 라벨링

NLI의 data 예시

위의 예시 문장을 모델에 입력으로 넣어주기 위해 특별한 토큰을 사용하였다.

[DELIM]으로 두 문장을 구분하였으며, Linear 분류기는 [EXTRACT] 토큰의 representation에 적용된다.

Experimental results on natural language inference tasks, comparing our model with current state-of-the-art methods. 5x indicates an ensemble of 5 models. All datasets use accuracy as the evaluation metric.

성능 지표는 작업마다 정도의 차이는 있지만 기존의 모델들을 상회하였으며, 세부 작업을 finetuning하는데 들어가는 노력이 굉장히 적어졌다.

 

더욱 설득력 있는 생성 (GPT2)

우리는 사전 훈련된 디코더가 언어 모델로서의 능력에서 어떻게 사용될 수 있는지 언급했다. 더 많은 데이터로 훈련된 GPT의 더 큰 버전인 GPT-2는 상대적으로 설득력 있는 자연어 샘플을 생성하는 것으로 나타났다.

○ 인코더 사전 학습 (Pretraining encoders)[Devlin et al., 2018]

위에서 우리는 언어 모델 방식의 사전 학습을 보았다. 하지만 인코더는 bidirectional context를 고려하기 때문에 언어 모델 방식을 적용할 수 없다. 따라서 입력의 일부를 [Mask] 토큰으로 변경하여 이를 예측하도록 해보자.

인코더로부터 hidden state 연산: $h_{1},...h_{T}=\texttt{Encoder}(w_{1},...,w_{T})$

분류기에서 연산: $y_{i}\sim Aw_{i}+b$

손실은 "masked out"된 단어에 대해서만 수행하며, $\tilde{x}$ 가 $x$가 mask된 것이라면 모델은 $p_{\theta}(x|\tilde{x})$를 학습하고 이를 Masked LM이라고 한다.

 

Devlin et al., 2018은 "Masked LM" 목표를 제안하고 BERT라는 이름을 붙인 모델인 사전 훈련된 Transformer의 가중치를 발표했습니다. 다만 위와 같이 학습을 진행할 경우 [Mask]만 잘 예측하려고하고 나머지 단어에 대해서는 representation을 잘 구축하려고하지 않기 때문에 다음과 같은 세부적인 기법들이 추가되었다.

  • 임의의 (sub)word 토큰들의 15%를 예측
    : 80:10:10의 비율로 [Mask], 임의의 토큰, 변화없음(그러나 여전히 예측은 수행) 변화를 준다

finetuning 시에는[Mask] 토큰이 보이지 않을 것이므로, 모델이 mask되지 않은 단어에 대해서도 강력한 표현을 만드는 것이 목적이다.

BERT input representation. The input embeddings are the sum of the token embeddings, the segmentation embeddings and the position embeddings.

추가적으로 BERT의 사전 학습에 사용된 기법은 입력이 두 분리된 텍스트의 덩어리로 들어간다. Downstream 작업에서 QA와 같이 문장의 관계를 유추하는 것이 진행될 경우를 문장 간의 관계를 잘 파악하기 위함이다. 두 문장은 보통은 텍스트에서 연속적인 것을 가져오지만 때때로는 임의 추출하여 상관없는 문장들을 넣어준다. 모델은 두 문장의 관계를 예측해야하며, 이를 "next sentence prediction"이라고 한다. 이 후에 "next sentence prediction"은 필수적이지 않다고 했으며, 차라리 두 배 긴 문장을 넣어주는 것이 긴 문장의 문맥을 파악하는 것에 도움된다는 연구 결과가 있다. 

Overall pre-training and fine-tuning procedures for BERT. Apart from output layers, the same architectures are used in both pre-training and fine-tuning. The same pre-trained model parameters are used to initialize models for different down-stream tasks. During fine-tuning, all parameters are fine-tuned. [CLS] is a special symbol added in front of every input example, and [SEP] is a special separator token (e.g. separating questions/answers).

 

BERT의 개요

  • BERT-base: 12 layers, 768-dim hidden states, 12 attention heads, 110 million params
  • BERT-large: 24 layers, 1024-dim hidden states, 16 attention heads, 340 million params
  • 학습
    • BooksCorpus (800 million words)
    • English Wikipedia (2,500 million words)
  • 사전 학습은 단일 GPU로 수행하기에 무리
    : BERT는 64TPU로 총 4일간 사전 학습되었다. (TPU는 tensor 연산에 최적화 된 하드웨어이다)
  • Finetuning은 단일 GPU에서 수행이 가능하다 (hugging face에서 편리하게 사용할 수 있도록 배포한다)
    : pretraining보다 적은 수의 배치로 학습을 진행하기 때문

 

BERT는 엄청난 인기를 얻었고 매우 다재다능했다. BERT를 finetuning하여 광범위한 작업에서 새로운 SOTA를 얻었다.

  • QQP: Quora Question Pairs (detect paraphrase questions)
  • QNLI: natural language inference over question answering data
  • SST-2: sentiment analysis
  • CoLA: corpus of linguistic acceptability (detect whether sentences are grammatical.)
  • STS-B: semantic textual similarity
  • MRPC: microsoft paraphrase corpus
  • RTE: a small natural language inference corpus

GLUE Test results, scored by the evaluation server (https://gluebenchmark.com/leaderboard). The number below each task denotes the number of training examples. The “Average” column is slightly different than the official GLUE score, since we exclude the problematic WNLI set.8 BERT and OpenAI GPT are singlemodel, single task. F1 scores are reported for QQP and MRPC, Spearman correlations are reported for STS-B, and accuracy scores are reported for the other tasks. We exclude entries that use BERT as one of their components.

 

사전 학습된 인코더의 한계

결과를 통해 사전 학습된 인코더가 디코더보다 좋은 성능을 보여주는 것을 확인했다. 그렇다면 무조건 인코더가 좋을까?

작업에 시퀀스 생성이 포함되는 경우 사전 훈련된 디코더를 사용하는 것이 좋습니다. BERT 및 기타 사전 훈련된 인코더는 자연스럽게 멋진 autoregressive(한 번에 1단어) 생성 방법으로 이어지지 않습니다.

Extensions of BERT [Liu et al., 2019Joshi et al., 2020]

  • RoBERTa: BERT를 더 오래 훈련하고 다음 문장 예측을 제거
  • SpanBERT: 단어의 연속 범위를 masking하면 더 어렵고 유용한 사전 훈련 작업이 된다

Development set results for RoBERTa as we pretrain over more data (16GB → 160GB of text) and pretrain for longer (100K → 300K → 500K steps). Each row accumulates improvements from the rows above. RoBERTa matches the architecture and training objective of BERTLARGE . Results for BERTLARGE and XLNetLARGE are from Devlin et al. (2019) and Yang et al. (2019), respectively.

 

○ 인코더-디코더 사전 학습 (Pretraining encoders-decoders)

인코더-디코더의 경우 언어 모델과 유사한 작업을 하지만 모든 입력의 prefix가 인코더에 제공되고 예측에 사용되지 않는다

인코더로부터 hidden state 연산: $h_{1},...h_{T}=\texttt{Encoder}(w_{1},...,w_{T})$

디코더로부터 hidden state 연산: $h_{T+1},...h_{2T}=\texttt{Decoder}(w_{1},...,w_{T}, h_{1},...h_{T})$

분류기에서 연산: $y_{i}\sim Aw_{i}+b, i>T$

 

결과적으로 인코더 부분은 bidirectional context의 이점을 얻습니다. 디코더 부분은 언어 모델링을 통해 전체 모델을 훈련하는 데 사용됩니다.

 

Raffel et al., 2018에서 가장 잘 작동하는 것으로 밝혀진 것은 span corruption이었다. T5

입력에서 서로 다른 길이의 span을 고유한 placeholder(<X>, <Y>, ...)로 교체하며, 이것은 텍스트 pre-processing에서 구현된다. 디코더 측에서는 언어 모델처럼 corrupt된 span을 예측해야한다. 

위의 그림과 다르게 그냥 언어모델 생성하듯이 입력은 진행된다.

인코더-디코더는 작업에 대해 디코더보다 더 잘 작동하고 스팬 손상(잡음 제거)은 언어 모델링보다 더 잘 작동한다.

Performance of the different architectural variants described in Section 3.2.2. We use P to refer to the number of parameters in a 12-layer base Transformer layer stack and M to refer to the FLOPs required to process a sequence using the encoderdecoder model. We evaluate each architectural variant using a denoising objective (described in Section 3.1.4) and an autoregressive objective (as is commonly used to train language models).

T5의 놀라운 성능: 광범위한 답변을 요구하는 것에 finetune하였다.

*NA: Natual Questions, WQ: WebQuestions, TQA: Trivia QA

매개변수 크기가 커질 수록 성능이 좋아지는 것을 확인할 수 있다. 

○GPT-3, In-context learning, and very large models

지금까지 우리는 두 가지 방식으로 pretrained된 모델을 사용했습니다.
• 모델에서 정의된 확률분포로부터 샘플링
• 우리가 관심 있는 작업에 대해 finetuning하고 예측을 수행합니다.

 

매우 큰 언어 모델은 컨텍스트 내에서 제공하는 예제에서 without gradient step 일종의 학습을 수행한다.
GPT-3이 대표적인 예이다. 
GPT-3에는 1750억 개의 매개변수가 있다. (T5에는 110억개 매개변수가 있다.)

 

위 그림과 같이 학습을 진행하지 않고 input에 예시 시퀀스를 넣으면 이를 통해 학습하여 결과를 내뱉는다.

 

 

Reference)
Slide: PowerPoint Presentation (stanford.edu)
Video: Stanford CS224N NLP with Deep Learning | Winter 2021 | Lecture 10 - Transformers and Pretraining - YouTube