JA EN
体系生成モデル
·無料·論文·16分で読めます

画像生成の実務地図 — SD・ControlNet・LoRA適用

画像生成をこれから触る人のための一枚地図。潜在拡散の4つの箱、プロンプトが効く場所、ControlNetによる構図の固定、LoRAでの微調整、そして見落とすと事故になるライセンスまでを、前提知識ゼロから順に繋ぎます。

対象textタスクgeneration

LoRA: Low-Rank Adaptation of Large Language Models

一次資料 — この記事の根拠

論文の発表 2021-06-17この解説の公開 2026-08-275年2か月後

High-Resolution Image Synthesis with Latent Diffusion ModelsarXiv:2112.10752論文ページ·PDF
Adding Conditional Control to Text-to-Image Diffusion ModelsarXiv:2302.05543論文ページ·PDF
LoRA: Low-Rank Adaptation of Large Language ModelsEdward J. Hu, Yelong Shen, Phillip Wallis ほか · 2021-06-17 · v2arXiv:2106.09685論文ページ·PDF
SDXL: Improving Latent Diffusion Models for High-Resolution Image SynthesisarXiv:2307.01952論文ページ·PDF
原文の要旨(Abstract)を読む

An important paradigm of natural language processing consists of large-scale pre-training on general domain data and adaptation to particular tasks or domains. As we pre-train larger models, full fine-tuning, which retrains all model parameters, becomes less feasible. Using GPT-3 175B as an example -- deploying independent instances of fine-tuned models, each with 175B parameters, is prohibitively expensive. We propose Low-Rank Adaptation, or LoRA, which freezes the pre-trained model weights and injects trainable rank decomposition matrices into each layer of the Transformer architecture, greatly reducing the number of trainable parameters for downstream tasks. Compared to GPT-3 175B fine-tuned with Adam, LoRA can reduce the number of trainable parameters by 10,000 times and the GPU memory requirement by 3 times. LoRA performs on-par or better than fine-tuning in model quality on RoBERTa, DeBERTa, GPT-2, and GPT-3, despite having fewer trainable parameters, a higher training throughput, and, unlike adapters, no additional inference latency. We also provide an empirical investigation into rank-deficiency in language model adaptation, which sheds light on the efficacy of LoRA. We release a package that facilitates the integration of LoRA with PyTorch models and provide our implementations and model checkpoints for RoBERTa, DeBERTa, and GPT-2 at https://github.com/microsoft/LoRA.


画像生成は「一つのモデル」ではない

はじめて画像生成に触ると、まず言葉の多さに面食らいます。SD1.5、SDXL、FLUX、ControlNet、LoRA、CFG、サンプラー、VAE。どれも同じ層の概念に見えて、実はまったく違う場所の部品です。

料理に例えると分かりやすくなります。モデル本体は食材と調理器具一式、プロンプトは注文、ControlNetは「この皿にこう盛りつけて」という型、LoRAは特定の味付けだけを覚えさせた小さなレシピカード、サンプラーとステップ数は火加減と加熱時間です。全部が同時に効きますが、効く場所は別々です。

この記事は、その「効く場所」を一枚の地図にします。個別の理論は他の記事に譲り、どの部品がどこにいて、実務で何を触ることになるのかだけを前提知識なしで通します。

全体像: 4つの箱

主流の画像生成モデル(Stable Diffusion系、FLUX系)は、大きく4つの箱でできています。

  1. テキストエンコーダ — 文字列を数値の並び(埋め込み)に変える。CLIPやT5がここに入る
  2. VAE(エンコーダ・デコーダ) — 画像を小さな「潜在画像」に圧縮し、最後に元のサイズへ戻す
  3. ノイズ除去ネットワーク — 潜在画像に乗ったノイズを推定して引く。UNetかTransformer
  4. サンプラー — 3を何回、どんな刻み幅で呼ぶかを決める手続き

いちばん効いているのは2番目のアイデアです。512×512のカラー画像は 512×512×3=786,432512 \times 512 \times 3 = 786{,}432 個の数値ですが、Stable Diffusion 1.x/2.x/XL のVAEは縦横を8分の1に縮め、代わりにチャンネルを4本持ちます。つまり 64×64×4=16,38464 \times 64 \times 4 = 16{,}384 個、約48分の1の広さの世界でノイズ除去を回すわけです。

これが「潜在拡散(Latent Diffusion)」です。画素の空間には、人間が見て意味を感じない細部が大量に含まれている。そこは重い生成モデルではなくVAEに任せ、意味を決める粗い構造だけを拡散モデルに扱わせる——この分業が、家庭用GPUで画像生成が回るようになった直接の理由でした。

