こんにちは。かくびーと申します。普段は、タンパク質やオミクスデータに関する解析とゲームで遊んでいる修士の学生をしています。
Stable Diffusionをしっかりと学ぶ
昨年、Stable Diffusion と呼ばれる画像生成AIが流行り、今や"AI絵師"と呼ばれる人々が新たに定義され、画家と揉め日々Twitter世間を騒がせるほど大きな影響を与えるものとなりました。
かくいう自分も去年の11月ごろに興味を持ち始めたのですが、普通の人とずれて、その「原理」の方に興味を持ちました。
そういえば、もし今度越境する知性会議あれば"Stable Diffusion を基礎から理解してみた"やってみたいな
— かくびー (@cakkby2) November 12, 2022
そうして、論文や参考資料を漁りながら、自分なりに理解した内容をブログに書き始めました。
この記事は、ブログへのリンクを列挙しつつ、どんな風に理解していったのか改めてまとめたものです。
そうです。露骨なアクセス稼ぎです(ただしはてなブログからお金はもらっていない)。
既に Stable Diffusion 単体を解説しようという日本語の良質な記事は、自分が書くのをさぼっている間にも色々と出ているようで、何番煎じかもわかりません。ただ、使われている技術一つ一つの基礎の基礎から、拡張機能といった応用まで一貫して解説したものは、あまりないのではないかと思っています。
Stable Diffusionの原理を学ぶ意義?
もし、Stable Diffusion についての認識を
「なんか適当に言葉を入れたらえっちなおねえさんの絵を簡単に作ってくれる何か」
よりもっと深くしたい、Stable Diffusionを †完全に理解† したいという方は、この記事から更に色々と学びを深められるかもしれません。
また、画家の方にとっても、「敵を詳しく知る」ことで敵を倒す方法を何か思いつくかもしれません。
自分もイラストを趣味で下手なりに描くようになったのですが、なんだかんだ言ってAIが描く絵って結構特徴がはっきりしていて分かりやすい(判別しやすい)気がするんですよね。AIが描く絵と人間が描く絵の何が違うのか、そういった違いはどこから来ているのか、AIに学ばれにくい絵はどんな特徴を持っているのか、ということを、AIのメカニズムの方から探れないかと妄想しています(これも趣味の範疇ではありますが)。
文才がないため、理解の難しいところは多々あると思いますが、学習の機会を提供できれば幸いです。
0. 注意
決して深層学習に関する知識が何もない方向けの記事群ではないことに注意してください。
例えば、以下は既知として仮定しているため、もし分からない場合は基礎を学んでいただいてから読み進めてもらえるとスムーズになると思います。
- 機械学習の基本となる数学と式変形(ベクトル・確率・統計など)
- ニューラルネットワークとは何か(活性化関数など)
- ニューラルネットワークの学習方法(誤差逆伝播法・確率的勾配降下法とは何か)
- CNN など画像系AIの基本
- KLダイバージェンス
- (齧った程度の)解析力学・統計力学・振動波動など物理学の知識(非常に望ましい)
また、後半になってくると数式の式変形(≠数学)のレベルが高くなってくるため、それでもじっくり眺めて理解しようという心意気も必要になってくるかもしれません。
もちろん、分からない場合は知らせてもらえれば適宜修正などしようと思います。また、このシリーズはまだ書き途中なので、更新し次第追加していこうと思います。
2023/7/10 本記事公開
1. AlexNet
この回では、勾配消失問題とReLU、汎化性能を上げるためのDropout,Augmentation,Normalizationに関して触れています。後半はそこまで今後必要な知識でもないので、軽く読み飛ばすので問題ないとは思います。
2. U-Net
この回では、Stable Diffusionの根幹を担うネットワークアーキテクチャであるU-Netについて扱っています。U-NetのもととなるFCNを紹介し、U-Netの根本となる 転置畳み込み(Deconvolution) と スキップ接続(Residual connection)を説明しています。
3. Transformer
この回では、自然言語処理において非常に重要であり、Stable Diffusionの条件付けに活用されるTransformer、およびその根幹となるAttention機構について解説しています。一般的な解説と異なり、生物情報科学の観点からくる独自なお気持ち(?)に基づく説明をしているのが、少し特徴的かもしれません。
4. ViT, CLIP
この回では、Stable Diffusionの条件付けに利用されるCLIPの説明、およびその源流としてVisionTransformerの説明を行っています。Contrastive Learningなど、独自の概念を上手く説明できるよう頑張りました。
また、Stable Diffusionにてどのように使われるか、という観点で、実際のコードやCLIP Interrogater(BLIP)などの技術にも触れました。
5. スコアベースモデル(NCSN)
この回では、Stable Diffusionの画像生成の原理である拡散モデルに迫るため、スコアベースモデルであるNCSNについて解説しました。ランジュバン・モンテカルロ法、およびスコアのデノイジングによる学習について、ヒストグラム・カーネル密度推定という枠組みから説明してみました。
この回から、内容がどんどん難しくなっていく気がするので、もうすこし簡潔で分かりやすい説明が出来ると良いなと思っています。
6. 潜在変数モデル(VAE)
この回では、今後のモデル構築における重要な基礎として、潜在変数モデルとその変分推論について扱い、Stable Diffusionにも利用されているVAEの説明を行いました。ベイズ的なモデルを知らない人に納得してもらうのはなかなか難しそうなので、適宜他の方の記事を参照してもらえると分かりやすくなる気はします。
7. 拡散モデル(DDPM)
この回では、拡散モデルの基礎となるDDPMの解説をしています。潜在変数モデルとしての拡散過程・逆拡散過程のモデル化と変分推論、およびNCSNとの等価性まで説明しています。また、ここで非平衡統計力学について軽く紹介してありますが、サンプラーのところでより細かな理論に触れていくことになります。
8. StableDiffusion①(LDM, text2image)
この回では、Stable Diffusion自体の解説を始めています。元論文となるLDMの発想の要(レート歪み理論)を紹介するとともに、文章などの条件付け画像生成の仕組みを説明しています。また、Stable Diffusionの実行環境で良く用いられるCFGスケールやNegative Promptといった機能についても解説を行いました。
9. StableDiffusion②(image2image, サンプラー)
この回では、image2imageの軽い解説と、各種サンプラーの背後にある理論とそれらの仕組みについて説明しました。UniPCの解説を行った日本語の記事は珍しいのではないかと思っています。
Fokker-Planck方程式など高度な物理・数学の理論が登場するため、読み進めるのは難しいとは思いますが、もし難しい点などを指摘していただければ記事を修正していきたいと思っています。
10. 拡張機能①(追加学習)
各種fine-tuning手法の解説記事を追加予定です。
11. 拡張機能②(条件の拡張)
ControlNetをはじめとした複雑な条件付け、およびその他有名な拡張機能・画像生成に関する話題について説明する記事を追加予定です。
おわりに
Stable Diffusion自体の解説は非常に難しくなりやすかったですが、そこまでの道のりを何とか記事に収めることが出来ました。自分自身も、タンパク質の立体構造生成など拡散モデルが活かせる対象はたくさんあると思っているため、手に入れた知識を他の形で還元出来ていけばよいなと思っています。