以前、Stable DiffusionのCLIPの説明について書いたところ、
結構見てくれる人が多かったので、
今回は、もう一つの重要技術 Diffusion Model(拡散モデル)について説明してみる。
拡散モデルの説明例として↓の動画がある
【5分で分かる】画像生成AIで頻出の拡散モデルについて分かりやすく解説!
↑の記事では、拡散モデルについて
「ある画像に対してランダムノイズを徐々に当てていき、完全にノイズになったものを逆向きに推定した際に、ノイズ除去後の画像と元の画像の差分を少なくするように学習した技術」
としていて、これ、拡散モデルを知っている人や、機械学習でモザイクを外す方法とかを知っている人には、そのとおりの話だし、すぐに分かるけど、知らない人には、まったく意味不明だとおもうので、ちょっと説明。
としていて、これ、拡散モデルを知っている人や、機械学習でモザイクを外す方法とかを知っている人には、そのとおりの話だし、すぐに分かるけど、知らない人には、まったく意味不明だとおもうので、ちょっと説明。
この技術、機械学習でモザイクを外す技術と比較すると、すごく考えやすい。
に端折って書いてあるけど、後で拡散モデルと比較できるように、もうちょっと丁寧に書くと、
(1)学習データの作成
1-1 モザイクのかかっていない元画像を用意する。
1-2 この画像に対して、
5%モザイクがかかったもの(モザイクかかってるけどまだわかる)、
10%モザイクがかかったもの(だんだんわかんなくなる)
10%モザイクがかかったもの(だんだんわかんなくなる)
:
100%モザイクがかかったもの(まったくわからん。モザイクで)
という、モザイクの程度(かかり具合)を変えた画像を数段階用意する
(2)学習
2-1 上記1ー2で作成した画像は、
5%→10%→20%→・・・→100%と、
だんだん、モザイクが強くなっていってるけど、
これを逆に学習する。
つまり、はじめ、
100%モザイクがかかっている画像を入力
90%モザイクがかかっている画像を出力
を学習させ、次に
90%モザイクがかかっている画像を入力
80%モザイクがかかっている画像を出力
という風に順々に学習させていくと、
:
最後、
5%モザイクがかかっている画像を入力
元の画像を出力
っていう風になる。
(3).機械学習によるモザイク外し(推定)
ここで、モザイクがかかった画像、
例えば30%モザイクがかかった画像を入力すると、
(2)の学習により、
20%モザイクがかかった画像が返ってくる。
そこで、その20%モザイクがかかった画像を入力として入れると、
10%モザイクがかかった画像が返ってくる
さらに、10%モザイクがかかった画像を入力すると
5%モザイクがかかった画像が返ってきて
5%モザイクがかかった画像を入力すると
元のモザイクがない画像が返ってくる
このように、モザイクがかかっている画像を入力し、推論させ
出力して出て来た画像を、再度入力として推論させるということを
何回か繰り返すと、いつかは、モザイクのかかっていない元の画像を
返すことになる。
ってことになる。これが、AIによるモザイクの外し方。
拡散モデルは、モザイクではなく、これを、ノイズで行う。
つまりこんな感じ(上のモザイクと比較してね)
(1)学習データの作成
1-1 ノイズのかかっていない元画像を用意する。
1-2 この画像に対して、
5%ノイズがかかったもの(ノイズかかってるけどまだわかる)、
10%ノイズがかかったもの(だんだんわかんなくなる)
10%ノイズがかかったもの(だんだんわかんなくなる)
:
100%ノイズがかかったもの(まったくわからん。ノイズで)
という、ノイズの程度(かかり具合)を変えた画像を数段階用意する
(2)学習
2-1 上記1ー2で作成した画像は、
5%→10%→20%→・・・→100%と、
だんだん、ノイズが強くなっていってるけど、
これを逆に学習する。
つまり、はじめ、
100%ノイズがかかっている画像を入力
90%ノイズがかかっている画像を出力
を学習させ、次に
90%ノイズがかかっている画像を入力
80%ノイズがかかっている画像を出力
という風に順々に学習させていくと、
:
最後、
5%ノイズがかかっている画像を入力
元の画像を出力
っていう風になる。
(3).機械学習によるノイズ外し(推定)
ここで、ノイズがかかった画像、
例えば30%ノイズがかかった画像を入力すると、
(2)の学習により、
20%ノイズがかかった画像が返ってくる。
そこで、その20%ノイズがかかった画像を入力として入れると、
10%ノイズがかかった画像が返ってくる
さらに、10%ノイズがかかった画像を入力すると
5%ノイズがかかった画像が返ってきて
5%ノイズがかかった画像を入力すると
元のノイズがない画像が返ってくる
という形になるけど、今、30%からはじめたけど、
これ、100%から始めてもいいよね。同じ理屈でできる
・・・
けど、冷静に考えてね。100%ノイズって、ただのノイズだよ。
つまり、ノイズから画像を生成していることになる。
これが拡散モデル。
動画に出てくる説明と↑の説明を対比すると、
「ある画像に対してランダムノイズを徐々に当てていき、
が、(1)学習のところに対応
完全にノイズになったものを逆向きに推定した際に、
が「(3).機械学習によるノイズ外し(推定)」の
「100%から始めてもいいよね。」の話
ノイズ除去後の画像と元の画像の差分を少なくするように学習した技術」
この学習が「(2)学習」の学習の話。
Stable Diffusionでは、この学習部分をUNETというもので実現している。
でも、ここでモザイク外しとStable Diffusionで決定的な違いがある。
上記モザイク外しでは、白人の画像で学習し、白人のモザイク画像を入力したとき、黒人のモザイク外し画像を出力することはできないが、
Stable Diffusionではできている。
これは何故できるのかというと、Stable Diffusionでは、画像を直接扱うのではなく、潜在変数と呼ばれる、抽象化した概念の変数を使う。これにより、文字と画像を合わせることが可能になる。
Word2Vecの話で、分散表現というのが出てくる。文字列は
One-hotベクトルという、単語の出現回数をベクトルにしたもので表現できるけれど、それだと、同じ意味の言葉でも、言葉が違えば、違うベクトルとなってしまう。言葉を概念で表せば、同じ意味の言葉を同じベクトルであらわすことも可能になってくる。この概念等、One-hotベクトルを集約して表す方法が分散表現。
そして、文字列の分散表現と画像の分散表現(ここでは潜在変数と言っている)を使って学習させると、上記のような白人の画像入力して、黒人の画像を出力することができるんだけど、その話は長くなるので、別の機会にしたいと思います。そのとき、Stable Diffusionの全体像を示す・・・って、今リンクしちゃってもいいか。↓に置いておくね
上記画像はより引用(なぜか、リンク先をイメージにしないとエラーが出た)