From In-context learning to RLHF (Feat. ChatGPT)

이미지
TL;DR 거시적인 발전 과정 : In-context Learning -> Instruction Tuning -> RLHF -> RLAIF In-Context Learning은 Large Scale 언어모델을 tuning하지 않고 새로운 task에 적용할 수 있는 직관적인 방법을 제시함 Instruction Tuning은 다양한 task를 Instruction + example의 템플릿으로 캐스팅하여 Implicit하게 multi-task로 tuning하며 결과적으로 Unseen Task를 더 잘 수행함  RLHF는 인간의 선호도라는 애매한 척도를 모델링하는 Reward Model과 강화 학습을 활용하여 언어 모델을 개선하는 방법을 제시함 RLAIF는 Human Labeling Cost를 없애고 RLHF에서 추가적으로 helpfulness와 harmlessness를 모두 개선할 수 있는 자동화된 파이프라인을 제시함  In-Context Learning & Instruction Tuning 오늘은 요즘 핫한 ChatGPT와 관련된 이야기를 하려고 한다. 바로 zero-shot의 가능성을 보여준 In-context Learning의 시작과 그것을 더 개선시킨 Instruction Tuning, 마지막으로 화룡정점을 찍은 Reinforcement Learning From Human Feedback에 대한 내용이다. 이후 Anthropic에서 RLHF를 시스템적으로 개선한 RLAIF라는 방식을 추가적으로 제안하기도 했다.  In-context Learning In-context learning은 GPT3 에서 소개되면서 pretraining-finetuning paradigm의 대안을 제시했다. 언어모델이 충분히 크고(도표에 의하면 6B 이상) 다량의 corpus로 학습했다면 사람의 자연어 instruction을 이해하고 바람직한(의도에 맞는) 텍스트를 생성할 수 있는 능력을 가지고 있다는 것이다. 예를 들어 언어모델을 QA 태스크에 명시적으

Contrastive Learning in Text Generation

Contrastive Learning

Concept

contrastive learning은 어떤 샘플에 대해서 같은 클래스에 속하는 샘플을 positive sample로 보고 가까워지게 하고, 그렇지 않은 샘플을 negative sample로 보고 멀어지게 하는 학습 방식을 말한다. 컨셉은 Triplet Loss를 사용한 Metric Learning과 유사하다. Triplet Loss는 아래와 같이 정의된다. 

$$ \mathcal{L}(A, P, N) = \max \left( \|f(A) - f(P) \|^2 - \|f(A) - f(N) \|^2 + \alpha, 0 \right) $$

\( A\)는 Anchor, \(P\)는 positive sample, \(N\)은 negative sample을 뜻한다. 위의 loss는 \( \alpha \)라는 Margin 값을 갖는데, negative sample과의 거리가 positive sample과의 거리보다 \(\alpha\)이상 떨어져 있어야 한다는 뜻이다. 비슷한 맥락에서 Contrastive Loss도 positive sample을 가까워지게 하고, negative sample을 멀어지게 하기 위해 InfoNCE loss(Oord et al.)를 사용한다. 

$$ \mathcal{L} = - \log \frac{\exp{(\cos(z_x, z_y) / \tau )}}{\sum_{y' \in \mathcal{B}} \exp{(\cos(z_x, z_{y'}) / \tau )}} $$

Triplet Loss와의 차이점은 negative sample을 in-batch로 가지고 올 수 있다는 점과 확률 분포의 관점에서 최적화를 한다는 것이다. InfoNCE loss는 이론적으로 anchor condition \(c\)와 target인 negative sample 또는 positive sample간의 mutual information을 근사한다. 

$$ I(x,c) \geq \log(N) - \mathcal{L}_N $$

여기에서 batch size \(N\)이 커질수록 bound가 타이트해진다. InfoNCE loss는 negative mutual information의 upper bound가 되기 때문에 InfoNCE를 최소화하면 Mutual Information은 최대화되는 것을 알 수 있다. 

Contrastive Learning을 사용하는 이유

Contrastive Learning은 CLIP이나 SimCSE 같은 연구들에서 사용된 것처럼 noisy data를 이용한 supervised learning을 가능하게 하거나 unsupervised learning을 가능하게 한다. CLIP은 noisy web crawled text-image pair를 이용해서 text와 image를 동일한 벡터공간에 embedding했다. batch 안에 False Negative가 있을 확률이 있지만 Batch size를 키움으로 인해 직접 최적화시키는 것보다 이러한 노이즈의 효과를 다소 완화시킬 수 있다. SimCSE같은 경우는 Unsupervised Learning을 가능하게 했는데, 어떤 문장을 서로 다른 Dropout mask로 표현형을 계산하면 positive sample을 만들 수 있다는 점을 이용했다. 다른 모든 배치 내 문장을 negative sample로 보고 InfoNCE loss로 학습하였다.

