A classy diffusion model dancing in a ballroom
こんにちは!AMBL株式会社 R&D部のエイドリアンです。
こちらの記事はADVENT CALENDARの記事です。
今回は最近話題になっているDiffusion Modelについての論文を紹介したいと思います。
論文情報
タイトル | Denoising Diffusion Probabilistic Models |
---|---|
発表年 | 2020/12/16 |
URL | https://arxiv.org/abs/2006.11239 |
github | https://github.com/hojonathanho/diffusion |
TL;DR
Diffusion Modelとは
画像を純粋なノイズから生成するモデルです。
簡単にまとめると、下記の特徴が挙げられます。
- 従来の画像生成系モデル(VAE, GAN等)よりも高度な画像生成ができる。
- 画像にノイズを加えること(Forward process)と
ノイズから画像を生成する(Backward process)の2つ処理で学習を行う。 - マルコフ過程を用いることで計算を効率化させる。
下のネコちゃんを覚えていただければと思います。
Diffusion Model = 画像を壊して作り直す
モチベーション
では、なぜこういう手法が出てきたのか?実は画像生成系モデルが非常に研究されています。その他にも、
- VAE: Variational Autoencoders (2013)
- GAN: Generative Adversarial Networks (2014)
- DDPM: Denoising Probailistic Models (2020) ← 本論文
- +α: Diffusion Models Beat GAN on Image Synthesis (2021)
などがあります。それぞれの特徴を上げますと、下記の図になります。
学習準備
では、Diffusion Modelはどうやって学習していくのか?
DDPMの学習には以下の3つのものが必須となります。
- Noise Scheduler(画像を壊す器)
- Neural Network (学習担当)
- Timestamp Encoding(破壊発火器)
それぞれのパラメータを用意し、Forward(画像を壊す)
処理とBackward(画像を作り直す)処理を行って学習を進めていきます。
Forward Process
$x_0=画像$
$q(x_{i:T}|x_o)=\prod_{t}^{T}q(x_t|x_{t-1})$
そして、
$q(x_{t}|x_{t-1})=N(x_t; \sqrt{1-\beta_t}{x_{t-1},\beta_t{I}})$
$\beta_t$: $t$時点の分散量
つまり、$\beta$が1に近づけば近づくほど画像が純粋なノイズとなっていきます。
また、マルコフ過程により$t$が大きくなればなるほど、画像が純粋なノイズになっていきます。
-- (変形後) --
$q(x_{t}|x_{0})=N(x_t; \sqrt{\bar{\alpha}}{x_{0},(1-\bar\alpha_t)I})$
Backward Process
$p_{\theta}(x_{0:T}):=p_{\theta}(x_{T})\prod_{t}^{T}p_\theta(x_{t-1}|x_{t})$
そして、
$p_{\theta}(x_{t-1}|x_{t})=N(x_{t-1}; \mu_{\theta}(x_t,t), \sigma^2_tI)$ for $1 < t \leq T$
$\mu_{\theta}$: 平均値
つまり、ノイズ画像から'正常'画像へ戻す(作り直す)時は、
ノイズの分布(平均、分散)さえ分かればいい、ということになります。
--
$x_{t-1}\approx x_t-e$
手法
上記の話しをまとめると、下記のとうな手順になります。
Neural Network
モデルの脳みその部分です。
今回のタスクはノイズ↔画像なので、入力(画像)と出力(画像)の形が一致
しなければなりません。ですので、U-NETがピッタリと言えるでしょう。
入力と出力の形は同じである
目的関数
ここがマホウです。様々なマホウをかけたら、目的関数は下記の通り簡単になりました!。
--
$\epsilon$: 真のノイズ
$\epsilon_\theta$: 予測ノイズ
つまり変なことをせずとも、ノイズを正しく予測させればよい、ということです。
実験結果
実験はよろしいみたいですね。
DEMO
参考
マホウ:https://lilianweng.github.io/posts/2021-07-11-diffusion-models/
簡易実装: https://colab.research.google.com/drive/1sjy9odlSSy0RBVgMTgP7s99NXsqglsUL?usp=sharing