Score-based generative model

references:

https://yang-song.net/blog/2021/score/

https://deeplearning.neuromatch.io/tutorials/W2D4_GenerativeModels/student/W2D4_Tutorial2.html#

https://lilianweng.github.io/posts/2021-07-11-diffusion-models/

Score-based models v.s. diffusion models

  • 一开始两者独立发展,所以有不同的理论依据和术语
  • 最后两者殊途同归:得到一样的模型

Score function

  1. 生成模型可以归类为两类:
    1. 显式的,基于likelihood的模型,比如autoregressive,normalizing flow,VAE。这些方法通过近似最大似然来建模概率密度分布。问题是,为了计算likelihood,需要一个normalizing constant这个量,它要么是未知的,要么要想尽办法通过其他的限制来估计或者消除。所以这类模型比较复杂。
    2. 隐式的,直接建模一个概率分布的sample process,而不是概率分布本身。比如GAN。但是它需要对抗学习,这比较不稳定,而且可能有模式坍塌的问题。
  2. Score function和第一类相关,它也是建模likelihood——但不是它本身,而是跟它相关的一个量,即 Stein score function。这样的一个神奇好处是,可以直接消除normalizing constant这个量。 (图中,等高线表示一个概率分布,箭头表示它的分数场。score-based model就是建模这些分数场)
  3. 具体一点来说:
    1. 假设给定一个数据集 \({x_1,x_2,...,x_N}\),每个数据都是从一个未知的数据分布 \(p(x)\) 采样。我们用一个生成模型来生成新的数据,这些数据都是从这个分布中采样的
    2. 我们要想办法表示这个概率分布。前面说的基于likelihood的模型是这么做的:直接建模这个概率密度函数: \[ p_\theta(x)=\frac{e^{-f_\theta(x)}}{Z_\theta} \] 其中这个 \(Z_\theta>0\) 就是依赖于 \(\theta\) 的那个normalizing constant了。 这个 \(p_\theta(x)\) 训练的目标函数就是最大log-likelihood: \[ \max_\theta\sum^N_{i=1}\log p_\theta(x_i) \]
    3. 前面说了,问题就是 \(Z_\theta\) 很难估计。为了避开估计它,我们的神经网络不再直接估计概率分布,而是估计它的分数(概率密度函数的log的梯度): \[ s_\theta(x)=\nabla_x\log p(x)=-\nabla_x f_\theta(x)-\nabla_x\log Z_\theta = -\nabla_x f_\theta(x) \] 去掉了 \(Z_\theta\)
    4. 训练的目标函数是 Fisher divergence\[ \mathbb E_{p(x)}[\|\nabla_x\log p(x)-s_\theta(x)\|^2_2] \]
    5. 现在的问题就是,上式中的 \(\nabla_x\log p(x)\)未知。但是很好解决,一种叫score matching的方法可以直接最小化 Fisher divergence,不需要知道真实的score。
    6. 最后的问题就是得到了这个 score function 之后,怎么从中采样新的数据了。Langevin dynamics 提出了一种迭代式的采样方法,就是和diffusion的步骤一模一样的。相当于从空间中任意一个位置初始化,然后顺着score function往高概率密度的方向优化,足够多的步骤之后就到了峰值处。

关 noise 什么事?

是这样的,前面提到的方法已经讲清楚了神经网络建模和目标函数。但是假如直接拿着数据集(比如图像)让网络学习的话,效果并不好。因为这个score function在低概率密度的区域样本很少,学得也很不好。

为了解决这个问题,我们才往数据中加 noise,在被噪声扰动后的数据集上训练网络。这些扰动后的数据点极大地扩充了数据集,最主要的是能填充那些低概率密度的分布区域。

大的噪声破坏数据分布,小的噪声不够填充低概率密度区域。所以就用多尺度的噪声。也就是diffusion model的前向过程了。

总体来说,score-based model就是在这些噪声扰动后的数据集上训练的。训练的时候,噪声的尺度当然也可以作为一个已知量输入,也就是noise conditional \(s_\theta(x,i)\)

diffusion models

to read:https://lilianweng.github.io/posts/2021-07-11-diffusion-models/

从diffusion models的角度解释整个模型