学習の目的関数は、拡散モデルの基本形とほとんど同じです。

L=Ez,c,ϵ,t[ϵϵθ(zt,t,c)2]\mathcal{L} = \mathbb{E}_{z, c, \epsilon, t}\left[\left\lVert \epsilon - \epsilon_\theta(z_t, t, c) \right\rVert^2\right]
(1)

記号を1つずつ。zz は圧縮された潜在画像、cc はプロンプトを埋め込みに変えたもの、ϵ\epsilon は実際に混ぜたノイズ、tt はノイズの強さを表す時刻、ztz_tzz に時刻 tt の分だけノイズを混ぜたもの、ϵθ\epsilon_\theta が学習するネットワークです。言い換えると 「縮めた絵にノイズを混ぜて、プロンプトを見せながら『混ぜたノイズはどれか』を当てさせる」。それだけです。ノイズを当てられるなら引くこともできて、引き切った先に絵が残ります。足して引くという発想そのものは拡散モデルを1から理解するで扱っています。

プロンプトはどこで効いているのか

「呪文」と呼ばれることが多いプロンプトですが、効き方は具体的です。テキストは埋め込みの列になり、ノイズ除去ネットワークの各ブロックにあるクロスアテンション層で画像側と突き合わされます。

Attn(Q,K,V)=softmax ⁣(QKd)V,Q=WQz,  K=WKτ(c),  V=WVτ(c)\mathrm{Attn}(Q, K, V) = \mathrm{softmax}\!\left(\frac{QK^\top}{\sqrt{d}}\right)V, \quad Q = W_Q z,\; K = W_K \tau(c),\; V = W_V \tau(c)

つまりこの式は 「画像の各位置が出した質問(QQ)と、プロンプトの各トークンが掲げた名札(KK)を突き合わせ、合っている度合いに応じてトークンの中身(VV)を混ぜて持ち帰る」 と言っています。d\sqrt{d} で割っているのは、埋め込みの次元 dd が大きいほど内積の値も自然と大きくなるので、softmaxが1トークンだけに張り付いてしまうのを抑えるためです。

ここが要点です。質問(Q)は画像の側から、名札(K)と中身(V)はテキストの側から作られます。潜在画像の各位置が「自分はいま何を描くべきか」と問い、プロンプトの各トークンが「私はこの情報を持っている」と答える。その一致度は内積で測られ、softmaxで割合に変わります。

だから語順や強調で絵が変わるのは気分の問題ではありません。トークンの埋め込みが変われば内積が変わり、内積が変われば「どのトークンをどれだけ聞くか」の配分が変わるからです。

FIG 12本のベクトルを回すと内積と余弦がどう動くかを見る。プロンプトのトークンと画像側の問い合わせが「同じ向きを指しているほど強く効く」という、クロスアテンションの土台がこれ

そしてもう1つ、生成時にだけ効く仕掛けがあります。CFG(Classifier-Free Guidance)です。1ステップにつきネットワークを2回呼びます。プロンプトを見せた場合と、見せなかった場合。

ϵ^=ϵθ(zt,t,)+s(ϵθ(zt,t,c)ϵθ(zt,t,))\hat{\epsilon} = \epsilon_\theta(z_t, t, \varnothing) + s \left( \epsilon_\theta(z_t, t, c) - \epsilon_\theta(z_t, t, \varnothing) \right)
(2)

\varnothing は「プロンプト無し」、ss がツールで CFG Scale と呼ばれるつまみです。式が言っているのは 「プロンプト有りと無しの差=プロンプトが効いている方向を求め、その方向へ ss 倍だけ余分に押す」。大きくするほど指示に忠実になり、上げすぎると色が焼けて多様性が死にます。ネガティブプロンプトの正体もここで、「プロンプト無し」の枠に空文字ではなく blurry, watermark などを入れると、そこから遠ざかる方向へ押されます。中身の分解はCFGとサンプラーへ。

モデル選定: 何を基準に選ぶか

現場で最初に決めるのがベースモデルです。判断軸は5つに整理できます。

ネイティブ解像度。 SD 1.5 は512px、SDXL は1024pxを標準として学習されています。学習時と大きく違うサイズを指定すると、人物が二重に生えるなどの破綻が出ます。大きくしたいときは生成後にアップスケーラを通すのが定石です。

VRAM。 載らなければ量子化や逐次オフロードで凌ぐことになり、その分だけ遅くなります。

エコシステム。 見落とされがちで、しかも効きます。ControlNetもLoRAもベースモデルのアーキテクチャに紐づいた重みで、SD1.5用のLoRAはSDXLに載りません。出回っている資産の量が、そのまま作業効率になります。

