見出し画像

お絵描きAIに使われるGANと拡散モデルについて初学者向けに解説してみた(その2 : 応用手法編)

 こんにちは、こんばんは teftef です。今回は Diffusion Model の応用手法について、書いていく記事です。前回の記事では  Diffusion Model とGAN の比較について書きました。お互いが長所と短所を持ち合わせていて、今回の記事では、その復習から導入し、Diffusion Autoencoder という応用手法について書いていこうと思います。おそらく前回の記事を見ていただいた方が理解が早いので、こちらを先に読むことをお勧めします。
それでは行きます。

これまでの流れ

ここまでの 2 記事で大きく2つのことについて書きました。
 まずはオートエンコーダーです。オートエンコーダーは入力画像を潜在空間に Encode して、それをまた入力画像に戻るように Decode します。これによって潜在空間の様子を知ることができます。この潜在空間をいじることで画像を編集することが可能になりました。
 2 つ目にGAN と Diffusion model についてそれぞれの違いを書きました。その中でも特にネットワーク構造の違いの一つとして、特徴ベクトルが GAN は1次元なのに対し、Diffusion Model のVAE は 2 次元であると書きました。

次元について少し補足

 ここからの話で少し混乱するところがあると思うので少し補足です。
この先『潜在空間の次元』と『潜在変数の次元』は異なる解釈をします。
 下の左図を見ていただければわかりやすいのですが、ここでいう1次元というのは列ベクトル(or 行ベクトル)であるという意味です。潜在変数の次元は 1 次元というわけではなく7次元であることにご注意ください。
 右図では 2 次元ですが潜在変数の次元は 5 × 5 = 25 次元となります。 

次元の例

1次元の潜在空間

 オートエンコーダーにおいて、潜在空間が 1 次元の場合では年齢や髪の色などといった属性が保管されますが、出力画像にブラーがかかってしまいます。なぜなら1次元の特徴量では画像のすべての情報を補完するのには小さすぎるからです。直感的に考えてみましょう。今から下の画像を言葉のみで説明してみてください。

『白い髪、猫耳、巫女さんの服、赤いリボン、空に浮かぶ多数のランタン、星空、手を合わせている。肩だし…』 それではこの情報を上の画像を見たことなないイラストレーター様に依頼してみましょう。同じ画像が描かれると思いますか?おそらく雰囲気は似ているが、まったく同じような画像は得られないでしょう。
 これと同じで潜在空間が1次元の場合、保管される数値は画像の意味論(Semantics)となり、それは画像の属性に対応します。要するに詳細は保存されず、属性という大まかな情報しか保管されないのです。そのため Decoder によって出力された画像は下のようにぼやけた画像になってしまいます。

潜在空間が 1 次元の場合

2 次元の潜在空間

 1次元の潜在空間の問題点は次元が小さすぎるので、画像の詳細情報が保管されないというものでした。それでは潜在空間の次元を2次元に増やしてみましょう。例えば VQ-VAE を見てみましょう。今回は原理を詳しくは説明しませんが、潜在空間を8×8(×D) の 2 次元にします。こうすると保管される情報量が多くなります。画像は隣同士の画素間の情報量が大切といいました。なのでこの潜在空間内でも隣同士の画素間の情報(Local Semantics)が保管されています。しかしこの潜在空間では全体の属性情報(Global Semantics)が失われてしまいます。

潜在空間が 2 次元の場合

組み合わせる

少し整理すると
・潜在空間が 1 次元・・・詳細情報が保管されないが、属性が保管される
・潜在空間が 2 次元・・・詳細情報が保管されやすく、属性(Global Semantics)が保管されない

 これは GAN と Diffusion Modelでもそうでした。GAN は入力次元が 1 次元であり、対して Diffusion Model では 2 次元ノイズでした。この 2 種類を組み合わせて潜在空間の設計をすれば属性も補完しつつ、詳細部分がぼやけないような正確な再構成ができそうです。

Diffusion Autoencoder

そこで今回の Diffusion Autoencoder というものを提案しました。以下のような構造になっています。

Diffusion Autoencoder の構造

Diffusion Autoencoders: Toward a Meaningful and Decodable Representation より借用