텍스트에 적용하기

위의 컨셉에서 볼 수 있듯이 Contrastive Learning은 기본적으로 sample-level로 적용하는 경우가 많다. 텍스트는 batch 안에서 보면 2D 데이터이기 때문에 두가지의 contrastive paradigm을 생각할 수 있는데 바로 sequence-level과 (sub)word-level이다. sequence-level은 기존의 sample-level과 motivation이 동일하기 때문에 왜 이런 방식을 적용하는지에 대해 이견이 없지만 word-level은 새로운 방식이어서 왜 도입했는지에 대한 의문이 생길 수 있다. 그래서 word-level contrastive learning을 제안하여 Neurips'22 Spotlight 논문으로 선정된 SimCTG(Su et al.)를 먼저 살펴보도록 하겠다.

SimCTG : Word-level Contrastive Learning

SimCTG에서는 아래와 같은 그림을 통해 기존 PLM에서 NLL Objective로 학습된 토큰 임베딩의 문제점을 지적한다. 


NLP is super fun! 이라는 문장에서 각 토큰 representation의 유사도를 비교해 봤을 때 거의 모든 토큰의 유사도가 0.8 이상으로 매우 높은 것을 볼 수 있고, 이것은 latent space를 비효율적으로 사용하는 anisotropy 문제를 야기한다고 주장한다. anisotropy 문제는 최근 몇몇 paper에서 다뤄진 문제점인데(이런 이슈를 해결하는 sentence embedding을 제안하는 논문) 간단히 말하면 representation들이 latent space 상에서 균등하게 분포하지 않고 일부 subspace에 (i.e. narrow cone) 몰려있는 현상을 뜻한다. 텍스트 생성에서 이것이 문제가 되는 이유는 모델 입장에서 토큰들의 임베딩이 거의 비슷하다 보니 토큰을 구분하는 것이 더 어려워지고, 그러다보니 세밀한 의미 구분이 필요한 상황에서 undesirable repetition이 생기게 되기 때문이다. 이런 문제를 해결하기 위해 디코딩 시에 p-sampling, k-sampling 등의 샘플링 기법을 사용하고 많은 부분 해결이 되지만 여전히 긴 글을 생성하다보면 semantic drift 같은 문제점이 발생할 수 있다.  

이 페이퍼에서는 이런 문제를 해결할 수 있도록 한 시퀀스 내에서 단어들간에 서로 임베딩이 달라지도록 하는 contrastive loss를 제안한다. 

$$ \mathcal{L}_{\mathrm{CL}} = \frac{1}{|x|(|x|-1)} \sum_{i=1}^{|x|} \sum_{j=1, j \neq i}^{|x|} \max \{ 0, \rho - s(h_{x_i}, h_{x_i}) + s(h_{x_i}, h_{x_j}) \} $$

이 loss는 직관적으로 시퀀스 \(x = [h_{x_1},h_{x_2}, ..., h_{x_{|x|}}]\)에 대해 시퀀스 내에 있는 각각의 token들의 표현이 서로 다른 위치에 있는 토큰들과 \(1-\rho\) 보다 작은 유사도를 갖도록 한다. 따라서 \(\rho\)가 커질수록 더 강한 contrastive signal을 준다고 볼 수 있다. 여기에서 \(s(\cdot) = \textrm{cossim}(\cdot)\)으로 정의되므로 자기 자신과의 유사도인 \( s(h_{x_i}, h_{x_i}) \)는 1이다.

학습에 사용하는 loss는 기존의 NLL loss와 CL loss를 단순하게 더해서 사용한다. 이렇게 학습하게 되면 위의 그림의 (b)처럼 서로 다른 토큰의 유사도가 적절히 분포되는 것을 확인할 수 있다.

저자들은 토큰간의 유사도를 활용한 1-step look-ahead decoding 방식 또한 제안하고 있는데, contrastive search라고 이름 붙였다. 방식은 기존의 Likelihood와 이미 decoding 된 token들간의 유사도를 모두 고려하여 부적절한 반복을 줄이면서도 확률적이지 않게 디코딩을 가능하게 한다. 

$$ x_t = \textrm{argmax}_{v \in V^{(k)}} \{ (1-\alpha) p_\theta (v | x_{<t}) - \alpha (\max \{ s(h_v, h_{x_j}) : 1 \le j \le t-1 \}) \} $$

