![見出し画像](https://assets.st-note.com/production/uploads/images/108225297/rectangle_large_type_2_c743c631d3b3c6c124dfe649184738b0.png?width=1200)
【画像生成AIの教科書】 画像生成AIの仕組み ~拡散モデル~
はじめに
最近一層と賑わいを見せている画像生成AIですが、
なぜ文章を入れるだけで、素敵な画像を出してくれるのか気になったことはありませんか!?ありますよね!ありますね!
不思議ですね。
今回は「txt2img」を実現している技術について解説いたします。
今回紹介するのは、Stable Diffusionの仕組みです。
CLIPという技術と拡散モデル(ディフュージョンモデル)という技術です。
拡散モデルは、Midjourney や DALL•E など最近の主力画像生成AIで使われる技術です。
今回はこれらの技術についての論文等をもとに仕組みを解説します。
数式が多くて読むのにかなり時間が掛かるものだったので😭
私なりに噛み砕いて解説します!
大まかな画像生成の流れ
![](https://assets.st-note.com/img/1683823614402-o186PORI7D.png?width=1200)
ざっくり上記の流れで画像が生成されます。
1. 私たちが入力したテキスト(プロンプト)はテキストエンコーダーに送られます。
2. 手キストエンコーダー内で、その文章の特徴を数値で表したベクトルデータに変換されます。
3. そのベクトルデータをヒントにそれを表す画像を生成器で生成します。
テキストエンコーダーの部分で使用される技術が「CLIP」です。
※ ここは「CLIP」でなくても良いですが、
Stable Diffusion ではCLIPが使用されています。
画像生成器の部分で使用されている技術が「ディフュージョン」です。
ちょっと雑すぎるので、それぞれ技術をもう少し詳しく見ていきましょう!
CLIPとは
2021年にOpenAIによって公開された技術です。
上記のざっくり流れの中では、テキスト(自然言語)を特徴を表したベクトルデータに変換するとしましたが、それは「txt2img」のモデル内では
そのように使用されているだけで、
CLIP自体は、画像とテキストの類似度を計算するモデルで、
もう少し広い機能を持つマルチモーダルなモデルです。
stable diffusionではテキストエンコーダーとして、利用されています。
CLIP はどのように学習させているか
事前の教師あり学習のためのデータセットには約4億組もの画像と
それを表すテキストのペアが使用されています。
これには「WebImage Text」という
巨大な自然言語教師データが使われいます。
これは、ネット上にあるファイル名が文章になった画像を使用しています。
猫の画像に対して「猫」と単語だけを対応づけるのではなく、
「ジャンプする白い猫」のように文章を対応づけることで、
表現の自由度が高まります。
「ジャンプする」とはどういう特徴があるのか、
「白い」とはどうゆう特徴があるのか、
「猫」とは、、というように、言葉が持つより細かな特徴で分類できます。
![](https://assets.st-note.com/img/1683829188887-1QuMPTmrcx.png?width=1200)
それぞれの画像とそれを表す文章が対応することを
どのように学習させていくのかですが、
それは下記のように行なっています。
1. 画像をイメージエンコーダー(ResNetなどのCNN)で
画像の意味的な特徴を表す1つのベクトルデータに変化。
2.文章もテキストエンコーダー(Transformer)で
文章の意味的な特徴を表す1つのベクトルデータに変換。
3.それぞれの各特徴を表すベクトル同士の内積で判断。
ベクトルは内積が大きくなるほど類似しているという特性を利用して、
特徴が類似している文章と画像のペアを学習する。
4.これを膨大なデータで行う。
このように膨大な事前学習を行うことで、
画像や文章から適切な特徴を表すベクトルデータを抽出できるようになるのです!
![](https://assets.st-note.com/img/1683827926156-TZhq91xXGy.png?width=1200)
事前学習後に、画像を分類するタスクを行う場合。
「ジャンプする白い猫」の画像と
「ジャンプする白い猫」の文章が対応していることを解かせます。
CLIPは大量のデータで事前学習したことで、このタスクを難なくこなせます。ゼロショット、すなわち追加で学習を行わなくても
事前学習していない未知のデータセットにも対応できます。
我々のプロンプトはCLIPの中でどのようにベクトルに変換されるのか
それでは、実際に画像生成AIを使用するフェーズで、
我々が入力として与えたプロンプトはどのようにエンコードされるのでしょうか?
ざっくり下記の流れです。
1. 入力されたプロンプトのテキストを受け取る
2. テキスト内の空白や改行を徐々
3. 単語ごとに区切ったリストを生成
4. 各単語をその特徴を表すベクトルに変更
5. 最後に文章全体の特徴を表すベクトルに変更して返す
![](https://assets.st-note.com/img/1683912718451-y9GTLaxLOM.png?width=1200)
拡散モデルとは
まず拡散モデルとは、最初にも紹介の通り現在主流のほとんどの画像生成モデルで使われるモデルです。
2020年6月に提案されました。割と最近。
どういったモデルなのかというと、ノイズを付加した画像から元の画像を復元するという課題に取り組むモデルです。
ちなみに、正しくは「ノイズ除去拡散モデル(DDPM)」と言います。
学習フェーズの流れ
![](https://assets.st-note.com/img/1686731928411-1grv7megoe.png?width=1200)
まず、元の画像にノイズを加える関数を何回か適用して、ノイズが乗った画像を生成します。この過程を「前向き過程」と呼びます。ノイズを生成する方法は簡単で、ガウシアン(正規分布)に従うランダムなデータを足し合わせるだけです。
次に、ノイズから元の画像を復元するためのニューラルネットワークを学習します。このネットワークは、現在の画像からノイズ成分を推定し、それを引くことで元の画像を復元する役割を担います。この過程を「逆向き過程」と呼びます。
復元時のノイズ除去にはU-netというモデルが使われています。
U-netは、MRIなどから異常な部分を見つけ出すことなどに使われていてます。拡散モデルの中では、画像内のノイズに当たる部分を炙り出す目的で使われています。
話が少し逸れましたが、最終的に「ノイズを乗せた画像から元の画像を復元する」という問題を解くことになります。
もっと簡単に流れを言えば、画像に徐々にノイズを掛けていき、どのようにノイズ除去をしていけば、元の画像を復元できるかを求めていきます。
利用フェーズの流れ
![](https://assets.st-note.com/img/1686733397415-mxN57H4SDG.png?width=1200)
それでは、実際にstable diffusion を利用して画像生成する際には
どのような流れなのかを見ていきます。
まず、学習フェーズであったノイズを徐々に付与していた「前向き過程」は使用しません。そもそも今から画像を生成するので、元となる画像がないです。そのため、最初はランダムなノイズだけの画像からノイズ除去が始まります。ここがランダムなので、同じプロンプトでも毎回別の画像が出力されるわけです。よく聞くseed値の指定はここの乱数を固定するための値というわけです。
そしてテキストエンコーダーから渡された特徴データをもとにノイズを除去していきます。学習フェーズでバッチリ、特徴データをもとにノイズ除去することはできるようになっているので、所望の画像を生成できるというわけです。素晴らしい!
最後に
最後まで読んで頂きありがとうございました!
この記事がためになりましたら
「スキ」をいただけますと発信の励みになります👍
他にも画像生成AIに関する情報を網羅的に発信しています!
ご興味のある方はフォローお願いします🤲
また、私はAI情報発信者のノーベル氏の無料LINEオープンチャットに所属しております。AIの初学者から有識者まで幅広く参加している楽しいコミュニティです!ご興味のある方は下記URLから!
参考文献
CLIP: Connecting Text and Images (2023/05/02)
著者:Robin Rombach, Andreas Blattmann, Dominik Lorenz, Patrick Esser, Björn Ommer
「High-Resolution Image Synthesis with Latent Diffusion Models」
著者:Olaf Ronneberger, Philipp Fischer, Thomas Brox
「U-Net: Convolutional Networks for Biomedical Image Segmentation」
この記事が気に入ったらサポートをしてみませんか?