前提
文字だけで画像生成AIの内部構造を説明する
A4の紙をお渡しするのでこれに写真みたいな犬の絵を書いてくださいと言ったら、無理そう、でもA4に印刷した犬の写真をお渡しするので、鉛筆と定規で小さい正方形を適当な場所に1個ずつ書いてくださいと言ったらできそうに感じる
実はこれパソコンも同じ
意味のない画像から意味のある画像にするのはかなり大変で、意味のある画像に正方形(ノイズ)を加えて意味のない画像にしていくのは結構簡単。
わかりやすい例でいうと、ニュース映像にモザイクかけるのはすぐできるけど、モザイクを外すのは難しいみたいな感じ
話を戻して犬の写真に100個正方形を描いたとします。ここで、100番目と99番目に書いた正方形を消すことはできそう。
では、50番目まで順番に消してくださいと言ったら、書いた順番表みたいなのがあれば人間でもできる。例えばこれが1万個の正方形でもたまに行とか読み間違えて消すことあるだろうけどなんとか行けるかなとなる
実はこれもパソコンとおなじで、最初にノイズをかけた順番、(厳密には時刻で管理してるんですが)加えたノイズを逆順で除去していくことが可能です。とはいえ、人間と同じように消しミスをするので、順番にかけたノイズと、逆順で取り除いたノイズのミスを最小になるように学習しています。
そうすると、最初に入力した画像Aにノイズをかけた後、ノイズを除去して入力画像と同じA'の画像が出力される仕組みが出来上がります。
これが、Diffusionモデル、拡散モデルと呼ばれるざっくりとした仕組みです。
問題
ただこれには、2つ大きな問題があって、まずそもそもの問題として解像度の高い画像をそのまま処理していると処理に時間がかかって全く実用的じゃない。
もう一つが、拡散モデルは画像を入力したら限りなく近い画像を出力するただの画像出し入れマシンで何の役にも立ちません。
この二つを解決します
この解決に潜在空間と潜在変数と呼ばれるものが出てくるんですが、しっかり説明しようとすると訳が分からなくなるので、わかりやすさ重視の超訳で説明すると、物事の概念を数値化して、概念のみで処理してしまえば二つの問題が一気に解決するんじゃないか。ということです。
例えば犬と言っても、チワワやダックスフンド、パグ、ラブラドールレトリバーと様々な品種があり姿かたちが全く違いますが、私たちは犬といえば伝わりますよね。
なぜなら犬には四足歩行やしっぽ、体毛、顔つき、体格などいくつかの共通する要素があって、それらの要素の関係性を見て犬とするからです
逆に猫は犬と似たような要素を持ちますが、それぞれの要素の関係性は犬と違うため犬と猫を明確に区別しています。この関係性を潜在変数として数値化し、その潜在変数を記録する場所を潜在空間と呼ぶそうです。
(わかりやすさ重視です)
もし、画像をこの潜在変数に置き換えることが出来たら、画像に存在する大量の要素ではなくて要素ごとの関係性のみを取り扱うことができるので計算量が非常に小さくでき、ざっくり1/64とか1/48とかになるらしいです。これで、処理速度の問題については一応解決できたといえます。(ほかにも高速化手法を使っていますが、その辺は割愛)
では、もう一つの問題である、画像出し入れマシンの問題点はなんでしょうか?
入力した画像を限りなく近い画像に出すことしかできないことですよね。
では、画像を文字に置き換えて入力出来たらどうなるでしょうか?
先ほど犬の話をしましたが、単語の犬と画像の犬は表現方法が違うのに同一の概念を指すことができます。
潜在変数は要素の関係性を数値化するといいました。
ということは、単語の犬と画像の犬は潜在変数が似ていると言えそうです。
もし二つの異なる表現を潜在変数で取り扱えたら便利そうですよね!!!
この試みはOpenAIが作ったCLIPと呼ばれる学習手法で実現しています。
これらを踏まえて、先ほどの画像出し入れマシンに何をさせるかというと(わかりやすさ重視で表現します)
まずランダムノイズ画像を作成し、マシンに渡してノイズ除去させます。でもマシンが画像を何も入力されてない!というので、単語を潜在変数に置き換えて単語を画像入力であるとマシンに誤認させます。
そうするとマシンが画像に偽装した単語に限りなく近い画像を出してくるわけなんですが、そもそも画像を入力してないので、単語から画像が生まれたように見える。という話です。
この方式の興味深いことは潜在変数に置き換えられればなんでも入力可能というところで、可能性が無限大だー!!というところで今回は締めです。
文字だけでも十分伝わりますね!!!(迫真)