はじめに
Stable Diffusionで画像を生成する際、
プロンプト(指示文)を入力しますが、こんな経験、おありではないでしょうか?
- 「たくさんタグを書いたのに、後半のタグが全く反映されない」
- 「同じシードで不要なタグを消しても、画像が変わらなかった」
実は、プロンプトには「順番」と「数」に明確なルールがあります。
この記事では、Stable
Diffusionがプロンプトをどのように処理しているかを
技術的に、でもわかりやすく解説します。
第1章:プロンプト処理の全体像
テキストから画像が生成されるまで、4つのステップがあります。
テキスト入力(例: "1girl, blue eyes, long hair")
↓
① CLIPトークナイザー ─ テキストを「トークン」に分解
↓
② CLIPテキストエンコーダー ─ トークンを「意味のベクトル」に変換
↓
③ Cross-Attention ─ テキストの意味を画像に注入
↓
④ U-Net ─ ノイズを除去して画像を完成
それぞれのステップを詳しく見ていきますわ。
第2章:CLIPトークナイザー
テキストの分解
最初のステップでは、入力されたテキストを「トークン」と呼ばれる小さな単位に分解します。
入力: "1girl, blue eyes, long hair"
↓ トークン化
["1", "girl", ",", "blue", "eyes", ",", "long", "hair"]
↓ トークンID化
[272, 1611, 267, 1929, 2575, 267, 1511, 2225]
CLIPトークナイザーは、テキストを辞書と照らし合わせてIDに変換します。
このIDがモデルへの入力になります。
トークン数について知っておくべきこと
| 事実 | 影響 |
|---|---|
| 1つの英単語 = 1〜3トークン | 長い単語ほどトークンを消費 |
| カンマ・スペースもトークン | , で約1トークン消費 |
特殊トークン <BOS> <EOS> |
先頭と末尾に自動挿入(2トークン消費) |
| CLIPは英語で学習 | 日本語は意味不明なトークン列になる |
⚠️ トークン上限 ─ 最も重要なルール
CLIPテキストエンコーダーが一度に処理できるのは
77トークン(BOS/EOS含む、実質75トークン)です。
これはSD 1.5でもSDXLでも同じです。
| モデル | CLIPの基本処理単位 | 目安の単語数 |
|---|---|---|
| SD 1.5 | 77トークン(実質75)× 1つのCLIP | 約40〜50語 |
| SDXL | 77トークン(実質75)× 2つのCLIP | 約40〜50語(1チャンクあたり) |
75トークンを超えたらどうなる?
AUTOMATIC1111やComfyUIなどの主要WebUIでは、75トークンを超えると
自動的にチャンク分割されます。
76トークン目からは「2つ目のチャンク」として
別途処理されるため、プロンプトが完全に切り捨てられるわけではありません。
ただし、チャンク間の文脈は切断されます。1つ目のチャンクと2つ目のチャンクは
別々にCLIPで処理されるため、チャンクをまたぐ要素の結びつきが弱くなります。
また、後方のチャンクほどAIの注目度(影響力)が弱まるため、
後半に書いた指示が反映されにくくなるのです。
チャンク分割があるとはいえ、最も重要な要素は最初の75トークン以内に収めるべきです。
75トークンを超えると、AIの注目度の低下とチャンク間の文脈切断により、
思い通りの画像が出にくくなります。
「たくさん書いたのに後半が無視された」ように見える原因の多くは、これです。
第3章:CLIPテキストエンコーダー
意味の変換
トークンIDはそのままでは「ただの数字」です。
テキストエンコーダーが、各トークンを「意味を持つベクトル」に変換します。
ベクトルとは、768個の数値の並びです(SDXLでは1280個)。この数値が「意味」を表現しています。
"blue eyes" → [0.23, -0.15, 0.87, ..., 0.42](768個の数値)
"red eyes" → [0.45, -0.32, 0.91, ..., 0.18](768個の数値)
「blue eyes」と「red
eyes」は似た概念(目)なので、
ベクトルの大部分は似ていますが、色に関する次元の値が異なります。
CLIPは「画像とテキストのペア」数億組で学習されているため、
テキストのベクトルが画像の特徴と正確に対応しています。
位置エンコーディング ─ 順番が重要な理由
CLIPはTransformerという構造を使っており、各トークンに「位置情報」が付与されます。
位置1: 1girl → 注目度: ★★★★★(最高)
位置2: solo → 注目度: ★★★★☆
位置3: standing → 注目度: ★★★★☆
...
位置30: smile → 注目度: ★★☆☆☆
位置50: detailed→ 注目度: ★☆☆☆☆
Self-Attention(自己注意機構)により、
前方のトークンほど他のトークンとの関連性計算で重視されます。
これが「プロンプトの順番が重要」な技術的理由です。
SDXLの2つのテキストエンコーダー
SDXLはSD 1.5と異なり、2つのCLIPモデルを使います。
| エンコーダー | 次元数 | 役割 |
|---|---|---|
| CLIP-L(ViT-L/14) | 768次元 | 一般的な概念 |
| CLIP-G(ViT-bigG) | 1280次元 | より細かいニュアンス |
2つのベクトルが結合されてU-Netに渡されます。これにより、SDXLはSD 1.5より複雑なプロンプトを理解できます。
第4章:Cross-Attention
テキストが画像になる仕組み ─ たとえ話
Cross-Attentionの仕組みは、「画家とアシスタント」に例えるとわかりやすくなります。
画家(U-Net)がキャンバスに絵を描いています。
アシスタント(テキストベクトル)が横で指示書を持っています。
画家はキャンバスの各ピクセルを塗るたびに、アシスタントに質問します:
「このピクセルは、どの指示に一番関係ある?」
アシスタントが「blue eyesです!」と答えれば、画家はそのピクセルを青く塗る。
「forestです!」と答えれば、緑の木々を描く。
これがCross-Attentionの本質です。
画像の各ピクセルが「どのテキストタグに最も関連するか」を質問→回答する仕組みです。
Attention Map ─ どのタグがどこに影響するか
Cross-Attentionの結果は「Attention Map」として可視化できます。
各テキストタグが画像のどの領域に影響しているかがわかります。
"blue eyes"→ 目の領域のピクセルが強く反応(高いスコア)"long hair"→ 髪の領域のピクセルが強く反応"standing"→ 全体の姿勢レイアウトに影響"forest"→ 背景全体のピクセルが反応"masterpiece"→ 画面全体にうっすら影響(品質向上)
タグが具体的なもの(目、髪)ほど特定の領域に集中し、
抽象的なもの(masterpiece、best quality)ほど画面全体に薄く分散します。
タグ同士の干渉
矛盾するタグを入れると、Attention Mapが混乱します。
| 入力 | 結果 |
|---|---|
"blue eyes" + "red eyes" |
紫色の目、左右で色が違うなど不安定 |
"1girl" + "2girls" |
人物が融合、意図しない構図 |
"sitting" + "standing" |
中途半端なポーズ |
矛盾するタグは避けて、1つの明確な指示にしてくださいませ。
前方のタグが強い理由
Cross-Attentionでは、テキストエンコーダーから渡されたベクトルの位置情報も影響します。
前方のタグほどAttentionスコアが高くなりやすく、画像への影響力が大きくなります。
最も重要なタグ(キャラ名、構図、人数)は必ずプロンプトの先頭に置く。
品質タグは最後でOK。なぜなら品質タグは画面全体に薄く影響するだけだから。
Q/K/V行列 ─ Attentionの心臓部
Cross-Attentionでは、3つの行列を使って「画像とテキストの対応関係」を計算します。
【Cross-Attention の計算フロー】
画像特徴マップ (z) ──→ W_Q で変換 ──→ Q (Query) 「このピクセルは何?」
↓
テキストベクトル (c) ──→ W_K で変換 ──→ K (Key) 「各タグの意味は?」
└──→ W_V で変換 ──→ V (Value) 「各タグの視覚的特徴」
Attention Score = softmax( Q × K^T / √d_k )
出力 = Attention Score × V
各行列の次元数
| 項目 | SD 1.5 | SDXL |
|---|---|---|
| Q の次元 (d_model) | 320 / 640 / 1280 | 320 / 640 / 1280 |
| K, V の次元 (d_context) | 768 | 2048 |
| d_k(1ヘッドあたり) | 40 / 80 / 160 | 64 |
| ヘッド数 | 8 | 10 / 10 / 20 |
√d_k で割るのは、次元数が大きくなるとドット積の値が大きくなりすぎて
softmaxの出力が極端になるのを防ぐためです(scaled dot-product attention)。
Multi-Head Attention ─ 複数の視点で見る
1つのAttentionだけでは、テキストと画像の複雑な対応関係を捉えきれません。
そこで複数のヘッド(頭)に分割して、それぞれ異なる「視点」でAttentionを計算します。
【Multi-Head Attention(SD 1.5, 1280次元ブロックの場合)】 入力: Q(1280次元), K(768次元), V(768次元) ↓ 8ヘッドに分割 Head 1: Q(160), K(96), V(96) → Attention → 出力(160) Head 2: Q(160), K(96), V(96) → Attention → 出力(160) ... Head 8: Q(160), K(96), V(96) → Attention → 出力(160) ↓ 結合 出力: 160 × 8 = 1280次元 各ヘッドが異なる特徴に注目: Head 1: 色の対応関係を学習 Head 3: 形状の対応関係を学習 Head 5: 空間的位置の対応関係を学習 ...など
SDXLは最大20ヘッド(SD 1.5は8ヘッド)を使います。 ヘッドが多いほど、テキストと画像の対応関係をより多角的に捉えられます。 これがSDXLの「プロンプトをより正確に反映する」能力の源泉です。
解像度による Attention の違い
U-Netは複数の解像度レベルで処理を行います。解像度によってAttentionの役割が変わります。
| 特徴マップの解像度 | ピクセル数 | Attentionの役割 |
|---|---|---|
| 64×64(SD1.5)/ 128×128(SDXL) | 4,096 / 16,384 | 大まかな配置(空・地面・人物の位置) |
| 32×32 / 64×64 | 1,024 / 4,096 | 中程度の構造(顔のパーツ、服の形) |
| 16×16 / 32×32 | 256 / 1,024 | 細かいディテール(目の色、髪の質感) |
| 8×8 / 16×16 | 64 / 256 | 全体的な雰囲気・スタイル |
高解像度レイヤーでは "blue eyes" が目の正確な位置に影響し、
低解像度レイヤーでは "blue eyes" が顔の領域全体に影響します。
つまり、同じタグでも複数の解像度で異なる形で画像に作用しています。
Self-Attention vs Cross-Attention
U-Netには2種類のAttentionがあります。混同しやすいので整理します。
| 種類 | Q の元 | K, V の元 | 役割 |
|---|---|---|---|
| Self-Attention | 画像特徴 | 画像特徴 | 画像内の構造的一貫性を保つ |
| Cross-Attention | 画像特徴 | テキストベクトル | テキストの意味を画像に反映 |
Self-Attentionにより「右目と左目のバランス」「体全体の一貫性」が保たれ、
Cross-Attentionにより「プロンプトの指示通りの画像」が生成されます。
この2つが交互に作用することで、構造的に正しく、かつテキストに忠実な画像が作られます。
Attention Map の可視化
AUTOMATIC1111 WebUIの拡張機能 DAAM (Diffusion Attentive Attribution Maps) を使うと、
各タグのAttention Mapを実際に見ることができます。
- どのタグが画像のどこに影響しているか一目でわかる
- 無視されているタグ(トークン上限超え)を特定できる
- タグ同士の干渉が起きている領域を確認できる
- 重み付け
(tag:1.3)の効果を視覚的に検証できる
第5章:ネガティブプロンプトの仕組み
Classifier-Free Guidance (CFG)
ネガティブプロンプトは技術的には「この方向から離れろ」という指示です。
最終出力 = ネガティブ出力 + CFGスケール × (ポジティブ出力 - ネガティブ出力)
| CFGスケール | 効果 |
|---|---|
| 1 | プロンプトの影響がほぼない |
| 7(推奨) | バランスが良い |
| 15 | 強くプロンプトに従う(色飽和しやすい) |
| 30 | 画像が崩壊することも |
Textual Inversion(Embedding)─ ネガティブの強い味方
Textual Inversion(TI /
Embedding)とは、
数千枚の低品質画像や作画崩壊データをAIに学習させ、1つの単語に圧縮したファイルです。
代表的なものに「EasyNegative」「badhandv4」などがあります。
| 方法 | トークン消費 | 効果 |
|---|---|---|
| 手入力 | 約30〜40トークン | 普通 |
| TI使用 | たった1〜2トークン | 手入力より強力 |
Civitaiなどからダウンロードしてembeddingsフォルダに入れるだけで使えます。
特にSD 1.5ではネガティブプロンプトのトークン節約に非常に有効です。
第6章:実践テクニック
テクニック1:重み付け
(dark red eyes:1.3) → 1.3倍に強化
(smile:0.7) → 0.7倍に弱化
((important tag)) → 1.1 × 1.1 = 1.21倍
1.5以上にすると画像が破綻しやすくなります。推奨範囲は 0.5 〜 1.4 です。
| モデル | 推奨範囲 | 理由 |
|---|---|---|
| SD 1.5 | 0.5 〜 1.4 | 比較的強い重みにも耐える |
| SDXL | 0.8 〜 1.2 | 言葉への感受性が高く、1.3以上で色が過剰になったり質感が プラスチックのようになることがある(トースト現象) |
SDXLでは特に、重み付けよりも文章で具体的に描写する方が効果的です。
テクニック2:トークンの節約
| 分類 | 例 |
|---|---|
| ❌ 悪い例 | beautiful, gorgeous, stunning, amazing eyes(4トークン無駄) |
| ✅ 良い例 | (beautiful eyes:1.3)(2トークンで強い効果) |
テクニック3:BREAK構文
1girl, blue eyes, long hair BREAK forest, sunset, dramatic lighting
BREAKでチャンクを意図的に分割し、キャラ特徴と背景を分離したい時に有効です。
- SD 1.5:効果的。75トークンの壁でチャンクが不自然に分割されるのを防ぎ、
意味のまとまりごとにチャンクを制御できる -
SDXL:まずはBREAKなしの文章形式を試すのがおすすめ。SDXLは文脈理解力が高いため、
BREAKで文脈を切断するとその長所を活かせないことがある。
要素の混ざり(色移り等)が起きる場合にBREAKを検討する
テクニック4:プロンプトの構造化
[キャラ識別] [構図] [身体特徴] [衣装] [表情] [背景] [品質]
例:
1girl, solo, upper body, looking at viewer,
blue eyes, long blonde hair,
white dress, ribbon,
smile,
garden, sunlight,
masterpiece, best quality
カテゴリ順を決めて毎回同じ順番で書くことで、安定した結果が得られます。 また、どのタグが効いているか検証しやすくなります。
テクニック5:モデル世代別のプロンプトの書き方
AIのテキスト理解力がモデル世代で大きく異なるため、
「古いモデルの書き方」を新しいモデルに使うと逆効果になることがあります。
| モデル | 理想の書き方 | 例 |
|---|---|---|
| SD 1.5 | タグの羅列 (カンマ区切り) |
1girl, blue eyes, white dress, forest, masterpiece |
| SDXL | 短い文章+タグ |
A beautiful girl with blue eyes wearing a white dress,
|
| FLUX | 詳細な 自然言語の描写文 |
A photorealistic close-up portrait of a young woman with delicate
|
- SD 1.5に自然言語で書く →
a, the, is等の文法語がトークンを無駄に消費 - FLUXにタグ羅列で書く → 文脈理解力を活かせず、平坦な画像になりやすい
- SDXLにSD 1.5の長大なネガティブをそのまま使う → 過剰な制限で「プラスチック感」が出る
テクニック6:画風別のプロンプトの書き分け
チェックポイントの画風(リアル系・アニメ系)に合わせて、
使う専門用語を切り替えるのがポイントです。
| 画風 | 使うべきキーワード | ネガティブに入れるもの |
|---|---|---|
| リアル系 | photorealistic, RAW photo, DSLR, 85mm lens, skin texture, film grain |
illustration, anime, 3D, painting, drawing |
| アニメ系 | anime artwork, cel shading, flat color, lineart, vibrant colors |
realistic, photorealistic, 3D, CGI, lips |
リアル系とアニメ系の用語を混ぜないでください。
例えば anime illustration, photorealistic, cel shading のように書くと、
AIが混乱して不自然な2.5D風のCG
(いわゆる「AI臭い絵」)になります。
また、アニメ特化モデルで RAW photo と書くのも逆効果です。
重み付けの内部処理
(tag:1.3) と書くと、内部では何が起きているのでしょうか?
【重み付けの内部処理】
通常: テキストベクトル c = CLIP("blue eyes") → [0.23, -0.15, 0.87, ...]
重み: テキストベクトル c' = 1.3 × c → [0.30, -0.20, 1.13, ...]
Cross-Attention計算で、K = W_K × c' となるため、
このタグに対するAttention Scoreが全体的に上昇する
結果: "blue eyes" の影響が強い領域が広がり、色もより鮮やかになる
ベクトルを大きくしすぎると、softmaxの出力が1つのタグに極端に集中します。
すると他のタグが完全に無視され、画像全体がそのタグの特徴に支配されます。
例えば (blue eyes:2.0) とすると、目だけでなく髪や服まで青くなることがあります。
Prompt Editing ─ ステップ途中でプロンプトを変える
デノイジングの途中でプロンプトを切り替える高度なテクニックです。
書式: [from:to:step]
[cat:dog:0.5]
→ 前半50%のステップは "cat" として処理
→ 後半50%のステップは "dog" として処理
[night:day:10]
→ ステップ1〜10は "night" として処理
→ ステップ11以降は "day" として処理
活用例
| パターン | 効果 |
|---|---|
[sketch:detailed illustration:0.3] |
初期で構図を決め、後半でディテールを追加 |
1girl, [school uniform:wedding dress:0.6] |
制服の構図でウェディングドレスのディテール |
[close-up:full body:0.2] |
顔のディテールを保ちつつ全身構図 |
初期ステップ(ノイズが多い段階)では大まかな構図やレイアウトが決まり、 後半ステップでは細部のディテールが決まります。 この特性を利用して、各段階で最適なプロンプトを適用します。
AND構文 ─ プロンプトの合成
AND を使うと、複数のプロンプトの出力を加算合成できます。
1girl, red dress AND blue background, starry sky
→ プロンプトAの出力(人物中心)と
プロンプトBの出力(背景中心)を
個別に計算して加算する
【AND構文の処理フロー】 ステップごとに: ① "1girl, red dress" → U-Net → ノイズ予測 ε_A ② "blue background, starry sky" → U-Net → ノイズ予測 ε_B ③ 最終出力 = ε_A + ε_B (加重平均も可能) 通常のカンマ区切りとの違い: カンマ: 1つのテキストベクトル内で全タグが混じる AND: 別々のテキストベクトルとして処理される → 干渉が少ない
- キャラクターと背景を独立して制御したいとき
- 異なるスタイルを融合したいとき
- カンマ区切りでは干渉するタグを分離したいとき
BREAK構文の技術詳細
BREAKは単なる区切りではなく、トークンのチャンク分割を強制します。
【BREAK構文の内部処理】 入力: "1girl, blue eyes BREAK forest, sunset" 通常(BREAKなし): チャンク1: [BOS, 1girl, blue, eyes, forest, sunset, ..., EOS, PAD, PAD, ...] → 77トークンの1つのチャンクに全て詰め込む BREAKあり: チャンク1: [BOS, 1girl, blue, eyes, EOS, PAD, PAD, ..., PAD] ← 75トークン分PAD チャンク2: [BOS, forest, sunset, EOS, PAD, PAD, ..., PAD] ← 75トークン分PAD → 各チャンクが独立した77トークンとして処理される
BREAKは各チャンクを独立したテキストエンコーディングとして処理させます。 チャンク1の「1girl, blue eyes」とチャンク2の「forest, sunset」は Self-Attention内で相互干渉しません。
これにより、「キャラの髪色が背景に漏れる」「背景の色がキャラに影響する」といった タグ間の干渉を防げます。
Composable Diffusion ─ AND構文の数学的背景
AND構文はComposable Diffusionという理論に基づいています。
通常:
ε_θ(z_t, c) ← 1つのテキスト条件 c で1回推論
Composable Diffusion:
ε_θ(z_t, c_1, c_2, ...) = Σ w_i × ε_θ(z_t, c_i)
← 複数のテキスト条件 c_i それぞれで推論し、重み付き和を取る
各条件を独立に処理するため、「赤いドレスの少女」と「青い星空の背景」が 互いのAttention Mapに干渉せず、意図通りの構図が得られやすくなります。
LoRA × プロンプト の関係
LoRAはU-NetのAttention層に小さな重み変更(ΔW)を加えます。 これにより、特定のキャラクターやスタイルを生成できますが、 プロンプトとの関係には注意点があります。
| 注意点 | 説明 |
|---|---|
| トリガーワードの位置 | LoRAのトリガーワードはプロンプト先頭に書くのが効果的。Cross-AttentionのQ×K計算で高いスコアを得るため。 |
| LoRA強度とCFG | LoRA強度を上げすぎると、他のタグが無視されやすくなる。0.6〜0.8が推奨。 |
| 複数LoRAの干渉 | 複数のLoRAが同じAttention層を変更すると、互いに干渉して品質が低下する。 |
| トークン予算の圧迫 | トリガーワードが1〜3トークン消費するため、その分他のプロンプトに使えるトークンが減る。 |
第7章:よくある疑問
A:
そのタグは75トークンを超えた後方のチャンクに位置していた可能性があります。
後方チャンクのタグはAIの注目度が低く、画像への影響がほとんどないことがあります。
そのため、削除しても結果に違いが出にくかったのかもしれません。
重要なタグは先頭の75トークン以内に配置してみてください。
A: いいえ。重要なタグを厳選して75トークン以内に収める方が効果的です。
不要なタグはノイズになります。
A: ツール側で日本語→英語の翻訳を行った後、英語テキストをCLIPに渡しています。
CLIP自体は日本語を理解できません。
A: はい。ポジティブプロンプトと同じ上限が適用されます。重要なものを前方に配置しましょう。
A:
BREAKはテキストエンコーディング段階でチャンクを分割(Self-Attention内の干渉を防ぐ)。
ANDはU-Netの推論自体を複数回行って結果を合成。
ANDの方がより強力な分離効果がありますが、生成速度は遅くなります。
まとめ:プロンプトの黄金ルール
- 重要なタグほど前に書く
─ 位置エンコーディングとAttentionの仕組み上、前方が有利 - 75トークン以内に収める
─ 上限超えは影響力が大幅に弱まる - 同義語の重複を避ける
─ トークンの無駄。重み付けで代替 - 矛盾するタグを入れない
─ Cross-Attentionが混乱する - 構図タグは前方に
─ 画像全体のレイアウトに影響 - 品質タグは最小限に
─masterpiece, best qualityの2つで十分 - ネガティブも整理する
─ 重要な除外要素を前方に
- "Learning Transferable Visual Models From Natural Language Supervision" (Radford et al., 2021) - CLIP論文
- "High-Resolution Image Synthesis with Latent Diffusion Models" (Rombach et al., 2022) - Stable Diffusion論文
- "SDXL: Improving Latent Diffusion Models for High-Resolution Image Synthesis" (Podell et al., 2023)
- "Composable Diffusion" (Liu et al., 2022)
- SD 1.5 vs SDXL 徹底比較ガイド ─ モデルの違いをさらに深く理解
- おすすめチェックポイント紹介 ─ 厳選モデルの得意・苦手まとめ