1. Word Structure and Subword Models
기존에는 단어 단위로 vocabulary가 이루어졌지만 subword model은 하위 단위로 단어들을 쪼개어 vocabulary를 만든다. 만약 문장 내 단어 중에 변형, 오타, 또는 새로운 단어(이들을 희귀 단어라고 하겠다)가 있다면 subword model을 통해 이들을 다룰 수 있다. 대표적으로 byte-pair encoding algorithm을 사용할 수 있다.
- 처음엔 vocabulary에 문자와 end-of-word 표시만 포함한다.
- 텍스트 뭉치를 사용해 가장 많이 함께 나타나는 문자들을 묶어 subword로 만든다.
- 원하는 vocab size가 될 때까지 subword들을 조합한다. 예를 들어 taasty라는 단어가 있다면, 이를 ta##as##ty로 쪼갠다.
그 결과 정상적인 일반 단어들은 그대로 subword vocabulary에 나타날 것이고 희귀 단어들은 여러 개의 subword 조합으로 쪼개질 것이다. 물론 사용하는 subword의 개수가 적을수록 좋다. (희귀 단어가 많이 없다는 뜻이므로)
2. Pretraining Idea - Meaning & Context
기존의 Word2Vec의 한계는 단어를 한번 임베딩 벡터로 표현하면(이를 단어가 사전 학습되었다고 표현한다) 문맥을 고려할 수 없다는 것이다. 따라서 문맥을 고려한 단어 임베딩을 하자! 라는 취지에서 시작된 것이 pretraining이다.
현대 NLP에서는 파라미터들이 pretraining을 통해 initialize된다.
pretraining은 다음과 같은 측면에서 매우 효과적이다.
- 다양한 문맥에서 언어를 학습할 수 있다.
- parameter initalization을 제공한다.
- probability distribution을 구축하는 데 도움을 준다.
또한, pretraining은 일부 시퀀스를 숨긴 뒤 모델에게 이를 학습하도록 한다. 예를 들어 다음과 같은 문장에 빈칸이 있고, 모델이 이 빈칸에 들어갈 단어를 예측하도록 한다. 이 문맥을 통해 모델은 sentiment를 학습할 수 있다.
일반적으로 pretraining - finetuning paradigm을 따른다.
- pretraining: language modeling에 기반하여 일반적인 것들을 학습한다. (language modeling은 파라미터 \(\theta\)에 대해 과거 단어들이 주어졌을 때 새로운 단어가 등장할 확률 분포를 구하는 것이다.)
- finetuning: pretraining에서 학습된 파라미터 \(\theta\)를 이용해 주어진 task에 맞게 파라미터를 튜닝한다. 일반화가 잘 되어 있는 pretrain 파라미터를 사용하므로 좋은 결과를 얻을 수 있을 것이다.
Parameter-Efficient Finetuning
모든 파라미터를 finetuning하는 것은 pretrained model 입장에서 좋지만 memory-intensive하다는 단점이 있다. 그러나 parameter-efficient finetuning을 사용하면 보다 효율적으로 finetuning을 할 수 있다.
- lightweight finetuning: 몇 개의 parameter 혹은 새로운 parameter만 finetuning
- prefix-tuning: parameter 앞에 learnable prefix를 추가하고 나머지 pretrained parameters는 고정해 놓은 상태에서 prefix parameter만 학습한다.
- Low-Rank Adaption(LoRA): 무거운 행렬 W를 AB 행렬로 쪼갠다. 이때 W는 (d, d)의 차원이고, A는 (d, k), B는 (k, d)의 차원을 가지므로 A와 B를 행렬곱해주면 동일한 결과를 얻되 parameter 수를 줄일 수 있다.
3. Pretraining Methods
1. Encoder
encoder는 bidirectional context를 사용하므로 일반적인 language modeling을 사용하는 대신 encoder을 이용해 pretraining하려면 masking을 이용해야 한다. 주어진 입력 시퀀스의 몇 개의 단어를 mask 처리하고 모델이 이를 배우도록 훈련시킨다. 이때 훈련에서 bidirectional information을 이용하기 때문에 더 잘 예측할 수 있다. mask 처리된 입력을 tilted x라고 한다면, 모델은 \(p_{\theta}(x|tilted x)\)를 예측한다. 이를 Masked LM이라고 부른다.
대표적인 모델로는 BERT가 있다.
- 80%의 단어는 mask 처리한다.
- 10%의 단어는 random하게 대체한다.
- 10%의 단어는 그대로 둔다.
-> 강하게 모델을 학습시키기 위해!
BERT에 대해 더 자세히 알아보자.
- BERT-based: 12층짜리 -> 768개의 hidden states, 12개의 attention heads, 110만 개의 parameters
- BERT-large: 24층짜리 -> 1024개의 hidden states, 16개의 attention heads, 340만 개의 parameters
- Extensions of BERT
- RoBERTa: 일반 BERT + remove next sentence prediction(which is unnecessary)
- SpanBERT: 연속적인 단어의 span을 mask 처리함으로써 모델이 harder, more useful pretraining task를 수행하도록 함.
일반적으로 pretraining은 여러 개의 GPU가 필요하므로 계산 비용이 많이 들고 finetuning은 하나의 GPU만으로도 연산이 가능하므로 한 번 pretraining을 하고 finetuning을 여러 번 하는 전략을 세울 수 있다.
그러나, pretrained encoder은 bidirectionality로 인해 sequential text generating을 할 수 없다는 한계가 있다. 이런 경우에는 pretrained decoder를 써야 한다.
2. encoder-decoder
encoder-decoder을 이용해 pretraining을 할 수 있고 이는 language modeling과 유사하다. encoder는 bidirectional context로부터 이점을 얻고, decoder는 language modeling을 사용해 다음 단어를 예측한다. 이때 w1, w2...wT는 encoder의 input이고 encoder에서 몇 개의 span을 mask 처리한다. decoder는 encoder에서 인코딩된 context vector h와 masking된 토큰들 wT+1...을 입력으로 받아 masking된 부분이 원래 무엇이었는지를 출력한다.
입력 시퀀스의 일부 span을 unique placeholder로 대체해서 encoder에 입력으로 주어주면 decoder가 unique placeholder의 원래 자리의 span을 예측한다.
대표적으로 T5 모델이 있다. T5 모델의 큰 장점은, 매우 광범위한 질문도 파라미터로부터 검색함으로써 답할 수 있도록 finetuning될 수 있다는 것이다.
3. decoder
decoder를 이용해 pretraining할 수 있고, 경우에 따라 구현되는 방식이 다르다.
- downstream 작업(pretrained된 모델을 사용해 특정 테스크를 수행하는 것)
- 어떤 단어들이 주어졌을 때 다음 단어가 나올 확률 \(p_{\theta}(w_t|w_{1:t-1})\)를 예측하도록 훈련되지 않고, 마지막 hidden state \(h_T\)를 linear classifier로 학습시킴으로써 finetuning할 수 있다. 이때 A, b는 hidden state와 달리 pretrained되지 않은 값으로, 주어진 테스크를 학습하면서 훈련된다.
- output이 sequential할 때
- language modeling으로 모델이 pretrained되었고, \(p_{\theta}(w_t|w_{1:t-1})\)을 예측하도록 finetuning한다. output이 sequential할 때 유용하다. GPT-3는 이 경우에 속한다. 먼저 deocder로 general하게 pretrained되고 이후 특정 downstream task를 수행할 수 있도록 finetuing된다. 이때 downstream task란 분류, 감정 예측, NLI와 같은 특정 테스크를 말한다.
pretrained decoder의 대표적 모델로 GPT 시리즈가 있다. pretrained decoder를 적용 후 finetuning을 할 때, decoder에게 어떤 형식으로 입력 시퀀스를 주어 finetuning을 하게 할 건지, 그 포맷을 정해야 했다. 예를 들어 자연어 추론(Natural Language Inference)가downstream task로 주어진다면 (전제, 가설)의 문장 쌍을 입력으로 주고 두 문장의 관계가 내포, 모순, 중립인지를 예측할 수 있다. 따라서 다음과 같이 입력 시퀀스를 적을 수 있다.
선형 분류기가 [EXTRACT] 토큰에 적용되면 두 문장이 내포인지, 모순인지, 중립인지 그 예측 관계를 출력한다.
GPT-2는 GPT보다 더 많은 양의 데이터를 훈련하여 꽤나 설득력 있는 언어를 생성할 수 있게 되었다.
GPT-3는 매우매우 많은 데이터로 훈련되어 175억개의 파라미터를 가져 이제 더 이상 SGD와 같은 gradient step이 일어나지 않아도 매우 뛰어난 성능을 보인다. 매우 많은 데이터로 pretrained 되었기 때문에 맥락을 주어주면 바로 그 맥락에 맞는 테스크를 수행할 수 있다.
Example
- 질문 답변: GPT-3에게 '미국 제 1대 대통령이 누구야?'라고 질문하면 이미 사전 훈련되었기 때문에 답할 수 있다.
- 텍스트 생성: GPT-3에게 흥미로운 이야기를 해달라고 하면 이미 사전 훈련되었기 때문에 새로운 이야기를 지어낼 수 있다.
- 번역: GPT-3에게 한국어를 영어로 번역해 달라고 하면 이미 사전 훈련되었기 때문에 번역해준다.
그렇다면 GPT-3는 파라미터와 토큰의 개수(데이터 수)를 최적화한 모델인가? 그렇지 않다. Chinchilla라는 모델은 70 billion의 파라미터를 가지면서 GPT-3보다 좋은 성능을 낸다. (GPT-3의 파라미터는 175 billion이다) 물론 Chinchilla의 훈련 토큰 수가 1.4 trillion이긴 하지만 말이다. 중요한 것은 파라미터의 수를 줄이는 것이 중요하므로 GPT-3도 개선의 여지가 있다는 것이다.
Chain-of-thought
강의에서 마지막으로 prompt와 관련된 chain-of-thought에 대한 이야기를 하고 끝낸다. 우측처럼 모델에게 input 데이터를 주어줄 때 답만이 아니라 사고나 연산의 과정을 추가해주면 모델이 훨씬 잘 훈련된다는 내용이다.
이 포스팅은 Standford CS 9단원에 기반하여 작성되었습니다.
'NLP > cs224n' 카테고리의 다른 글
[cs224n] NLG(Natural Language Generation) (0) | 2024.07.06 |
---|---|
[cs224n] Prompting, RLHF (0) | 2024.07.05 |
[cs224n] Self-Attention, Transformer (1) | 2024.07.03 |
[cs224n] Translation, Seq2Seq, Attention (0) | 2024.07.02 |
[cs224n] LSTM (Long Short-Term Memory) (1) | 2024.07.01 |