特徴量の抽出 

 まず入力画像を Stocastic Encoder に入力し、2次元のノイズベクトルを取り出します。この2次元ノイズベクトル (X_T) は属性情報がなく、その代わり詳細部分の情報が含まれています。
 続いて先ほどと同じ入力画像を Semantic Encoder に入力し 1 次元潜在空間にマッピングします。この潜在ベクトル (Z_sem) は詳細情報がない代わりに属性情報が詰まっています。ちなみに Semantic Encoder は U-net の前半部分を使っているそうです。U-Net に関してはまたどこかの記事で詳しく書くつもりです。 ここまでの処理をまとめると

特徴量の抽出

特徴量の編集

 続いてこの特徴量を編集します。Z_sem を属性変換、属性補間を使って属性を変更することができます。属性変換、属性補間については前々回の記事で軽く説明したので今回は少し掘り下げます。

属性変換

 例えば人間の顔において、属性というのは性別、年齢、肌の色、髪の長さ、表情などがあります。この属性は画像を潜在空間に畳み込んだ時に残ります。しかし我々人が見ても何を意味しているのか分かりません。なぜなら潜在空間は多次元(ここでいう次元は潜在変数の数)であり私たちが理解することが非常に難しくなっています。しかしこの空間内の点を移動させたりすることは可能になっています。したがってこの超球面上で属性を操作することで属性を変換することができます。属性が変わる属性境界を見つけ、その境界に向けて移動させてあげればいいわけです。

属性変換のイメージ

属性補間(Interpolation)

 これは前々回の記事で少し説明しましたが、まず2つの画像を用意します。続いて2つの画像を潜在空間に押し込み、超球面上にマッピングします。そしてその2点間をつないであげれば、2画像の中間の表現が取れるというものです。

Interpolation の例

 2点間の取り方次第で様々な画像を出力することができます。例えばこのようにうまく線形につなげると中間の画像が出てきますが、直線以外でつなぐとこのように別の画像が出てくることがあります。

Interpolation のイメージ

Z_sem の取得

 以上の 2 つの属性編集法を用いて、Z_sem , X_T を取得します。そしてZ_semに限ったことなのですが、DDIMベースの学習済みモデルを用いて
Z_semをサンプリングできるようにしています。今回は詳しくは触れませんが、自分好みの属性情報を Z_sem に追加できたりする機能です。

損失関数

 毎度おなじみ損失関数です。損失関数を小さくしていくことで、モデルを学習させます。

損失関数

 この関数を使ってSemantic Encoder(Z_semを作るEncoder)のパラメーター Φ とパラメーター θ(画像出力をする際のDDIM)を学習させます。

画像生成

以上後半のやっていることをまとめるとこのようになります。

画像生成

結果

画像編集の結果

 まず潜在空間 Z_sem と X_T を使って画像編集することで滑らかに(disentangleな) 編集を行うことができます。実際に結果を見てみます。1,2段目は Style-GAN 2 において Style w をマッピングした Latent 空間 W 及び W+ を動かしたものです。確かに滑らかになっていますが、中間の顔が両端のどちら側にも似ていないという欠点があることは前回の記事で書きました。
 DDIMでは顔が全然滑らかに変化してませんね。比べて Diffusion Autoencoder では変化が滑らかで、また中間の顔が両端の顔と似ていることがわかります。

Interpolation の結果

デノイズ速度

 そして、この手法ではデノイズにかかる Step 数が少ないことがとても魅力的な手法です。実際に例を見てみるとこのようにDDIM に比べて早い段階でデノイズできていることがわかります。

デノイズ速度の比較

論文と参照

論文

参考にした記事、動画

 こちら非常にわかりやすい解説となっています。ぜひご参考ください。

次回予告と宣伝

 今回は Diffusion Model と GAN の長所をいいとこどりし、短所を補い合うようなモデルとして Diffusion Autoencoder の話でした。これはあくまでも一例で、ほかの方法もたくさんありそのうちそれらも紹介しようと思います。次回の記事はおそらくボルツマンマシンについて書くかもしれないです。全然決まってません…、なるべく週1更新を目指していこうと考えています。
 最後まで読んでいただきありがとうございました。最後に少し宣伝です。主のteftefが運営を行っているdiscordサーバーを載せます。このサーバーではMidjourneyやStble Diffusionのプロンプトを共有したり、研究したりしています。ぜひ参加して、お絵描きAIを探ってみてはいかがでしょう。(teftef)

この記事が気に入ったらサポートをしてみませんか?