未分類

自分だけの AI を作ってみよう — LoRA Fine-tuning 入門

LoRAを使えば、既存の大規模言語モデルを数百〜数千件のデータで”自分色”に染められる。文体、口調、専門知識――すべてあなたの手の中に。

Vol.01 · 2025 · 読了時間:約10分

「ChatGPTみたいなAIを自分で作りたい」「でも、一から学習させるなんて無理でしょ?」――そう思っているなら、LoRA(Low-Rank Adaptation) の話を聞いてほしい。

GPT-4クラスのモデルをフルで再学習させると、膨大なGPUと時間が必要だ。しかしLoRAは違う。元のモデルには手を触れず、ほんの少しの「差分層」を追加するだけで、自分仕様のAI が完成する。コストは驚くほど小さい。

LoRA とは モデルの重みを直接変えず、小さな行列(ランク分解)を各層に”貼り付ける”手法。元モデルは凍結したまま、追加パラメータだけを学習する。VRAM消費を大幅に削減しながら、高い適応精度を実現する。

では、具体的にどこに「貼り付ける」のか。そして学習データはどう用意すればいいのか。順を追って見ていこう。


01 — アーキテクチャ:どこに LoRA を挿すか

Transformerベースのモデルには大きく Attention(注意機構) と MLP(前向き結合) の2種類の線形層がある。それぞれ「役割」が違うため、LoRAの効き方も変わってくる。

Attention 系

役割LoRA の効果実務感
q_proj (Query)「何に注目するか」の視線を決める指示追従性・文脈の拾い方に直結最小構成ならまずここ
k_proj (Key)一致度を測る「相手側」一致度の地図を描き換えるq_proj とセットで強力。単体コスパはやや劣る
v_proj (Value)実際に取り出す情報の中身語彙・表現の出力に影響q+v の組み合わせが定番
o_proj (Output)ヘッド結合後の最終調整取ってきた情報の”混ぜ方”を調整出力の安定感・文体寄せに地味に効く

MLP(FFN)系

役割LoRA の効果実務感
gate_projどの特徴を強調/抑制するか選別文体・口調のクセを寄せる定型表現・レジスタ制御に強い
up_proj抽象特徴を高次元に展開する新しい表現・専門語が入りやすくなるup/down は対で入れると効きが出る
down_proj展開した特徴を主成分化して戻す最終的な「出力のノリ」を整えるup とセットで使う

文体を変えたいなら MLP。文脈の理解を変えたいなら Attention。


02 — 実務プリセット:どれを選ぶか

目的に応じてターゲット層を絞れば、学習コストを最小化できる。

プリセットターゲット使い所難度
最小・高コスパq_proj v_proj指示追従・RAG追従性向上⭐ 入門
安定 + 出力寄せq v o_proj語尾・接続表現の安定感⭐ 入門
Attention 全部q k v o難タスク・長文整合性⭐⭐ 中級
MLP だけgate up down文体・レジスタ寄せ⭐⭐ 中級
全部のせAttn + MLP 7層ドメイン適応・総合強化⭐⭐⭐ 上級

まずは q_proj + v_proj から始めるのが鉄板。物足りなければ MLP 三点セットを追加していく。


03 — 学習データ:何を食わせるか

LoRAの性能はデータで決まる。モデルの構造を工夫するより、「何をどう教えるか」 の方がはるかに重要だ。

指示追従 SFT(基本形)

system で役割・文体を固定し、user の指示に対して assistant が回答する。最もシンプルで汎用性が高い。

{"messages": [
  {"role": "system", "content": "あなたはモダン小説家。静けさと余韻を大切に書く。"},
  {"role": "user",   "content": "冬の朝をテーマに200〜300字の短章を。最後は比喩で。"},
  {"role": "assistant", "content": "(完成テキスト)"}
]}

条件付きスタイル制御

長さ・人称・語尾・温度感などを明示指示でコントロールできるよう学習させる。

{"messages": [
  {"role": "system", "content": "あなたはモダン小説家"},
  {"role": "user",   "content": "{\"theme\":\"駅の朝\", \"person\":\"一人称\", \"tone\":\"静か\", \"length\":\"200-250字\", \"ending\":\"余韻\"} の条件で短編を書いて"},
  {"role": "assistant", "content": "(条件を満たす本文)"}
]}

DPO / Preference(好み学習)

「良い出力」と「悪い出力」のペアを与え、モデルに好みの方向を直接学習させる。SFTより効率的な場合も多い。

{
  "prompt": "『夜の公園で…』を200字で",
  "chosen":   "(良い方の出力)",
  "rejected": "(惜しい / 悪い出力)"
}

作り方:自動生成 → ルーブリックで自己評価 → 上位を chosen、下位を rejected に振り分ける。

コンテキスト根拠つき生成(RAG 想定)

与えた資料に忠実な生成を覚えさせる。幻覚抑制・情報の根拠づけに効果的。

{"messages": [
  {"role": "system", "content": "資料に忠実に、創作へ最小限に転写せよ"},
  {"role": "user",   "content": "#資料\n(短いノーツ)\n#指示\n資料の情景だけを使い120〜180字の掌編に"},
  {"role": "assistant", "content": "(資料の要素だけで書いた短編)"}
]}

まずはシンプルな指示追従 SFT から始め、品質が安定してきたら DPO でさらに磨くのが現実的な順序だ。


04 — ロードマップ:今日から始める 5 ステップ

Step 1 — ベースモデルを選ぶ LLaMA / Qwen / Mistral など。Hugging Face で公開されているものなら基本 OK。小さいモデル(1.5B〜7B)から始めると扱いやすい。

Step 2 — 層の命名を確認する モデルごとに層の名前が違う。model.named_modules() で確認し、target_modules に実際の名前を設定する。

import re, torch
from transformers import AutoModelForCausalLM

model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen2.5-1.5B-Instruct")

wanted = [r"\.q_proj$", r"\.k_proj$", r"\.v_proj$", r"\.o_proj$",
          r"\.gate_proj$", r"\.up_proj$", r"\.down_proj$"]
pat = re.compile("|".join(wanted))

for name, module in model.named_modules():
    if isinstance(module, torch.nn.Linear) and pat.search(name):
        print(name)

Step 3 — データを用意する(最低 100 件〜) system / user / assistant の形式で JSON を作る。品質 > 量。100件の高品質データは1万件のノイズより強い。

Step 4 — LoRA パラメータを設定して学習 rank(r)は 8〜16 から始める。q_proj + v_proj をターゲットに、まず数エポック回してみる。

Step 5 — 評価して繰り返す 指示追従度・文体一致・幻覚の有無をチェック。物足りなければ MLP 層を追加し、データを増やして再学習。


05 — まとめ:あなただけの AI を育てよう

LoRA は「AIを使う」から「AIを作る」への最短ルートだ。巨大なインフラも、膨大なデータも必要ない。自分の文章・知識・スタイルを数百件のサンプルに落とし込めば、世界にひとつだけのモデルが手に入る。

まず q_proj + v_proj、rank=16、100件のデータ。そこから始めてみてほしい。


チートシート

  • 指示追従を改善 → q_proj + v_proj
  • 文体を寄せる → gate_proj + up_proj + down_proj
  • 全部強化 → q, k, v, o + gate, up, down
  • VRAM 節約 → q_proj 単独から試す