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単独から試す