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) - \ma

Wasserstein Auto-encoders (vs VAE)

이미지
비전쪽을 잘 모르다보니 Wasserstein GAN이 나왔을 때도 어렵다는 얘기 정도만 듣고 따로 찾아보지는 않았는데 이번에 스토리 생성 관련 연구를 하면서 이 Wasserstein Distance를 활용한 Auto-encoder가 나와서 소개하고자 합니다.  Backgrounds 1. Wasserstein Distance(편의상 W-dist) W-dist는 두 확률 분포간의 거리를 나타내는 방식으로 Optimal Transport 문제에서 유래했다. 확률 분포를 흙더미라고 생각하고 \(P(X)\)를 \(Q(X)\)로 옮길 때 필요한 일의 양을 두 확률 분포의 거리라고 정의할 수 있다. 고전역학에서 일의 양은 힘 곱하기 거리로 표현되는데, 확률 분포의 무게는 합이 1로 제한되고, 거리는 단순히 euclidean distance로 표현할 수 있을 것이다. 이때 \(P\)의 \(x\)위치에서 \(Q\)의 \(y\)위치로 옮기는 확률 분포의 양을 \(\gamma(x,y)\)로 표현하고, 거리 함수(cost)를 \(c(x,y)\)로 표현해보자. 그러면 W-dist는 아래와 같이 정의할 수 있다. $$ W(P,Q) = \inf_{\gamma \sim \Gamma[P,Q]} \mathbb{E}_{X,Y \sim \gamma} [c(X,Y)] ,\\ \textrm{where } \int_x \gamma(x,y) dx = Q(Y), \int_y \gamma(x,y) dy = P(X), \gamma(x,y) \geq 0 $$   2. Variational Autoencoder 데이터셋의 Low dimension Latent Variable을 학습하기 위한 모델 중 하나인 VAE는 그 수학적 배경과 단순한 구현으로 인해 여전히 많이 사용되는 기법이다. 단순히 point estimate을 하는 auto encoder와 달리 VAE는 latent variable에 대한 gaussian prior 및 posterior를 가정하여 얻어진 tractable한 ELBO(Evidance L

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

이미지
업데이트 [22/10/4] 모두의말뭉치 + alpha로 학습한 KoUL2 모델을 huggingface hub 에 릴리즈했습니다! ---------------------------------------- 이 포스트에서는 lassl 오픈소스를 사용해서 실제로 한국어 코퍼스를 활용한 사전학습 모델을 만드는 법을 다룹니다. 제가 참여해서 구현한 T5와 UL2의 구현 방식, 고민한 내용들을 공유하고자 합니다. Lassl 소스코드는 여기 에서 확인하실 수 있습니다. TFRC 프로그램 소개 및 신청하기 1. 다음 사이트에 가서 TRC 프로그램의 form을 작성하고 신청합니다.  https://sites.research.google/trc/about/  2.  며칠 지나면 다음과 같은 메일이 옵니다. 3. console.cloud.google.com에서 프로젝트를 생성한 뒤 그 프로젝트 ID를 메일 내 링크를 통해 입력하면 됩니다. 그러면 다음과 같은 승인 메일이 며칠 내에 옵니다. 4. 이제 TPU instance를 무료로 사용할 수 있습니다! GCP TPU 인스턴스와 디스크 만들기 1. 첫 번째 단계로 gcloud cli를 설치해야 합니다. 해당 내용은 플랫폼 별로 자세하게 설명되어 있으니 여기 를 참조해주세요. 다만 아래에 설명하는 명령어들은 Unix 계열이기 때문에 Window를 사용하시는 경우 WSL이나 도커를 활용하시는 것이 따라하시기 편할 것 같습니다. 2. 다음 명령어로 디스크와 tpu 인스턴스를 생성합니다. 디스크는 선택사항이지만 편하게 쓰려면 붙이시면 좋습니다. 사용 시 경험상 매일 1000원 안팎으로 청구됩니다. 다만 기본 인스턴스에도 100GB가 있기 때문에 잘 아껴 쓰면 디스크를 붙이지 않아도 됩니다.  export GCP_DISK_NAME=lassl-disk export GCP_INSTANCE_NAME=lassl-tpu export GCP_PROJECT=<your_project_id> # i.e. fast-cascade-123456 exp

Review : Switch Transformer + ST-MOE-32B

이미지
Sparcity in Transformers 트랜스포머의 성능을 개선하는것으로 알려진 내용은 Kaplan et al. 에서 밝힌 세 가지이다. (1) 모델의 파라미터 크기 (2) 데이터 셋의 크기 (3) 계산량(Computational Budget) Switch Transformer의 저자들은 여기에 한 가지 차원을 더 추가하는데, 그것이 example당 FLOPs를 고정한 채로 늘어나는 parameter count를 늘릴 수록 성능이 좋아진다는 것이다. 이 개념과 Switch Transformer를 설명하기 위해서는 먼저 Mixture of Experts라는 개념을 살펴봐야 한다.  Mixture of Experts(MoE) MoE는 Shazeer et al.  에서 소개된 개념으로 Neural Model(간단하게는 FFN)을 expert라고 부를 때 example 별로 적절한 expert에 routing을 해줘서 계산량을 줄이면서도 큰 모델을 만드는 방식이다. 위의 이미지는 RNN 같은 recurrent 구조에 MoE를 적용한 형태인데, Gating Network에서 주어진 샘플 \( x \)가 주어지면 \(n\)개의 expert에 대해서 어디에 할당할지에 대한 확률 분포를 계산하게 된다. 가장 단순한 Softmax Gating 방식은 다음과 같다. $$ G(x) = \textrm{Softmax}(x \cdot W_g)  \\ y = \sum_{i=1}^{n}G(x)_i E_i(x)\quad\textrm{where}\quad E_i = (i\textrm{-th expert})$$ softmax output을 그대로 사용하면 expert가 densely activate 되므로 sparse model의 이점을 누릴 수 없다. 따라서 여기에서 top-k개의 Expert만 사용하는 것이 일반적이다. Shazeer et al.  에서는 적어도 두 개의 expert간 비교가 필요하기 때문에 k 값은 1보다는 커야한다고 주장했지만 Switch Transformer의 저

Review : Unifying Language Learning Paradigms

이미지
MLM과 CLM을 넘어서 최근 스터디에서 T5, BART 등의 Encoder-Decoder 구조를 가진 언어 모델 사전학습을 진행하면서 "사전학습 = mlm or clm" 이라는 공식은 101에 불과하다는 생각을 하게 되었다. 알고 있던 BERT나 GPT는 self-supervision을 통한 pretraining을 제시한 기념비적인 논문들이긴 하지만 더 효과적이고 새로운 방법들이 많이 등장했다. 예를 들어 BART에서는 Text-infilling을 제안했는데 input text를 \( \textrm{span_length}  \sim \textrm{Poisson}(\lambda)\) 인 span으로 전체의 30%를 마스킹한 후에 인코더 인풋으로 넣는다. (학습 자체는 GPT와 같이 uncorrupted input에 대한 next-token-prediction으로 한다는 게 함정.. 그런데도 신기하게 infilling이 된다.) T5는 좀 더 일반적인 방식을 제안하는데 span masking을 하고 해당 masking에 들어갈 부분을 예측하는 것이다. 이 경우 input은 sentinel token이라 불리는 문장 내에서 unique한 토큰으로 (e.g. <extra_id_0>, <extra_id_1>,...) span-masking되고 target은 해당 span을 예측할 수 있도록 sentinel token 뒤에 정답 text가 연속해서 나오는 형태가 된다. 예를 들면, Original : The cute dog walks in the park Input : The <extra_id_0> walks in <extra_id_1> park Target : <extra_id_0> cute dog <extra_id_1> the <extra_id_2> 예시에서 볼 수 있듯이 각 sentinel token은 여러 개의 subword로 구성되어 있을 수 있기 때문에 단순한 iid