정성, 정량적으로 이 Contrastive Search와 Contrastive Training은 open-ended text generation에서 효과적이라는 것을 확인할 수 있었다. open-ended dialogue generation에서는 사람이 생성한 글과 비교해서도 fluency가 거의 유사한 것을 확인할 수 있고 다른 decoding method에 비해 좋은 성능을 보여주고 있다. 주목할만한 점은 기존 MLE로 학습한 모델에도 contrastive search를 적용할 수 있고, 실제로 좋은 성능을 보여주고 있다는 점이다.(huggingface generate mixin에도 이 기능이 추가되었다!) 물론 CL training + CS를 적용한 것이 성능은 제일 좋았다. 





contrastive search의 유일한 단점은 top-k개의 token에 대해서 degeneration penalty를 계산하는 과정 때문에 시간이 오래 걸린다는 부분이다. beam search와 비교했을 때는 k(top-k 또는 Beam size) 개수가 적을 때는 Beam search가 빠르고 k가 많아지면 contrastive search가 빨라진다고 한다. 그런데 저자들이 이런 단점마저도 보완한 Momentum Decoding이라는 방식을 제안해서 이제 이 방식이 decoding의 mainstream이 될 것으로 보인다. 

CoNT : Sequence-level Contrastive Learning

CoNT 역시 Neurips'22에 Accept된 논문이지만 SimCTG에 비해서는 주목을 많이 받지 못했다. CoNT에서는 기존의 방식과 유사하게 in-batch sample과의 유사도를 사용해서 text 생성을 하는 방법을 제안한다. 추가적으로 학습된 모델을 사용해서 model generated sample까지 함께 contrastive pool에 넣어서 pair-wise로 contrastive loss를 계산하는 N-pairs Contrastive Loss를 제안한다. 학습과 inference로 과정을 나눠서 내용을 살펴보자. 


먼저 학습과정에서 가장 다른 점은 기존의 anchor에 대해 positive sample 하나, negative sample 여러 개로 signal을 주던 방식에서 contrastive pool과 adaptive margin을 이용하여 좀 더 다변화된 signal을 준다는 점이다. anchor가 sample중 하나인 일반적인 Contrastive learning과 다르게, CoNT에서 anchor는 condition만 인코딩한 부분(Prior)을 anchor로 사용하기 때문에 sequence-level임에도 decoding과정에 학습된 유사도 함수를 사용할 수 있게 된다. 

$$ \mathcal{L}_{\mathrm{N-Pairs}} = \sum_{(y^+, y^-) \in \mathcal{P}} \mathcal{L}(y^+, y^-) = \sum_{(y^+, y^-) \in \mathcal{P}} \max \{ 0, \cos(z_x, z_{y^-}) - \cos(z_x, z_y^+) + \xi ) \} \\ \textrm{where } \quad \xi = \gamma(\textrm{rank}(y^-) - \textrm{rank}(y^+) ) $$

위의 loss에서 가장 중요한 부분은 contrastive pool 내에서 두 개의 샘플을 골랐을 때 둘 중 encoder prior \(z_x\)와의 유사도를 기반으로 positive sample과 negative sample이 정해지고, 둘이 얼마나 멀리 떨어져야 하는지도 유사도의 rank를 기반으로 adaptive하게 정해진다는 점이다. CoNT나 SimCTG 둘 다 전통의 InfoNCE loss가 아니라 metric learning을 연상하게 하는 margin loss를 사용했다는 점이 인상깊다. 학습을 위한 최종 loss는 SimCTG와 마찬가지로 NLL loss와 N-Pairs loss의 단순합을 사용한다.

마찬가지로 학습된 유사도 함수를 이용한 Decoding Objective는 아래와 같다. 

$$ y^*  = \textrm{argmax}_{\hat{y}} \{ \alpha \cos(z_x, z_{\hat{y}}) + (1-\alpha) \prod_{t=0}^n p(\hat{y}_t| x, \hat{y}_{<y})  \} $$ 

\( \alpha \) 값은 모델이 예측한 토큰의 확률 분포와 encoder prior \(z_x\)와의 유사도 값을 밸런싱하는 하이퍼 파라미터로 0.5로 세팅할 수 있다. 저자들은 이런 학습 및 decoding 방식이 exposure bias를 줄여줄 수 있다고 주장하는데, 실험적으로 검증한 것은 아니다. 


정량적 결과를 보면 N-pairs Loss와 Sequence Similarity를 이용한 Decoding을 적용했을 때 성능이 가장 좋은 것을 볼 수 있다. 


추가적으로 여러 시퀀스를 시각화해봤을 때, CoNT를 적용한 경우가 beam search candidate이 GT 근처로 가는 경우가 많았다고 한다. 

References

  • CONT: Contrastive Neural Text Generation
  • A Contrastive Framework for Neural Text Generation

댓글

이 블로그의 인기 게시물

From In-context learning to RLHF (Feat. ChatGPT)

lassl을 이용한 언어모델 사전학습 (Feat. T5, UL2)

Wasserstein Auto-encoders (vs VAE)