
【2026年7月版】
【第2回】画像生成は「ノイズ」か「トークン」を当てる ― TXT2IMGの教師データとキャプション
公開日: 2026/07/09
読了時間: 約 15分
画像生成は「テキスト→画像」のモデル
前回のLLMは「テキストを入れるとテキストが返る」モデル、つまりTXT2TXTでした。今回の主役である画像生成は、テキスト(プロンプト)を入れると画像が返るモデルです。入力がテキスト、出力が画像なので「TXT2IMG(text-to-image)」と呼ばれます。Stable Diffusion、DALL·E、Midjourneyなどが代表例で、「夕暮れのビルの前に赤いスポーツカー」と打つと、その情景の画像を描き出します。
同じ「生成AI」でも、出力が文字から画像へ変わると、学習のさせ方はがらりと変わります。この回では、まず教師データの「ペアをどう用意するか」、次に「そのペアで何を学ばせるか」を順に見ていきます。
LLMとの違いは「ペアの揃えにくさ」
教師あり学習では、入力と正解のペアが必要です。これはLLMも画像生成も同じで、LLMも入力(直前までのトークン列)に対する正解(次のトークン)を持って学んでいます。
違うのは、その正解の集めやすさです。LLMは、正解を同じ1本のテキストの中から取り出せました。文章をトークン化して1つずらすだけで、入力も正解も同じ素材からそろい、正解を別に用意する手間がありません。
画像生成(TXT2IMG)では、入力にあたるテキスト(プロンプト/caption)と、正解にあたる画像とで、そもそもデータ形式が違います。テキストと画像では、片方をずらして他方を作ることはできません。だから「画像」と「その画像を説明するテキスト」のペアを、あらかじめ用意する必要があります。
画像: cat.jpg
説明: a cat sitting on a tableそして世の中の画像の多くは、きれいな説明文を伴っていません。この「データ形式の違うペアを、大量に、中身が合った状態で揃える」ことが、初期の画像生成では大きな難所でした。以下では「ペアをどう用意するか」と「そのペアで何を学ぶか」を分けて見ていきます。
captionはどこから来るのか
画像に説明文を付ける方法は、大きく3パターンあります。
- もともとcaptionがあるデータを使う。キャプション付きデータセットや、商品画像+商品説明のように、最初から対応が取れているもの。
- 周辺テキストから推定する。Web画像なら、alt属性や前後の文章がヒントになります。
<img src="cat.jpg" alt="a sleeping cat">
<p>This is my cat sleeping near the window.</p>ここから a cat sleeping near the window のような説明を取り出します。
- 画像キャプションモデルで自動生成する。BLIP、Florence、Qwen-VL、Geminiのようなモデルに画像を渡し、説明文を作らせます。
from transformers import pipeline
captioner = pipeline("image-to-text", model="Salesforce/blip-image-captioning-base")
caption = captioner("cat.jpg")[0]["generated_text"]
# → "a cat sitting on a table"近年は3番目、つまりAIにキャプションを作らせる割合が急増しています。第1回で触れた「AIが教師データを作る」流れが、画像でもはっきり現れています。
汚いペアをふるい落とす ― 品質フィルタ
Webから集めた画像とキャプションのペアは、そのままでは使えません。壊れた画像、意味のないalt text、低解像度、重複、ウォーターマークだらけ——ノイズの塊です。そこで、最低限のフィルタをかけます。
from PIL import Image
def is_valid_caption(caption: str) -> bool:
if len(caption) < 5 or len(caption) > 300:
return False
if caption.lower() in ["image", "photo", "img", "untitled"]:
return False
return True
def is_valid_image(path: str) -> bool:
try:
w, h = Image.open(path).size
return w >= 256 and h >= 256
except Exception:
return False本格的には、さらに重複除去、NSFW除去、OCRで文字だらけの画像を除外、美的品質スコアでのフィルタ、著作権・商標ポリシーのチェックなどが積み重なります。
そして重要なのが、「画像とキャプションが本当に合っているか」をAIで採点する工程です。ここで登場するのがCLIPです。
# CLIPで画像とテキストの一致度を測る(概念)
score = clip_similarity(image, caption)
if score >= 0.30:
keep(image, caption) # 一致度が高い → 採用
else:
discard(image, caption) # 一致度が低い → 破棄一致率0.93なら採用、0.22なら破棄、というように、AIが教師データを選別しているわけです。集める→洗う→AIで採点する、という多段のパイプラインを通って、ようやく学習に使えるペアが残ります。
作り方は一つではない ― 画像生成の三系統
画像を生成する仕組みは、一つではありません。歴史的に主要なものは次の三系統です。
- GAN(敵対的生成ネットワーク):画像を作る「生成器」と、本物か偽物かを見破る「判別器」を競わせて鍛える方式。2015〜2020年ごろの主役で、StyleGANなどが有名です。学習が不安定で、テキストからの自在な生成には向きにくいという弱点がありました。
- 自己回帰(トークン)型:画像を「画像トークン」の列に変換し、LLMのように次のトークンを順番に予測する方式。初代DALL·EやPartiが代表例です(後半で詳しく触れます)。
- 拡散モデル(+フローマッチング):ノイズから画像を復元する手順を学ぶ方式。Stable Diffusion、Imagen、DALL·E 3などが該当し、現在のテキスト→画像の主流です。SD3やFluxが使うフローマッチングも、この系統の発展形です。
この三系統は排他的な分類ではありません。トークンを並列に埋めていくマスク型(Muse など)のように収まりきらない方式もありますし、自己回帰と拡散を段階的に組み合わせたモデルもあります。実際の製品は、複数方式の合わせ技であることも多いのが実情です。
そのうえで、いまいちばん広く使われているのは拡散モデルなので、まずはこれを詳しく見ていきます。そのあとで、LLMに近い自己回帰型にも触れます。
主流の拡散モデルは何を「正解」に学ぶのか ― ノイズ除去
ここからは主流の拡散モデルを見ていきます。おもしろいのは、拡散型のTXT2IMGが画像そのものを正解にするのではないという点です。
拡散モデル(Stable Diffusion系)の基本は、こうです。
- 元画像に、ランダムなノイズを混ぜる。
- どれくらい混ぜたか(timestep)と、キャプションをモデルに渡す。
- モデルに「さっき混ぜたノイズ」を当てさせる。
かなり単純化すると、次のイメージです。
import torch
image_latent = torch.randn(1, 4, 64, 64) # 画像を圧縮した表現(latent)
noise = torch.randn_like(image_latent) # これから混ぜるノイズ
t = torch.randint(0, 1000, (1,)) # ノイズの強さ(時刻)
noisy_latent = image_latent + 0.1 * noise # ノイズを混ぜた画像モデルに渡すのは「ノイズ付き画像・時刻・テキスト埋め込み」、正解は「実際に混ぜたノイズ」です。
predicted_noise = model(
noisy_latent,
timestep=t,
text_embedding=text_embedding,
)
loss = ((predicted_noise - noise) ** 2).mean()つまり教師データは、こうまとめられます。
入力:
- ノイズを混ぜた画像
- ノイズの強さ(timestep)
- テキスト説明
正解:
- 混ぜたノイズ「加えたノイズを正しく当てられる」ということは、裏を返せば「ノイズを取り除いて元画像を復元できる」ということです。だから学習後は、完全なノイズから出発してノイズを少しずつ取り除いていけば、テキストに沿った画像が生成できます。画像を直接描くのではなく、ノイズ除去の手順を学ぶ——これが拡散モデルの核心です。
最小の学習ループ
VAEで画像をlatentに圧縮し、テキストエンコーダで埋め込みを作り、U-Netでノイズを予測する。ざっくり書くと次のようになります。
import torch
import torch.nn.functional as F
def train_step(unet, vae, text_encoder, batch, optimizer):
images, captions = batch["image"], batch["caption"]
with torch.no_grad():
latents = vae.encode(images).latent_dist.sample()
text_emb = text_encoder(captions)
noise = torch.randn_like(latents)
timesteps = torch.randint(0, 1000, (latents.size(0),), device=latents.device)
noisy_latents = add_noise(latents, noise, timesteps)
pred_noise = unet(
noisy_latents,
timesteps,
encoder_hidden_states=text_emb,
).sample
loss = F.mse_loss(pred_noise, noise)
optimizer.zero_grad()
loss.backward()
optimizer.step()
return loss.item()全体像を図にすると、こうです。
caption ─▶ Text Encoder ─▶ text embedding ┐
├▶ U-Net ─▶ predicted noise
image ─▶ VAE Encoder ─▶ latent ─▶ +noise ──┘ │
▼
predicted noise vs actual noise → lossもう一つの流れ ― 画像を「トークン」にしてLLMのように作る
拡散モデルが主流とはいえ、これと対照的な方式も存在感を増しています。冒頭で挙げた自己回帰(トークン)型です。
考え方はシンプルです。画像を、VQ-VAEやVQGANといった仕組みで離散的な「画像トークン」の列に変換します。音声をEncodecでトークン化するのと同じ発想です。
image_tokens = vqgan.encode(image)
# 例: [913, 22, 480, 17, ...]あとはLLMとまったく同じです。テキストを条件に、画像トークンを1つずつ「次トークン予測」で当てます。
text_ids = tokenizer(caption)
target = vqgan.encode(image)
logits = model(text_ids) # テキストから画像トークンを予測
loss = F.cross_entropy(
logits.reshape(-1, vocab_size),
target.reshape(-1),
)正解は「加えたノイズ」ではなく「次の画像トークン」。つまりこの方式では、画像生成が文字どおりLLMと同じ形になります。初代DALL·EやPartiがこの路線で、最近は文章も画像も一つのモデルで扱うマルチモーダルモデルとして再び注目されています。
整理すると、画像生成の「正解」の作り方には、大きくノイズを当てる拡散型と次トークンを当てる自己回帰型の二つがある、ということです。
LLMと並べると構造が見える
第1回のLLMと並べると、教師データの作り方の違いがくっきりします。
| モデル | 入力 | 正解 |
|---|---|---|
| LLM | テキスト | 次トークン |
| TXT2IMG(拡散型) | テキスト+ノイズ付き画像 | 加えたノイズ |
| TXT2IMG(自己回帰型) | テキスト | 次の画像トークン |
LLMも入力と正解のペアで学ぶ点は同じですが、その両方を1本のテキストから自動で取り出せました。TXT2IMGは方式を問わず、データ形式の違う「画像」と「その説明文」というペアを、集めて・洗って・AIで採点して用意する必要がある。ここが両者の最大の違いです。
一方で共通点もはっきりしています。どちらも人間が全件ラベルを付けているわけではなく、既存データから自動的に学習問題を作っているという点です。LLMは「ずらす」ことで正解を取り出し、画像は拡散型なら「ノイズを混ぜる」ことで、自己回帰型なら「トークン化して次を当てる」ことで、やはり機械的に正解を取り出しています。とくに自己回帰型は、画像生成がLLMと同じ土俵に乗ることを示していて、この「各分野が同じ形へ収束していく」流れは次回の音声でもはっきり見えてきます。
まとめ
- 画像生成の作り方は一つではない。GAN、自己回帰(トークン)型、拡散モデルと系統があり、いまのテキスト→画像の主流は拡散モデル。
- どの方式でも教師データは「画像+キャプション」のペア。captionは既存データ・周辺テキスト・AIによる自動生成から集め、汚いので解像度・重複・ポリシーでフィルタし、CLIPで「画像とテキストの一致度」を採点して選別する。
- 正解は画像を直接ピクセルで当てるのではなく、拡散型なら「加えたノイズ」、自己回帰型なら「次の画像トークン」。後者は画像生成がLLMと同じ形になることを示している。
次回は、テキストと並んで身近な「音声」を扱います。TTSやSpeech2Speechの教師データが、実は最近LLMの形式にどんどん近づいているという話です。