tags : AI, Python

Pythonで学ぶ画像生成

https://github.com/py-img-gen/python-image-generation

本書の前提

序章

第1章 画像生成とは?

第1節 画像生成の概要

第2節 テキストからの画像生成

第3節 画像生成技術の進歩による弊害

コラム:すべてを救うPythonの型ヒント

第2章 深層学習の基礎知識

第1節 深層学習の概要

  • 教師あり学習 (Supervised Learning)

    • 機械学習の3分類: 教師あり学習、教師なし学習、強化学習
    • 教師あり学習 = 人間が事前に正解ラベルをつけたデータで学習する方法
    • 「教師」とは正解ラベルのこと。学習中に人間が判定するわけではない
    • 分類問題 (Classification) と回帰問題 (Regression) に分かれる
  • パーセプトロン

    入力を受け取って「こっち」か「あっち」かを判定する、最もシンプルなモデル。 ニューラルネットワークの基礎。

    • 特徴ベクトル x = [x₁, x₂]ᵀ

      • x₁, x₂ はそれぞれ ただの数値1つ (スカラー)
        • 例: x₁ = 0.7(体の丸さ), x₂ = 0.3(毛の長さ)
      • それらを束ねたものが特徴ベクトル
      • ᵀ(転置)は「横に書いてるけど本当は縦ベクトルですよ」の印
      • 添え字番号 (x₁, x₂, …) を使う理由: 特徴が何百個になっても x, y, z… ではアルファベットが足りないから
      • 高校数学の (x, y) と x₁, x₂ は同じもの
    • 記法メモ

      • f(x; w, b) のセミコロン

        • セミコロンの左: 入力(画像ごとに毎回変わる)
        • セミコロンの右: パラメータ(学習で決まる設定値)
        • 全部カンマだと同じ立場に見えるため、役割の違いを区切っている
        • 高校数学には出てこない。大学の統計学・機械学習で一般的な表記
      • x ∈ ℝᴰ の意味

        • ∈ は「〜に属する」
        • ℝ は実数 (real number)
        • ℝᴰ は「実数が D 個並んだもの」= D 次元ベクトルの世界
        • つまり「x は実数 D 個の組ですよ」という型宣言のようなもの
        • 特徴1つ = 1次元。特徴が D 個あれば D 次元ベクトル
    • パーセプトロンの計算 [式2.1〜2.3]

      計算の中身はシンプル:

      x₁ × w₁ + x₂ × w₂ + b
       
      具体例:
      0.7 × 0.5 + 0.3 × (-0.4) + 0.1 = 0.33
      • w(重み): 各特徴をどれくらい重視するか
      • b(バイアス): 全体の調整値
      • 結果 > 0 → 犬 (ŷ = 1)、結果 ≤ 0 → 猫 (ŷ = 0)

      式[2.1], [2.2], wᵀx + b はすべて同じ計算の表記違い。

    • 決定境界 (Decision Boundary)

      • D 次元空間に引かれる境界
        • 2次元 → 直線
        • 3次元 → 平面
        • 4次元以上 → 超平面 (hyperplane)
      • 数式は次元がいくつでも wᵀx + b = 0 で同じ
      • 人間には4次元以上を図示できないが、計算上は何も変わらない
    • 学習の流れ (図2-2)

      人間がやること = 学習前に正解ラベルつきの訓練データを用意するだけ。 パーセプトロンが自動でやること = 以下の(1)〜(4)のループ。

      1. 初期化: 重みとバイアスをランダムな値で設定
      2. 入力と予測: 画像を特徴ベクトルに変換し、計算して犬 or 猫を予測
      3. 正解と比較: 予測を正解ラベルと比較 → 間違いの度合いが損失 (Loss)
      4. パラメータ更新: 誤差を逆伝播して重みとバイアスを少し修正

      これを大量のデータで繰り返すと、徐々に正しく分類できるようになる。

      比喩: 人間は「問題集と答え」を作る人、パーセプトロンは問題集で自習する生徒。

    • パーセプトロンの限界(2つ)

      1. 特徴ベクトルを人間が設計しないといけない

        • 何を特徴にするかの選択は自明でない
        • この試行錯誤 = 特徴量エンジニアリング (Feature Engineering)
        • → 深層学習が特徴抽出の自動化で解決
      2. 直線でしか分けられない(線形分離のみ)

        • 線形分離可能 (Linearly Separable): 直線で分けられる → 対応可能
        • 線形分離不可能 (Linearly Inseparable): 直線で分けられない → 対応不可
        • → 多層パーセプトロン(非線形モデル)で解決

第2節 深層学習の訓練と評価

第3節 注意機構とTransformerモデル

コラム:dataclassで万物に型を付けよう

第3章 拡散モデルの導入

第1節 生成モデル

第2節 DDPM(ノイズ除去拡散確率モデル)

第3節 スコアベース生成モデル

第4節 拡散モデルの生成品質の向上

コラム:Pythonのコードを美しく保つには

第4章 潜在拡散モデルとStable Diffusion

第1節 LDM(潜在拡散モデル)

第2節 CLIP

第3節 Stable Diffusionを構成する要素

第4節 Stable Diffusion v1

第5節 Stable Diffusion v2

第6節 Stable Diffusion XL

第7節 Stable Diffusion v3

コラム:深層学習を用いた実験を再現可能にするために気をつけること

第5章 拡散モデルによる画像生成技術の応用

第1節 パーソナライズされた画像生成

第2節 制御可能な画像生成

第3節 拡散モデルによる画像編集

第4節 画像生成モデルの学習および推論の効率化

第5節 学習済み拡散モデルの効果的な拡張

第6節 生成画像の倫理・公平性

コラム:diffusersのコードを拡張する

第6章 画像生成の今後

第1節 拡散モデルの発展に伴う議論

第2節 拡散モデルによる画像生成の倫理

第3節 画像生成にとどまらない拡散モデルの進化と今後

コラム:Hugging Faceのエコシステムを使い倒す