「大規模言語モデルを作る」についてまとめてみた
LLMについて、いいスライドがあったので、まとめてみました。
作成者の小山田さんは、NECでLLM系の研究開発グループを主催しているそうです。
cotomiというNEC独自の高い日本語力を持つ言語モデルを開発しているみたいです。
LLMの構築方法について一般論が書かれているためそれにフォーカスしていきます。
結構濃密なスライドな上、図もわかりやすいのでしっかり読みたい方は元の資料をご覧いただくのがおすすめです。
それを踏まえて、要点だけ知りたい!という方向けにまとめます。
はじめに
こちらの資料では、LLMの製造工程を3つではなく、4つのフェーズに分けて解説しています。
初めのフェーズは、「0. 覚悟を決める」としています。
これは、費やせるお金と時間を決めることです。
LLMの品質は、ノウハウ×投下したリソース量の対数に比例すると言っています。すなわち、リソースを投下した分だけ品質は向上するが、どんどん投資効率は下がっていくことを言っています。
また、ノウハウがあることでリソースの投資効率が上がることも述べています。
わかりやすいリソースコストはGPU費やデータ準備費です。GPUは言わずもがな、LLaMA-2を動かすのにも数十億のGPUが必要となります。また、データも高品質なものを準備するにはそれなりのコストがかかります。
LLMの作り方
LLMの製造工程は、
事前学習モデル(初期値)→
事前学習モデル(学習済み)→
指示学習モデル→
指示学習モデル(アライン済み)
の順番に巨大モデルを大規模かつ高品質な種々のテキストデータで逐次的に学習することで品質を高めていいます。
この流れは、事前学習済みモデルであるGPT-3を実用に耐えうる指示学習とアラインメントによってChatGPTが完成する流れを指しています。
1. 事前学習
事前学習を行う意味はなんでしょうか。正解は、「知識」と「推論能力」を持たせることです。
初期パラメータを持つ事前学習前モデルは、「吾輩は猫である。名前は」の後に続く言葉をランダムにしか推定できません。夏目漱石の書籍を知識として知っていれば「まだない。」が続くことを予測できます。(Zero-shot推論)
また、次のような推論能力も持たせることができます。
この続きを書けと言われた時、文脈内の事例からその場で翻訳タスクを学び推論できるのが「Few-shot推論」です。
モデルのかなりの能力は事前学習で決まり、後段フェーズでの「劇的な改善」は困難です。
つまり、基本的な知識や推論能力はこの事前学習で決まってしまうということです。
LLMのモデルには、Text-to-Textモデルから、次のようなタイプから要件に応じて選びます。
TransformerのDecoder: GPT, LLaMA
TransformerのEncoder-Decoder: T5, Aya
RNN: RWKV
状態空間モデル: Mamba
ハイブリッド: UL2
モデルを選び、そのパラメータ数の大きさを選ぶと必要なデータ数やGPUが決まってきます。近年のトレンドは、モデルサイズを抑えてデータを過剰にするという自動車でいうターボモデルのようなものが流行しているそうです。LLaMA2もそのターボモデル側に分類されます。基準はデータ量:パラメータ数=20:1にすると良いというChinchilla最適[Hoffmann+22]を元にしています。
上記のようなトレンドは、Chinchillaがデータが無限に存在し、モデルが無限に大きくできるという非現実的な仮定のもとであることの反動としています。
つまり、実際にはデータは有限であり、モデルはある程度のサイズで抑えたいという実情があります。そこで、LLaMAのようにモデルサイズは推論環境や速度の要件に伴って定め、できるだけ多くのデータを突っ込む傾向になっているそうです。
しかし、この注意点として、小さいモデルにも限界は存在し、特に記憶できる知識量(QA能力)や多言語能力に限りがあることに言及しています。
個人的な感想ですが、十分な推論能力を保っていれば、知識は外部メモリにおいておき、言語も例えば日本語と英語に対応していれば良いとなれば軽量化は進むのではないかと思いました。
実際の事前学習ではデータの準備とその実行が始まります。Nカ月の学習を経て、事前学習モデルが獲得できます。
この段階でも使用する人もいますが、一般人は「期待と違う。」となります。例えば、「100文字以内で」という指示をしたい場合、対話したいというようなChatGPTを期待することが多いです。
そこで、事後学習(Post-Training)に移ります。
2. 事後学習(Post-Training)
事後学習の目的は、モデルに「機能」を持たせることです。例えば、
マルチターンの対話能力
制約遵守能力
要約
RAG
function calling, math, coding, ..
など多岐にわたります。
このように、GPT-3などの事前学習済みモデルに備わった潜在的な知識や推論能力、その他能力を事後学習によって「発現させる」ことでChatGPTを作
るイメージです。
では、事後学習とはズバリ何をやっているのでしょうか。これは、ドメイン特化言語の設計とそのデータによる実装です。
例えば、ChatMLはマルチターン対話の構造を持ったテキストに整形し学習します。これによって、質問と対話履歴にアテンションが張られ、文脈を考慮した対話が可能になります。
WebGPTでは、ブラウザ操作をコマンド化し、自律的なRAGを可能にします。
そのためには、機能を定義し、データを作り、学習する必要があります。これがInstruction Tuning(指示学習)です。このプロンプト(入力)xを入れたら、こんな出力yをしてほしい、というペアを作り学習します。
著者は繰り返し「いいデータはタダでは手に入らない」ことを強調しています。それっぽいデータはネット上に転がっていたり疑似生成できるが、安易に使用するとそれっぽく動くが使うと微妙なモデルが出来上がると述べています。
事後学習には2ステップがあります。
指示学習(Instruction-Tuning)は、あるプロンプトに対する「望ましい出力」、こんな時にはこんな出力をしてね!です。(xᵢ, yᵢ )。
アラインメント(Preference-Tuning)はより好ましい出力、ということで、この出力よりもこっちがより好ましい!を覚えさせます。(xᵢ , (yᵢ₁<yᵢ₂) )。
指示チューニングはCausal LMタスクで教師ありFine-tuningをしますが、アラインメントは強化学習、特殊な損失のSFTを行います。
この二つは、機能をつける、できることを増やす役割と、出力結果の調整や知らないことを知らないと言わせる、非倫理的な内容を出力にしないようにするなど、「できるけど、あえてしない」ことを増やす機能と明確に分かれています。
包丁の使い方を知って料理をできるようにして、人に向けないようにしないことを覚えるのような人間の学習の仕方に似ていますね。
事後学習は「機能とその要件を決める」ことが5割と述べています。つまり、モデルがどう振る舞うべきかという機能定義がなければ事後学習はできないということです。
ここでは「機能」を定義して要件に落としてみることを勧めています。これを怠ると、とりあえずChatGPT的な何かが爆誕し、それっぽいけど(ry なものが完成してしまいます。
私が非常に共感したのは、「LLMで本当に実用を目指すのならば、地道な機能の列挙・設計・開発が必須」の部分で、大規模なコーパスでの事前学習とオープンな指示データでの指示学習が"自然発生的"に60点ぐらいをたたき出してしまうという観点です。
これは、共通認識やコモンセンスというものは言い換えれば先入観でもあり、それを持っているとなんとなくそれっぽい回答を導くことができます。しかし、本当に必要な情報は共通認識と離れたところにあり、これを引き出すための目的を持った設計が必要であるということです。
3. モデル選定・評価
指示学習で「機能」を獲得したら、その「機能」をテストし、その結果に応じてリリースするモデルを決定します。
評価の目的は
ゴールとのギャップを認識して施策の効果を見極め正しい方向に進むため
手段と目的が逆転したり、評価している観点(指標)がゴールと乖離していない価格にするため
ということがあります。
また、インドメイン評価とアウトドメイン評価を分別すること、データセットのコンタミを避けることに言及しています。
LLMの評価指標としてRogue Scores[Grusky+ACL23]があります。しかし、実際には同じROGUEスコアを評価しているように見えて、再現実験ができない、後処理などが異なり比較できない、などのため、論文を跨いでROGUEスコアを比較できるケースがほとんどなかったといいます。
そのため、本当に信頼できるのは手元での再現結果であり、自らの手で再現実験を行うことの重要性も言及されています。
まとめ
ということで、簡潔にまとめるといいながら長くなってしまいましたが、LLMは巨大なモデルを大規模・高品質な種々のテキストデータで逐次的に学習することで構築されます。
事前学習モデル(初期値)
→事前学習事前学習モデル(学習済み)
→指示学習指示学習モデル
→アラインメント(PPO, DPO)指示学習モデル(アライン済み)
ということで小山田さんのhttps://dbsj.org/dbsj_lecture/ でのトーク内容のスライド資料についてまとめました。
この記事が気に入ったらサポートをしてみませんか?