大規模言語モデル(LLM)の学習方法

## はじめに
一般的な枠としてのLLMの学習方法をざっくりまとめてみます。
新しい学習方法も日進月歩で登場しているので最新の方法というわけではありません。

## ざっくり分類
ざっくり分類すると以下のようになると思っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594896/ac4a1b2c-9950-202c-5993-ead507418fe4.png)

## Pre-Training
Scratchについてはそのまんま。初期値から学習するやつ。

Continual Learningは継続学習と言われるやつ。

ラベルなしの大量データによる事故教師あり学習がベースとなる。

以下の3種類のようなものがある：

1. Full Language Modeling
1. Prefix Language Modeling
1. Masked Language Modeling

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594896/44c0bada-73bc-ea9e-49ce-d8039acf96f1.png)


## Fine-Tuning
Fine-Tuningは以下で大別される：
* Full Parameter
* PEFT(Parameter Efficient Fine-Tuning)
* Others(これらをFine-Tuningというのは本当はよろしくないかもしれない)

### Full Parameter
これはそのまま。いわゆる普通のFine-Tuning。

### PEFT(Parameter Efficient Fine-Tuning)
パラメータに関する効率的なFine-Tuning。
以下のようなパターンがある：

1. Adapter Tuning：
moduleレベルで拡張部分を付与

1. Prefix Tuning：
タスク固有のベクトルを追加

1. Prompt Tuning：
インプットに指示を追加

1. Low-Rank Adaptation：
Layerにoutputとの差分を学習させる層を追加
Ada LoRA という発展手法もある

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594896/a4d7b679-a154-6961-4f38-e9521ec1d3d4.png)

↓アダプターのイメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594896/f41e3dfc-c606-98c8-ab8c-bd42b1b053fb.png)

※どの手法も元のLLM部分のパラメータはfixして学習を行うため、一般的なFine-Tuningとは意味が異なることに注意

## Others
他の良く効く学習方法

### Instruction Tuning
既存の自然言語処理タスクを自然言語によるインストラクションを付与して変換し，大規模言語モデルをインストラクションに従った出力が出来るようにチューニングする手法

他手法とのフロー比較
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594896/2774298e-cc5a-78e6-b004-d800798db18e.png)

Instruction Tuningのイメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594896/f9aab5dd-51d5-9cbd-3f22-02f3ad08f253.png)

学習時に複数のタスクを指示の形でたくさん学習し、推論時に特定の(見たことのない)タスクに応用する思想。

### RLHF (Reinforcement Learning from Human Feedback)

GPT-3の改良版であるInstructGPTで初出と思われる。

人間の好みに対して直接的に最適化することでアライメントを行う。

以下の3ステップで行う：
1. Supervised Fine-tuning
人間がラベル付けしたデータでLLMを学習

1. Reward Model Training
LLMの複数出力を人間がランク付けをし、ランキングをReward Modelに学習させる

1. RL Fine-tuning
Reward Modelが計算する報酬が最大化するようにLLMを学習(Aligned LM)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594896/ddb49900-c1ad-9b07-1b97-aeff552a08d4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594896/64c074fc-84cb-0544-927c-095379d05e44.png)

### DPO (Direct Preference Optimization)

「Direct Preference Optimization: Your Language Model is Secretly a Reward Model」(2023.5)
Paper：https://arxiv.org/pdf/2305.18290.pdf 
参考：https://medium.com/@joaolages/direct-preference-optimization-dpo-622fc1f18707 

PPO(Proximal Policy Optimization)ベースのRLHFではReward Modelの学習や強化学習を使用。

DPOはRLHF同様に、人間の好みに合わせた改善を行う。

DPOでは強化学習は行わず、それに伴うハイパーパラメータの調整も不要になる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594896/29dc5bc7-ad9d-0df1-5686-3346e2047079.png)


DPOの流れ：
1. Referenceとなるモデルを人間の好みが反映されるように学習し(好ましい出力の確率を上げる)、Referenceモデルを固定する

1. 1つの入力に対するReference modelによる2つの出力(確率も保持)を取得

1. 学習するモデルの出力確率(分布)が2.と近づくように学習する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594896/0baf93c8-4aa4-83c7-eca6-d6cae5aeae56.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594896/3b108d36-c587-57f9-56dc-9a40467b4618.png)