テキスト描画と指示追従。 画像内に文字を描かせたい、複数の対象の位置関係を守らせたいといった要求は、世代が新しいモデルほど強い傾向があります。

ライセンス。 後述しますが、ここを最後に確認して手戻りする事故がいちばん多い。選定の最初に見るべき項目です。

制御: 弱い順に手を伸ばす

「思った絵にならない」ときの打ち手には強さの序列があり、弱いものから試すのが鉄則です。強い手段ほど、破綻したときの切り分けが難しくなります。

  1. プロンプト — 語を足す、順序を変える、ネガティブに入れる
  2. シードとサンプラー — 同じ設定でも初期ノイズが変われば絵は変わる。当たりのシードを固定して他を詰める
  3. img2img — 下絵を潜在空間に入れ、途中からノイズ除去を始める。denoising strength が「どこから始めるか」で、0に近いほど元絵に忠実
  4. inpaint — マスクした領域だけを描き直す。手や顔の修正はここ
  5. ControlNet — 線画・深度・姿勢などで構図そのものを縛る
  6. IP-Adapter系 — 参照画像の「雰囲気」を条件として足す

このうち構造を持ち込むのが ControlNet です。仕組みは素直で、ノイズ除去ネットワークのエンコーダ側を丸ごと複製し、元の重みは凍結したまま複製側だけを学習します。複製の入口と出口には、重みを0で初期化した「ゼロ畳み込み」を挟みます。

yc=F(x;Θ)+Z(F(x+Z(c;Θz1);Θc);Θz2)y_c = \mathcal{F}(x; \Theta) + \mathcal{Z}\big( \mathcal{F}(x + \mathcal{Z}(c; \Theta_{z1}); \Theta_c); \Theta_{z2} \big)

F\mathcal{F} が元のブロック、Θ\Theta が凍結された元の重み、Θc\Theta_c が複製側の重み、Z\mathcal{Z} がゼロ畳み込み、cc が条件画像(線画や深度マップ)です。読み下すと 「元の出力に、条件から作った補正を足す。ただし補正の入口と出口は最初ゼロなので、学習開始時点では元のモデルと1ミリも違わない」。この「最初は何もしない」設計のおかげで、巨大な事前学習モデルを壊す心配なく、少ないデータで条件付けを覚えられます。

実務で触るのは主に3つ。前処理の種類(Canny/Depth/OpenPose/Scribble など)、適用の強さcontrolnet_conditioning_scale)、適用する区間(生成の何%から何%まで効かせるか)です。

微調整: LoRAを当てる

モデル全体を学習し直すのは、データもGPU時間も現実的ではありません。そこでLoRA(Low-Rank Adaptation)を使います。元は大規模言語モデル向けの手法ですが、画像生成でこそ日常的に使われています。アイデアは一行で、重み行列 W0W_0 そのものを更新する代わりに、細長い行列2枚の積を差分として足します。

h=W0x+αrBAxh = W_0 x + \frac{\alpha}{r} B A x
(3)

W0W_0 は凍結された元の重み、AA は入力を rr 次元まで絞る行列、BB はそこから元の幅へ戻す行列、rrrankα\alphaalpha と呼ばれるスケール係数です。BB はゼロで初期化するので、学習開始時の差分はちょうど0。ControlNetのゼロ畳み込みと同じ思想です。

つまりこの式は 「元の重みには一切触らず、その横に『いったん rr 本まで細く絞って、また元の幅へ広げる』という迂回路をもう1本足し、その出力を α/r\alpha/r 倍して重ねる」 ということ。学習するのは迂回路だけなので、覚えられる変化の幅そのものが rr で頭打ちになりますα/r\alpha/r で割ってあるのは、rr を変えたときに効きの強さまで一緒に変わってしまわないようにするためです。

数を勘定すると軽さの理由が見えます。1280×12801280 \times 1280 の重みは約164万個ですが、r=8r=8 のLoRAは 1280×81280 \times 8 が2枚で約2万個、80分の1以下です。本体が数GBあるのにLoRAファイルが数MB〜数百MBで済むのはこれが理由です。

FIG 2行列をランク r で再構成する。r を上げると誤差は下がるがパラメータ数は増える。LoRAの ΔW = BA が「どこまで削っても意味が残るか」を、この場で確かめられます

図の通り、rを上げれば表現力は増えますが、過学習しやすくファイルも重くなります。画風だけを覚えさせたいのか、特定の対象の一貫性まで持たせたいのかで適正値は変わります(原論文の実験と根拠は論文解説 LoRA)。

読み込み側のコードは短く済みます。

from diffusers import StableDiffusionXLPipeline
import torch

pipe = StableDiffusionXLPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0", torch_dtype=torch.float16
).to("cuda")

