언어 모델의 발전 과정을 전체적으로 톺아보기 위한 포스팅이다.
(1) NLP의 이해/ RNN / LSTM
https://emperor-one-data-study.tistory.com/35
(2) Seq2seq와 Attention
(3)Transformer
(4) Transformer 계열 모델 - encoder only / encoder-decoder / decoder only
(5) In context learning
(6) promting for few-shot learnig
순서로 전체적인 흐름을 정리해본다. (추후 순서 변경 가능!)
LM 모델의 발전
이 전 포스팅에서, NLP 모델의 기초가 되었던 RNN과 LSTM에 대해 알아보았다. LSTM에서 발생하는 문제점들을 보완하기 위해 Encoder-Decoder 구조인 SeqSeq가 제안되었다. 그 후 decoding 과정에 Attention을 적용하여 긴 문장에 대해 대응할 수 있도록 하였다. 이러한 Attention 매커니즘은 문장 내에서 어떤 부분에 집중할 수 있을 지 선택할 수 있도록 함으로써 정보 손실 없이 문맥을 잘 파아갈 수 있도록 해주었다.
Self-attention을 적용한 Transformer는 현재 많이 언급되는 ChatGPT의 기초 모델이 되었다. 최근 대부분의 AI 모델은 Transformer로 통한다는 말이 있을 정도로 중요하고, 꼭 알아야 하는 모델이다.
이번 포스팅에서는 Seq2Seq의 세세한 설명을 담고자 한다.
seq2Seq
Seq2Seq는 기본적으로 Encoder- Decoder 구조이다. 인코더 디코더 모두 RNN을 사용하며, 그렇기 때문에 모두 hidden state를 가진다. 인코더 RNN이 모은 정보 (vector)를 바탕으로 단어를 하나씩 생성한다.
Encoder 내의 RNN layer의 hidden state는 매 step마다 update된다. 즉, $h_{t-1}$ 단계의 hidden state는 $t-1$ 단계까지의 정보가 누적되어 있다. final step에서의 $h_t$ 가 encoder vector로 사용된다.
- 인코더 RNN : 단어에 대한 정보 압축
- 디코더 RNN: 압축된 정보를 바탕으로 Task 수행 (단어 생성 등)
즉, conditional 정보 바탕으로 단어를 연속적으로 생성한다.
단어 생성이 이루어지는 예시를 확인해보자. (변역 Task는 주어진 정보를 형태만 바꾸는 것이기 때문에 설명 시에 가장 기본이 되는 Task이다. )
언어마다 단어 순서가 다르고 (해석하는 순서가 다르고) 한번에 번역하기 어렵기 떄문에 한 단어씩 생성해나간다. 이는 매 step마다 가장 확률이 높은 (올 가능성이 높은) 단어를 고르는, 분류하는 과정으로도 생각할 수 있다.
여기서, START와 END는 special token으로, 문장의 시작과 끝은 구분 짓는 토큰이다.
seq2seq with Attention
RNN을 사용하는 Seq2Seq는 정보가 누적되고 마지막 hidden state가 encoder vector로 활용되었다. 하지만 이럴 경우, 긴 문장에 대해서는 앞의 정보가 소실될 위험이 있다. 문장이 엄청 길 경우, 모든 단어에 대한 의미를 모두 알 필요는 없다. 주변 단어를 통해 맥락을 파악할 수 있기 때문이다. 따라서 RNN 대신 Attention이라는 개념이 도입되었다.
핵심은 decoding 과정에서 현재 step과 가장 관련된, 중요한 정보에 집중할 수 있도록하여 처음 단어에 대한 정보도 끝 단계에 소실되지 않도록 하겠다는 것이다.
직관적으로 Attention을 이해해보자. 디코더에 Attention을 적용했을 대, attention heatmap이 생성된다. 이는 decoder의 Input으로 받은 단어끼리의 correlation이다. heatmap에서 색이 진할 수록 단어끼리의 대응도가 높다고 할 수 있는데, 특정 단어 생성 시에 그 단어와 대응도가 높은 단어를 골라서 이를 바탕으로 생성하는 것이다. (어순이 비슷하다면 대응도가 높을 것이다. )
디코더에서 RNN hidden state은 $s_i = f(s_{i-1} , y_{i-1}, c_{i})$ 와 같이 표현된다.
$s_{i-1}$ :이전 단계의 decoder hidden state
$y_{i-1}$ : 이전 단계에서 생성된 단어
$c_{i}$: context vector -> 한 단어를 생성하기 위해 취합된 정보, 맥락이라고 생각할 수 있음.
여기서 context vector는 decoder input의 각 단어와 대응 점수 함수 (alignment score function)을 활용하여 계산된 각각의 weight의 가중합이다. 이를 수식으로 나타내면 다음과 같다.
$c_{i} = \sum_{j=1}^{T}{a_{ij}h_{j}} $ ,
$a_{ij} = \frac{exp(e_{ij})}{\sum_{k=1}^{T}{exp(e_{ik})}}$
where $e_{ij} = score(s_{i-1}, h_{j})$ , $s_{i-1}$: i번째 단어를 제거하기 직전의 RNN hidden state, $h_{j}$ : j번째 input 문장의 hidden state
수식으로 봤을 때 복잡할 수 있지만 간단하다! j 위치 주변에 있는 Input 단어들이 i 위치에 있는 output 단어와 얼마나 잘 매치되는지는 점수화하는 것으로, 이러한 socre를 softmax를 통해 정규화 시켜 가중치를 계산하는 것이다.
이 가중치의 합으로 context vector, 즉 맥락을 설명할 수 있는 벡터를 만들고 이를 ouput 생성 시에 반영한다.
금까지 설명한 것은 decoder에 Attention을 적용한 case이다.
RNN을 encoder로 사용하였을 때의 가장 큰 단점으로는 앞에 있는 정보 손실(long term dependency) , 학습도 잘 안되고, 병렬학습이 안된다(앞에 단어까지 전부다 인코딩 과정을 거쳐야만 학습할 수 있어 병렬학습이 안된다. 해당 경우, 현업에서 부적합하고 굉장히 비효율적이다. )는점이 있었는데 Transformer는 이를 개선한다. 지, Transformer는 attention으로만, 즉 인코더에도 attention을 적용한 모델이다.
다음 포스팅은 self-attention과 transformer이다!
'AI > NLP' 카테고리의 다른 글
[NLP] Parameter efficient LM tuning (0) | 2023.07.02 |
---|---|
[NLP] Chatgpt API 사용하기/ Chatgpt를 사용한 inference (0) | 2023.06.18 |
[Paper review/NLP]Tokenization Repair in the Presence of Spelling Errors (CoNLL 2021) (0) | 2023.05.23 |
[NLP] 자연어 모델 이해하기 (1) - NLP의 이해/ RNN / LSTM (2) | 2023.04.09 |