tags : AI
画像生成AI Stable Diffusion スタートガイド
https://github.com/aicuai/Book-StartGuideSDXL/blob/main/AICU_A1111_StartGuide.ipynb
Chapter1 画像生成AIについて知ろう
1-1 AI で画像を生成してみよう
1-2 画像生成AI の誕生と変遷
1-3 2024 年での「AI の定義」を考えてみよう
1-4 ニューラルネットワークについて知っておこう
-
ニューラルネットワークとは
-
重みとバイアスの違い
ニューラルネットワークの学習で調整される2つのパラメータ。
重み(weight) : 入力に 掛け算 される値。入力の「重要度」を決める。
バイアス(bias) : 入力に関係なく 足し算 される値。出力が「そもそも出やすいかどうか」を決める。
出力 = (入力1 × 重み1) + (入力2 × 重み2) + ... + バイアス
-
具体例:画像(手書き数字の認識)
「3」という手書き数字を判定するとき:
要素 役割 入力 各ピクセルの明るさ(0〜255) 重み 「このピクセルが明るいと3っぽい」という重要度 バイアス このニューロンが「3」と判定しやすいかどうか - バイアスが大きい → ちょっとでも3に似ていれば「3だ!」と反応
- バイアスが小さい → かなり3に似ていないと「3だ」と言わない
-
具体例:言語(次の単語を予測)
「今日 の 天気 は」の次の単語を予測するとき:
要素 役割 入力 「今日」「の」「天気」「は」という単語の情報 重み 「天気」が来たら「晴れ」を予測しやすくする等 バイアス 「晴れ」という単語がそもそも出やすいかどうか - バイアスが大きい → 文脈に関係なく「晴れ」が出やすい(頻出単語向け)
- バイアスが小さい → 文脈がしっかり揃わないと「晴れ」と出力しない
-
-
バックプロパゲーション(逆伝播法)による学習
ニューラルネットワークが「答え合わせをして、間違いを修正する」ための方法。重みとバイアスを正しい値に調整するため、「どのパラメータをどう変えれば正解に近づくか」を効率的に計算する。
-
4つのプロセス
-
(1) 前向き伝播(Forward Propagation)
ネットワークに入力を与えて、順番に計算を進め、出力(予測値)を得る。最初は重みとバイアスがランダムなので、デタラメな答えが出る。
-
(2) 誤差の計算
出力(予測値)と正解(ターゲット)を比較して、「どれくらい間違っているか」を計算する。この差を「誤差」と呼び、「損失関数(loss function)」で数値化する。
-
(3) 逆伝播(Back Propagation)
計算された誤差を、出力層から入力層に向かって 逆方向に 伝えていく。各層の重みに対して「どれだけ間違いに貢献したか」という「責任」を計算し、「どの重みをどう調整すれば誤差が減るか」を求める。
-
(4) 重みの更新
誤差が最小になるように、重みとバイアスを更新する。「勾配降下法」という最適化手法が使われる。
新しい重み = 古い重み − 学習率 × 修正量- 学習率が大きすぎる → 学習が不安定になる
- 学習率が小さすぎる → 学習に時間がかかる
-
-
具体例:手書き数字「3」を認識する
-
(1) 前向き伝播
手書きの「3」の画像を入力。最初は重みがランダムなので間違った結果になる。
ネットワークの出力: 「3」→ 12% 「7」→ 45% ← 最も高い(間違い) 「8」→ 20%
-
(2) 誤差の計算
正解は「3」なので、理想の出力との差を計算する。
「3」の誤差:100% − 12% = 88%足りない 「7」の誤差:0% − 45% = 45%多すぎる
-
(3) 逆伝播
「なぜ7が高くなったのか?」を逆向きにたどる。
- 「画像の右上が明るいと7と判定する」重みが大きすぎた
- 「3」のニューロンのバイアスが小さすぎて反応しにくかった
などの原因が数学的に計算される。
-
(4) 重みの更新
原因に応じて調整する。
「右上→7」の重み:0.8 → 0.6(下げる) 「3」のバイアス:-1.0 → -0.7(上げて反応しやすく) 「曲線→3」の重み:0.3 → 0.5(上げる)
-
繰り返した結果
何万枚もの画像で繰り返すと、正しく認識できるようになる。
「3」の画像を入力すると: 「3」→ 97% 「7」→ 1% 「8」→ 1%
-
-
-
ニューラルネットワークの多層構造
ニューラルネットワークは役割によって3つの層に分けられる。
-
入力層(Input Layer)
データを受け取る入口。画像認識の場合、画像のピクセル値がここに入る。
-
隠れ層(Hidden Layers)
実際に計算や特徴の抽出を行う部分。1つ以上存在する。この隠れ層が多くなる(深くなる)と「ディープラーニング」と呼ばれ、より複雑な特徴やパターンの学習が可能になる。
-
出力層(Output Layer)
最終的な結果や予測を出力する。手書き文字認識なら「あ」「い」「う」など、画像分類なら「犬」「猫」などを出力。
-
-
畳み込みニューラルネットワーク(CNN)
画像認識に特化したニューラルネットワークの構造。
-
全体の流れ
入力層 → 畳み込み層 → プーリング層 → (繰り返し) → 全結合層 → 出力層
-
畳み込み層
画像から「特徴」を抽出する層。
小さなフィルタ(カーネル)を画像の上でスライドさせながら、縦線・横線・エッジなどの特徴を検出する。フィルタを画像全体に適用すると「特徴マップ」が生成される。これは「どこにどんな特徴があるか」を表す地図のようなもの。
-
プーリング層
特徴マップを縮小する層。
特徴マップを小さな領域に分割し、各領域から代表値を選ぶ。
最大プーリング : 領域内の最大値を選ぶ
平均プーリング : 領域内の平均値を選ぶ
縮小することで:
- 計算量が減る
- 小さな位置変化に強くなる(少しズレても同じと認識できる)
- 本質的な特徴を残し、ノイズを捨てる
-
繰り返しによる抽象化
畳み込みとプーリングを繰り返すと、特徴の抽象度が上がっていく。
最初:「線」「点」「エッジ」(細かい特徴) ↓ 中間:「丸い形」「縦棒」(形の特徴) ↓ 最後:「3の上半分」「3の下半分」(抽象的な特徴)
-
-
全結合層(Fully Connected Layer)
畳み込みとプーリングを繰り返した後、最終的な判定を行う層。
-
「全結合」の意味
すべてのノードが次の層のすべてのノードとつながっている。畳み込み層やプーリング層は局所的な処理だが、全結合層は「抽出された特徴を全部まとめて総合判断する」役割。
-
具体例
入力された特徴: - 上部に丸い曲線がある - 下部にも丸い曲線がある - 縦線がない 全結合層の判定: 「3」との類似度 → 高い 「8」との類似度 → やや高い(丸が2つあるから) 「1」との類似度 → 低い
-
応用
全結合層の出力を別のネットワークに入力することも可能。例えば「画像分類」で「ヒト」と判定した後、「表情分類」ネットワークにつなげて「笑顔」「怒った顔」を判定するなど。
-
1-5 拡散モデルによる画像生成の原理を知っておこう
Stable Diffusion は3つのニューラルネットワークで構成されている。
テキスト(プロンプト)
↓
CLIP(テキストを解析)
↓
UNet(ノイズを除去して画像の特徴を生成)
↓
VAE(特徴データを画像に変換)
↓
PNG画像-
CLIP:言語を解析する
テキストを「潜在空間」のデータに変換する。
- OpenAIが開発した「言語と画像の両方を理解するモデル」
- Stable Diffusionではテキストエンコーダー部分を使用
- 「a photo of a cat」→「猫っぽい画像の特徴」を数値データに変換
- このデータがUNetへの「こういう方向性の画像を作って」という指示になる
-
UNet:生成タスクをこなす
ノイズから画像の特徴データを生成する。拡散モデルの中核。
-
拡散モデルの考え方
学習時 : きれいな画像に少しずつノイズを加えて、最終的に完全なノイズにする
生成時 : その逆。完全なノイズから少しずつノイズを除去して、画像を復元する
-
条件付き生成
CLIP から受け取った「テキストの条件」を使って、指定された方向にノイズを除去していく。UNet 内部の「AttnBlock」で CLIP からの条件が埋め込まれる。
-
-
VAE:画像に変換する
潜在空間のデータを人間が見える画像に変換する。
画像 → エンコーダー → 潜在空間 → デコーダー → 画像Stable Diffusion では VAE のデコーダー部分を使用し、UNet が出力した潜在空間のデータを実際の PNG 画像に変換する。
-
UNetとVAEの違い
-
なぜ潜在空間で処理するのか
512×512の画像をそのまま扱うと計算量が膨大になる。
画像そのまま:512 × 512 × 3(RGB) = 約78万個の数値 潜在空間:64 × 64 × 4 = 約1.6万個の数値(約50分の1)
-
役割の違い
UNet : 潜在空間の中で「どんな特徴を持つデータにするか」を決める(設計図を描く)
VAE : 潜在空間のデータを「人間が見える画像」に展開する(設計図から実物を組み立てる)
UNet だけでは「圧縮されたままの設計図」しかなく、VAE がないと実際の画像として見ることができない。
-
-
Stable Diffusionの発展
2022年8月の公開以降、様々なバージョンが登場。
- SD 1.5 → SD 2.1 → SDXL
SDXL では:
- 2つのテキストエンコーダを使用(より多様なプロンプト理解)
- Refiner(画質改善機構)を追加
- より高品質な画像生成が可能に