pipe.load_lora_weights("./my-style.safetensors")   # 差分だけを足す
image = pipe(
    "a ceramic teapot on a wooden table",
    negative_prompt="blurry, watermark",
    guidance_scale=6.0,                      # 式(2)の s
    num_inference_steps=30,
    cross_attention_kwargs={"scale": 0.7},   # 式(3)の差分をどれだけ混ぜるか
).images[0]

scale(WebUIでは <lora:name:0.7> という記法)を下げれば効きは控えめになります。複数のLoRAを重ねるときは、合計が強くなりすぎないよう1枚ずつ決めてください。

学習側で触るつまみは rank、alpha、学習率、ステップ数、そしてキャプションの書き方です。最後が一番効きます。覚えさせたい要素だけをトリガー語にまとめ、覚えさせたくない要素(背景や服装)はキャプションに明示的に書く。書かれていない特徴ほどトリガー語に吸い込まれるからです。

ライセンス: 最初に確認する

技術より事故が多いのがここで、3つの層を分けて考える必要があります。

1. モデルの重みのライセンス。 モデルごとにまったく違います。Stable Diffusion 1.x/2.x は CreativeML Open RAIL-M、SDXL 1.0 は OpenRAIL++-M で、いずれも「使用目的による制限」が付いた、通常のOSSライセンスとは性質の違うものです。FLUX.1 では [schnell] が Apache-2.0、[dev] が非商用ライセンスというように、同じファミリーの中でも条件が割れます。「Hugging Faceに置いてある=自由に商用利用できる」ではありません。

2. LoRA・ControlNet など追加重みのライセンス。 配布者が独自の条件(商用不可、再配布不可など)を付けていることがあります。ベースが商用可でも、載せたLoRAが非商用ならその成果物は使えません。

3. 学習データと被写体の権利。 実在の人物、既存のキャラクター、特定の作家の画風を学習させたLoRAは、ライセンス以前に肖像権・著作権の問題になり得ます。ライセンスファイルが「OK」と言っていても、それはモデル配布者が持っている権利についての話でしかありません。

さらに生成物の権利は法域によって扱いが分かれ、いまも動いています。商用案件では必ず法務の確認を通してください。この記事は法的助言ではありません。防衛策は単純で、使ったベースモデル・追加重み・ライセンスURL・取得日を、生成物と一緒に記録に残すこと。後から「これは何で作ったか」を再現できない状態がいちばん危険です。

現場ではこう使う

誰がいつ触るか。 ゲームやアプリのコンセプトアート担当が量産前のバリエーション出しをするとき。EC事業者が商品画像の背景差し替えやバナー素材を内製するとき。広告制作でラフ案を短時間で複数出すとき。ML基盤の担当が社内向けの生成APIを立て、品質とコストを見張るとき。

実際に触るパラメータ名。 guidance_scale(CFG Scale)、num_inference_stepsdenoising strengthseedcontrolnet_conditioning_scale、LoRAの scalerank / alpha、サンプラー名(Euler a、DPM++ 2M Karras など)。ツールはローカルなら ComfyUI や Automatic1111 系のWebUI、コードからなら Hugging Face の diffusers が事実上の標準です。

知らないと事故になる落とし穴。

設計レビューで問われる形。 「ControlNetのゼロ畳み込みは何のためにあるか」(学習開始時に元モデルの出力を変えず、事前学習を壊さないため)。「LoRAのrankを上げると何が起きるか」(表現力とファイルサイズが増え、過学習しやすくなる)。「CFGを上げても指示に従わないとき、次に何を確認するか」(プロンプトの曖昧さ、トークン長の打ち切り、ネガティブ側の過剰指定、ベースモデルの指示追従性能)。

まとめ

地図が頭に入ったら、次は各つまみの中身です。生成の「強さ」と「速さ」はCFGとサンプラーへ、ノイズを足して引くという発想の根っこは拡散モデルを1から理解するへ続きます。

参考文献

  1. High-Resolution Image Synthesis with Latent Diffusion Models. arXiv:2112.10752論文ページ·PDF
  2. Adding Conditional Control to Text-to-Image Diffusion Models. arXiv:2302.05543論文ページ·PDF
  3. Edward J. Hu, Yelong Shen, Phillip Wallis, Zeyuan Allen-Zhu et al.. (2021-06-17) LoRA: Low-Rank Adaptation of Large Language Models. arXiv:2106.09685論文ページ·PDF
  4. SDXL: Improving Latent Diffusion Models for High-Resolution Image Synthesis. arXiv:2307.01952論文ページ·PDF

本記事は上記論文の本文にもとづいて執筆しています。数値・主張は原典を優先してください。

コメント

コメントにはログインが必要です