チャプター 14 · ファインチューニング · 9 min

すべてを再訓練せずにモデルを専門化する

LoRAQLoRASFT。パラメータの0.1%を訓練することで汎用モデルを特定ドメインに適応させる方法。

ベースモデル——それは何なのか?

GPT-4やClaudeが初期訓練——何十億ものトークンの生テキストで次の単語を予測する——から出てきたとき、多くのことを知っている。しかし、どのように振る舞うかを知らない。

生のモデルに履歴書を書くよう頼んでみよう。おそらく、履歴書に関するWikipediaの記事のように文章を続けるだろう。あるいはもっと悪く、FAQの続きのように複数の矛盾した回答を生成するかもしれない。

ファインチューニングは、この生のモデルを使いやすいアシスタント——役に立ち、一貫していて、特定の領域に適応した——に変換するステップだ。

2つの問題、2つの解決策

教師ありファインチューニング(SFT

最もシンプルな形式:(質問、理想的な回答)のペアをモデルに示し、その回答を生成するよう訓練する。

OpenAIがInstructGPTを作るためにやったことだ。人間が何千もの質問に対して模範的な回答を書き、モデルはそれを模倣することを学んだ。結果:「指示に従う」モデル。

限界:人間のデータを作るのにコストがかかり、2つの回答を比較する方法をモデルに教えない。

RLHF(実践でのDPO)

第8章で取り上げた内容だ。人間のフィードバックからの強化学習は、好みを学習する。SFTの補完であり、代替ではない。

重要な細部:2024年以降、ほとんどの選好ファインチューニングはDPODirect Preference Optimization)経由で行われている。古典的なRLHFのPPOではなく。これがSFTのみのモデルを、RLの計算コストなしにアラインメント済みのモデルへと変えるものだ。詳細は第8章にある。

しかしSFTとDPO/RLHFはコストの問題を共有している:モデルのすべてのパラメータを変更する。700億パラメータのモデルでは、何週間もの計算と何千ドものGPUコストがかかる。

LoRA:パラメータの0.1%を訓練する

LoRA(Low-Rank Adaptation、低ランク適応)はエレガントな技術だ。モデルの重みWを変更する代わりに、2つの小さな行列に分解された更新ΔWを追加する:

W_適応済み = W_ベース + ΔW    ここで    ΔW = B × A
  • A:ランク r × 次元の行列(小さい)
  • B:次元 × ランク r の行列(小さい)
  • W_ベース:元の重み——凍結され、変更されない

重要な洞察:ファインチューニング中の重みの更新は、実際には低ランク構造を持っている。適応を捉えるのに完全な行列は必要ない。2つの小さな行列で十分だ。

ランク r = 8、4,096次元のレイヤーで:LoRAは65,536パラメータを使用するのに対し、完全なレイヤーは1,600万パラメータ——**0.4%**だ。

ランクで遊んでみよう

ランク r は更新の表現力を制御する。r を変えるとΔWの構造がどう変わるか——そしてファインチューニング後のモデルの応答への影響を見てみよう。

LoRA は既存の重みの隣に小さな行列を 2 つ加える。何十億ものパラメータを書き換えるのではなく、数百万だけを学習する——モデルの大半は凍結されたまま、すべてのファインチューン亜種で共有される。

なぜこれほどうまく機能するのか?

LoRAの実験から得られた驚くべき発見:非常に低いランク(r = 4または8)でも、ファインチューニング後のパフォーマンスは完全なファインチューニングとほぼ同一だ。直感的な理由:有用な適応の空間は本質的に低次元だ。

言い換えれば:モデルを医療ライティングやPythonコードに特化させるために、すべてのニューロンを変更する必要はない。重み空間のいくつかの「方向性」で十分だ。

QLoRA:さらに軽量化する

LoRAが訓練パラメータの数を減らすなら、QLoRA(量子化LoRA)はさらに凍結されたパラメータの数値精度も下げる。

ベースモデルは4ビット(16または32ビットの代わりに)でロードされ、メモリ消費を4分の1にする。LoRAアダプターは勾配精度のために16ビットのまま保持される。量子化そのものの仕組み(FP32 → INT4 → INT2、各段階で何を失うか)については、第18章を参照してほしい。

結果:700億パラメータのモデルを単一のコンシューマーGPUでファインチューニングできるようになる。これが2023〜2024年の特化したオープンソースモデルの爆発的増加を可能にしたものだ。

適応の階層

今日、実践者はいくつかのレベルを区別する:

プロンプティング:モデルの変更なし。コンテキスト内のいくつかの例。速く、コストゼロ、限定的。

RAG:モデルをナレッジベースに接続する(第10章)。モデルの変更なし。

LoRAファインチューニング:ターゲットを絞ったデータセットで振る舞いとスタイルを適応させる。1台のGPUで数時間、数千の例。ほとんどのケースに適切なバランス。

完全なファインチューニング:すべてのパラメータを変更する。モデルの能力を深く変える必要がある場合(希少言語、非常に特定のドメイン)に必要。高コスト。

事前訓練:ゼロから始めるか、新しいコーパスで訓練を続ける。何千ものGPUのクラスターにアクセスできるラボ向けに限定される。

これがあなたにとって何を変えるか

ユースケースにモデルを特化させたい場合——あなたの編集スタイル、ドメイン、応答フォーマット——LoRAは今日の標準的な技術だ。

Hugging Face PEFTやAxolotlのようなフレームワークを使えば、数行のPythonでLoRAファインチューニングを開始できる。本当の難しさは技術的なことではなく、質の高いデータセットを構築することだ。優れたファインチューニングは、ChatGPTで生成された1万の例からではなく、丁寧に書かれた500の例から始まる。

更新日

ファインチューニング:LoRA、QLoRA、SFT · Step by Token