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(画質改善機構)を追加
    • より高品質な画像生成が可能に

Chapter2 環境構築をしてはじめよう

Chapter3 プロンプトから画像を生成してみよう

Chapter4 画像を使って画像を生成してみよう

Chapter5 ControlNetを使ってみよう

Chapter6 LoRAを作って使ってみよう

Chapter7 画像生成AIをもっと活用しよう