はじめに
数時間という短い時間で、生成AIに質問しながら拡散モデル(Diffusion Model)を一から実装してみました。RTX3090を使ってMNISTデータセットを生成できるようになるまでの試行錯誤を記録します。
実装環境
- GPU: NVIDIA RTX 3090
- フレームワーク: PyTorch → diffusers
- データセット: MNIST(手書き数字)
スクラッチ実装の挑戦
生成AIに質問しながら、拡散モデルの基本構造を一から実装していきました。拡散モデルは画像にノイズを徐々に加え、そのノイズを除去する過程を学習するという興味深い仕組みです。
最初の実装では期待通りの結果は得られず、数字の形がはっきりしない曖昧な画像しか生成できませんでした。これは拡散モデルあるあるですね。
パラメータ調整の旅
生成結果を改善するため、AIのアドバイスを受けながら様々なパラメータを調整していきました:
- 初期段階: 基本的なパラメータ調整だけでは不十分で、ぼんやりとした数字しか生成できず
- 中間改善: ネットワーク構造の調整や拡散ステップ数の変更で、数字の形が認識できるようになってきました
- 調整しすぎ: ある時点で調整しすぎたせいか、むしろノイズが増えて品質が低下。数字はいい感じに見えます。
- 最適化: ますます悪く。
この過程で、拡散モデルの各パラメータがどのように生成結果に影響するかを実感できました。調整って難しいんですね。
diffusersライブラリでの実装
PyTorchでのスクラッチ実装に一区切りついたところで、HuggingFaceの「diffusers」ライブラリを使って同じタスクに挑戦。このライブラリは拡散モデルの実装に必要な要素が揃っており、より効率的に実装することができました。
両方の実装を比較すると、diffusersを使った方が少ない調整で良い結果が得られました。
CIFAR-10でのDiffusersトライアル
次に、拡散モデルライブラリ Diffusers を使って、カラー画像データセット CIFAR-10 の生成に挑戦してみました。
CIFAR-10 は 32×32 ピクセル・RGB の小さな画像で、10種類のクラス(飛行機、自動車、鳥、猫、鹿、犬、カエル、馬、船、トラック)が均等に含まれています。画像サイズが小さいため、試行やモデル調整を素早く行えるのが特徴です。
学習は比較的軽量な UNet ベースの DDPM モデルを利用し、Diffusers の API を活用しました。これにより、データローダやトレーニングループの多くを自前で書かずに済み、短時間で実験環境を整えることができました。
初期結果では、なんとなくぼんやりって感じですね。
CIFAR-10 は MNIST よりも情報量が多く、生成モデルの性能やハイパーパラメータの影響が分かりやすく表れるため、Diffusers の実験にちょうど良い題材でした。
まとめ
生成AIの助けを借りながら拡散モデルを実装し、MNISTデータの生成に(多少)成功した今回の取り組みから多くを学びました:
次回は他のデータセットや、より複雑な画像生成にも挑戦してみたいと思います。生成AIとの対話が学習プロセスを大幅に加速させてくれることを実感した貴重な経験でした。