\documentclass{article}

\usepackage{bm}
\usepackage{ctex}
\usepackage{float}
\usepackage{xcolor}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{amsfonts}
\usepackage{mathrsfs}
\usepackage{datetime}
\usepackage{geometry}
\usepackage{graphicx}
\usepackage{enumitem}
\usepackage{tcolorbox}
\usepackage{subcaption}

\geometry{
    a4paper,
    left = 1in,
    right = 1in,
    top = 1in,
    bottom = 1.2in
}

\setitemize[1]{
    itemsep = 7pt,
    partopsep = 0pt,
    parsep = \parskip,
    topsep = 5pt
}

\newcommand{\diff}[2]{\dfrac{\mathrm{d}#1}{\mathrm{d}#2}}
\newcommand{\diffn}[3]{\dfrac{\mathrm{d}^{#3}#1}{\mathrm{d}#2^{#3}}}
\newcommand{\piff}[2]{\dfrac{\partial{#1}}{\partial{#2}}}
\newcommand{\eval}[2]{\left.#1\right|_{#2}}
\newcommand{\e}{\mathrm{e}}
\newcommand{\barline}[1]{\overline{#1\rule{0pt}{1.5ex}}}
\renewcommand{\d}{\mathrm{d}}

\definecolor{ink}{HTML}{16324F}
\definecolor{accent}{HTML}{0E7C86}
\definecolor{paper}{HTML}{F5FAF8}
\definecolor{codebg}{HTML}{F4F6F8}

\newtcolorbox{keybox}[1]{
    colback = paper,
    colframe = accent!70!black,
    fonttitle = \bfseries,
    title = #1,
    arc = 2mm,
    boxrule = 0.6pt
}

\title{\textcolor{ink}{图像生成算法：从 DDPM 到 Diffusion Model}}
\author{Illusionna}
\date{\currenttime,\ \today}


\begin{document}

\maketitle

\begin{center}
    \color{accent}\rule{1\linewidth}{0.75pt}
\end{center}

\tableofcontents

\begin{center}
    \color{accent}\rule{1\linewidth}{0.75pt}
\end{center}



\section{DDPM 哲学}
对于 $\bm{x}_0$ 真实图像数据，例如一张归一化的图片，定义 DDPM 两个方向：

\begin{center}
    \fbox{
        \parbox{0.75\linewidth}{\centering
            \textbf{前向：}$\bm{x}_0\to\bm{x}_1\to\bm{x}_2\to\cdots\bm{x}_T$ 不断加入高斯噪声
            \\
            \textbf{反向：}$\bm{x}_T\to\bm{x}_{T-1}\to\cdots\to\bm{x}_1\to\bm{x}_0$ 不断消除噪声
        }
    }
\end{center}

对于普通加噪过程，以 $\bm{x}_0$ 为均值，$\beta$ 为标准差，进行正态分布采样：
\[ \bm{x}_1=\bm{x}_0+\beta\bm{\epsilon}\qquad\bm{\epsilon}\sim\mathcal{N}(\bm{0},\bm{E}) \]
并且记该过程为 $q(\bm{x}_1\mid\bm{x}_0)$ 前向转移的概率密度，我们的目标是希望随着前向链不断推进，最终的加噪图像呈现标准正态分布：
\[ \bm{x}_T\sim\mathcal{N}(\bm{0},\bm{E}) \]

显而易见，我们可以从 $\bm{x}_0$ 直接一步加噪得到 $\bm{x}_t$，即：
\[ \bm{x}_t=\bm{x}_0+t\beta\bm{\epsilon} \]

\begin{figure}[H]
    \centering
    \begin{minipage}{1\textwidth}
        \centering
        \includegraphics[width=0.9\linewidth]{./figs/beauty.png}
        \subcaption{加噪 4 步过程片段}
    \end{minipage}

    \vspace{1em}

    \begin{minipage}{1\textwidth}
        \centering
        \includegraphics[width=0.9\linewidth]{./figs/tower.png}
        \subcaption{加噪 512 步过程片段}
    \end{minipage}
    \caption{随着图像 $\bm{x}_0$ 不断 DDPM 加噪声最终呈现标准高斯分布}
\end{figure}

但这存在两个问题，随着 $t$ 增加，均值始终保持 $\bm{x}_0$，方差一直增大，最后 $\bm{x}_t$ 会变得越来越偏离标准正态分布，并且图像加噪后期要达到和前期相同的破坏效果，需要更大的噪声强度，而保持 $\beta$ 始终常数是无法完成的.

因此 DDPM 进行了改进，对任意一步前向过程都是预先指定的马尔可夫链：
\[ q(\bm{x}_t\mid\bm{x}_{t-1})=\mathcal{N}(\sqrt{1-\beta_t}\bm{x}_{t-1},\beta_t\bm{E}) \]
也就是 $\bm{x}_t=\sqrt{1-\beta_t}\bm{x}_{t-1}+\sqrt{\beta_t}\bm{\epsilon}$，其中，有 $0<\beta_1<\beta_2<\cdots<\beta_T<1$，最终 DDPM 前向过程算法达到均值的缩放保证方差不会在每步无界累积的效果.



\section{前向过程推演式}
我们记 $\alpha_t=1-\beta_t$，观察现象：
\begin{align*}
    \bm{x}_1&=\sqrt{\alpha_1}\bm{x}_0+\sqrt{1-\alpha_1}\bm{\epsilon}
    \\
    \bm{x}_2&=\sqrt{\alpha_2}\bm{x}_1+\sqrt{1-\alpha_2}\bm{\epsilon}
    \\
    &=\sqrt{\alpha_2}\left(\sqrt{\alpha_1}\bm{x}_0+\sqrt{1-\alpha_1}\bm{\epsilon}\right)+\sqrt{1-\alpha_2}\bm{\epsilon}
    \\
    &=\sqrt{\alpha_2\alpha_1}\bm{x}_0+\sqrt{1-\alpha_2\alpha_1}\bm{\epsilon}
    \\
    \bm{x}_3&=\sqrt{\alpha_3}\bm{x}_2+\sqrt{1-\alpha_3}\bm{\epsilon}
    \\
    &=\sqrt{\alpha_3}\left(\sqrt{\alpha_2\alpha_1}\bm{x}_0+\sqrt{1-\alpha_2\alpha_1}\bm{\epsilon}\right)+\sqrt{1-\alpha_3}\bm{\epsilon}
    \\
    &=\sqrt{\alpha_3\alpha_2\alpha_1}\bm{x}_0+\sqrt{1-\alpha_3\alpha_2\alpha_1}\bm{\epsilon}
\end{align*}
其中，这里使用统计学中正态分布性质，即多个独立同正态分布的随机变量值和仍然为正态分布，均值与方差等于多个正态分布均值与方差之和. 因此推导出前向过程 $q(\bm{x}_t\mid\bm{x}_0)$ 有：
\[ q(\bm{x}_t\mid\bm{x}_0)=\mathcal{N}\left(\sqrt{\prod_{n=1}^{t}\alpha_n}\cdot\bm{x}_0,\sqrt{1-\prod_{n=1}^{t}\alpha_n}\cdot\bm{E}\right) \]

其闭式采样为：
\[ \bm{x}_t=\sqrt{\prod_{n=1}^{t}\alpha_n}\cdot\bm{x}_0+\sqrt{1-\prod_{n=1}^{t}\alpha_n}\cdot\bm{\epsilon} \]

这个现象是很明显的重参数化，训练只需随机抽一个 $t$ 和一份噪声，而不用模拟 $t$ 步. 此外，根据数学分析极限定理：
\[ \lim_{t\to\infty}\prod_{n=1}^{t}\alpha_n=\lim_{t\to\infty}\prod_{n=1}^{t}(1-\beta_n)=0 \]

因此 DDPM 前向过程解决了以上存在的两个问题，满足了当 $t$ 增大时，最终加噪图像呈现 $\bm{x}_T\sim\mathcal{N}(\bm{0},\bm{E})$ 标准正态分布.

\begin{keybox}{例子}
    若 $\displaystyle\prod\limits_{n=1}^{t}\alpha_{n}=0.81$，则 $\bm{x}_t\approx0.9\bm{x}_0+0.436\bm{\epsilon}$，其中信号功率为 $0.81$，噪声功率为 $0.19$.
\end{keybox}



\section{反向过程去噪}
理想的 DDPM 反向分布概率密度是 $q(\bm{x}_{t-1}\mid\bm{x}_t)$，即根据上一个状态的 $\bm{x}_t$ 去噪生成当前状态 $\bm{x}_{t-1}$ 的图像，但问题在于它不可直接计算，因为我们计算一个实际的近似分布：
\[ p_{\bm{\theta}}(\bm{x}_{t-1}\mid\bm{x}_{t}) \]

近似分布尽可能接近理想分布，即可达到去噪复原效果：
\[ p_{\bm{\theta}}(\bm{x}_{t-1}\mid\bm{x}_{t})\approx q(\bm{x}_{t-1}\mid\bm{x}_{t}) \]

在前向过程中，已知原图的后验，则有：
\[ q(\bm{x}_{t-1}\mid\bm{x}_{t},\bm{x}_0)=\dfrac{q(\bm{x}_{t}\mid\bm{x}_{t-1},\bm{x}_0)q(\bm{x}_{t-1}\mid\bm{x}_0)}{q(\bm{x}_{t}\mid\bm{x}_0)} \]
上式含义是若同时知道 $\bm{x}_0$ 和 $\bm{x}_t$，那么最正确的单步去噪分布就是这个高斯分布. 由于给定 $\bm{x}_{t-1}$ 后，$\bm{x}_t$ 不再依赖 $\bm{x}_0$，则：
\[ q(\bm{x}_{t-1}\mid\bm{x}_{t},\bm{x}_0)=\dfrac{q(\bm{x}_{t}\mid\bm{x}_{t-1})q(\bm{x}_{t-1}\mid\bm{x}_0)}{q(\bm{x}_{t}\mid\bm{x}_0)} \]

由于一个 $d$ 维度图像展平后，各向同性高斯密度对数为：
\[ \log\mathcal{N}\left(\bm{x};\bm{\mu},\sigma^2\bm{E}\right)=-\dfrac{d}{2}\log\left(2\pi\sigma^2\right)-\dfrac{\Vert\bm{x}-\bm{\mu}\Vert^2}{2\sigma^2} \]

由于 $\bm{x}_{t-1}$ 是未知的随机变量，因此：
\begin{align*}
    \log q(\bm{x}_{t-1}\mid\bm{x}_{t},\bm{x}_0)&=\log q(\bm{x}_{t}\mid\bm{x}_{t-1})+\log q(\bm{x}_{t-1}\mid\bm{x}_0)-\log q(\bm{x}_{t}\mid\bm{x}_0)
    \\
    &=C-\dfrac{\Vert\bm{x}_t-\sqrt{\alpha_t}\bm{x}_{t-1}\Vert^2}{2\beta_t}-\dfrac{\left\Vert\bm{x}_{t-1}-\sqrt{\displaystyle\prod_{n=1}^{t-1}\alpha_n}\cdot\bm{x}_0\right\Vert^2}{2\left(1-\displaystyle\prod_{n=1}^{t-1}\alpha_n\right)}
\end{align*}

展开后得到：
\begin{align*}
    \begin{cases}
        \Vert\bm{x}_t-\sqrt{\alpha_t}\bm{x}_{t-1}\Vert^2=\alpha_t\Vert\bm{x}_{t-1}\Vert^2-2\sqrt{\alpha_t}\bm{x}_t^{\top}\bm{x}_{t-1}+C
        \\[7pt]
        \left\Vert\bm{x}_{t-1}-\sqrt{\displaystyle\prod_{n=1}^{t-1}\alpha_n}\cdot\bm{x}_0\right\Vert^2=\Vert\bm{x}_{t-1}\Vert^2-2\sqrt{\displaystyle\prod_{n=1}^{t-1}\alpha_n}\cdot\bm{x}_0^{\top}\bm{y}+C
    \end{cases}
\end{align*}

整合得到：
\[ \log q(\bm{x}_{t-1}\mid\bm{x}_{t},\bm{x}_0)=C-\dfrac{1}{2}\left[\dfrac{1-\displaystyle\prod_{n=1}^{t}\alpha_n}{\beta_t\left(1-\displaystyle\prod_{n=1}^{t-1}\alpha_n\right)}\Vert\bm{x}_{t-1}\Vert^2-2\left(\dfrac{\sqrt{\alpha_t}}{\beta_t}\bm{x}_t+\dfrac{\sqrt{\displaystyle\prod_{n=1}^{t-1}\alpha_n}}{1-\displaystyle\prod_{n=1}^{t-1}\alpha_n}\bm{x}_0\right)^{\top}\bm{x}_{t-1}\right] \]

简记：
\[ \bm{A}=\dfrac{1-\displaystyle\prod_{n=1}^{t}\alpha_n}{\beta_t\left(1-\displaystyle\prod_{n=1}^{t-1}\alpha_n\right)}\qquad\bm{v}=\dfrac{\sqrt{\alpha_t}}{\beta_t}\bm{x}_t+\dfrac{\sqrt{\displaystyle\prod_{n=1}^{t-1}\alpha_n}}{1-\displaystyle\prod_{n=1}^{t-1}\alpha_n}\bm{x}_0 \]

则有：
\[ \log q(\bm{x}_{t-1}\mid\bm{x}_{t},\bm{x}_0)=C-\dfrac{1}{2}\left(\bm{A}\Vert\bm{x}_{t-1}\Vert^2-2\bm{v}^{\top}\bm{x}_{t-1}\right) \]

又因为配方可得：
\[ \bm{A}\Vert\bm{x}_{t-1}\Vert^2-2\bm{v}^{\top}\bm{x}_{t-1}=\bm{A}\left\Vert\bm{x}_{t-1}-\bm{v}\bm{A}^{-1}\right\Vert^2+C \]

所以后验为：
\[ q(\bm{x}_{t-1}\mid\bm{x}_{t},\bm{x}_0)=\mathcal{N}\left[\tilde{\bm{\mu}}(\bm{x}_t),\tilde{\beta}_t\bm{E}\right] \]
其中：
\begin{align*}
    \begin{cases}
        \tilde{\bm{\mu}}(\bm{x}_t)=\bm{v}\bm{A}^{-1}=\dfrac{\sqrt{\displaystyle\prod_{n=1}^{t-1}\alpha_n}\cdot\beta_t}{1-\displaystyle\prod_{n=1}^{t}\alpha_n}\bm{x}_0+\dfrac{\sqrt{\alpha_t}\left(1-\displaystyle\prod_{n=1}^{t-1}\alpha_n\right)}{1-\displaystyle\prod_{n=1}^{t}\alpha_n}\bm{x}_t
        \\[32pt]
        \tilde{\beta}_t=\bm{A}^{-1}=\dfrac{1-\displaystyle\prod_{n=1}^{t-1}\alpha_n}{1-\displaystyle\prod_{n=1}^{t}\alpha_n}\beta_t
    \end{cases}
\end{align*}

综上可知，当在确定原图 $\bm{x}_0$ 时，均值 $\tilde{\bm{\mu}}(\bm{x}_t)$ 是原图和当前噪声图的加权组合，方差 $\tilde{\beta}_t$ 是该步骤不可避免的不确定性.



\section{AI 神经网络训练过程}
由于真实的生成任务中没有 $\bm{x}_0$，只有 $\bm{x}_t$，所以不能直接使用 $\tilde{\bm{\mu}}(\bm{x}_t)$，因此我们定义一个神经网络来补上这个缺失的信息. 模型把每一步反向过程转移设置为一个高斯分布，把方差固定为已知度量，让 AI 神经网络学习决定均值：
\[ p_{\bm{\theta}}(\bm{x}_{t-1}\mid\bm{x}_t)=\mathcal{N}\left[\bm{\mu}_{\bm{\theta}}(\bm{x}_t),\sigma_t^2\bm{E}\right] \]

其中与真实后验比较可知：

\begin{itemize}
    \item 真实方差是 $\tilde{\beta}_t$，因此不需要网络学习方差，固定 $\sigma_t^2=\tilde{\beta}_t$，工程设计中，可简化为 $\sigma_t^2=\beta_t$.
    \item 需要 AI 神经网络学习的只有均值 $\bm{\mu}_{\bm{\theta}}(\bm{x}_t)$，使其尽可能接近真实均值 $\tilde{\bm{\mu}}(\bm{x}_t)$.
\end{itemize}

我们可以理解成 $\tilde{\beta}_t$ 用来设定反向采样的随机程度，而 $\tilde{\bm{\mu}}(\bm{x}_t)$ 是网络逼近正确的去噪方向.



\section{从预测均值到拟合噪声}
训练时，原始图像 $\bm{x}_0$ 经过前向加噪，有：
\[ \bm{x}_t=\sqrt{\prod_{n=1}^{t}\alpha_n}\cdot\bm{x}_0+\sqrt{1-\prod_{n=1}^{t}\alpha_n}\cdot\bm{\epsilon}\qquad\bm{\epsilon}\sim\mathcal{N}(\bm{0},\bm{E}) \]

其中的 $\bm{\epsilon}$ 是高斯分布，可以随即生成采样点，因而训练时它是已知答案，因此可以得到：
\[ \bm{x}_0=\dfrac{\bm{x}_t-\sqrt{1-\displaystyle\prod_{n=1}^{t}\alpha_n}}{\sqrt{\displaystyle\prod_{n=1}^{t}\alpha_n}} \]

因为真实均值：
\[ \tilde{\bm{\mu}}(\bm{x}_t)=\dfrac{\sqrt{\displaystyle\prod_{n=1}^{t-1}\alpha_n}\cdot\beta_t}{1-\displaystyle\prod_{n=1}^{t}\alpha_n}\bm{x}_0+\dfrac{\sqrt{\alpha_t}\left(1-\displaystyle\prod_{n=1}^{t-1}\alpha_n\right)}{1-\displaystyle\prod_{n=1}^{t}\alpha_n}\bm{x}_t \]

再利用：
\[ \displaystyle\prod_{n=1}^{t}\alpha_n=\alpha_t\displaystyle\prod_{n=1}^{t-1}\alpha_n \]

可得：
\[ \tilde{\bm{\mu}}(\bm{x}_t)=\dfrac{1}{\sqrt{\alpha_t}}\left(\bm{x}_t-\dfrac{\beta_t}{\displaystyle\sqrt{1-\prod_{n=1}^{t}\alpha_n}}\bm{\epsilon}\right) \]

改写后的 $\tilde{\bm{\mu}}(\bm{x}_t)$ 是神经网络训练的关键，真实去噪均值中的未知原图可以等价改写为当初加入的噪声 $\bm{\epsilon}$. 于是我们让噪声神经网络满足：
\[ \bm{\epsilon}_{\bm{\theta}}(\bm{x}_t)\approx\bm{\epsilon} \]

再以完全相同的形式定义神经网络模型均值：
\[ \bm{\mu}_{\bm{\theta}}(\bm{x}_t)=\dfrac{1}{\sqrt{\alpha_t}}\left[\bm{x}_t-\dfrac{\beta_t}{\displaystyle\sqrt{1-\prod_{n=1}^{t}\alpha_n}}\bm{\epsilon}_{\bm{\theta}}(\bm{x}_t)\right] \]

如果神经网络把噪声预测准确，则可达到我们想要的反向去噪效果：
\[ \bm{\mu}_{\bm{\theta}}(\bm{x}_t)\approx\tilde{\bm{\mu}}(\bm{x}_t) \]



\section{更新神经网络参数 $\bm{\theta}$}
训练过程中，真实噪声 $\bm{\epsilon}$ 已知，直接让网络输出与它接近即可：
\[ \mathcal{L}(\bm{\theta})=\left\|\bm{\epsilon}_{\bm{\theta}}(\bm{x}_t)-\bm{\epsilon}\right\|_2^2 \]

该损失函数是普通的 MSE，我们的目标是不断迭代使得损失尽可能小，而当前目标正是一个有现成标签的监督学习问题，因此一次训练迭代可概括为：

\begin{itemize}
    \item 从图片集抽取一张干净的原始图像 $\bm{x}_0$.
    \item 对图片随机抽取时间步 $t$ 生成高斯噪声图 $\bm{x}_t$.
    \item 神经网络输入 $\bm{x}_t$，得到预测 $\bm{\epsilon}_{\bm{\theta}}(\bm{x}_t)$.
    \item 计算 $\mathcal{L}(\bm{\theta})$ 损失函数 MSE.
    \item 反向传播更新梯度：
    \[ \bm{\theta}\leftarrow\bm{\theta}-\eta\bm{\nabla}\mathcal{L}(\bm{\theta}) \]
\end{itemize}

其中 $\eta$ 是学习率，在 PyTorch 中通常用 AdamW 执行更新.

\begin{keybox}{逻辑链}
    \begin{center}
        $\tilde{\bm{\mu}}(\bm{x}_t)\implies\bm{\epsilon}_{\bm{\theta}}(\bm{x}_t)\implies\bm{\theta}\leftarrow\bm{\theta}-\eta\bm{\nabla}\mathcal{L}(\bm{\theta})$
    \end{center}
\end{keybox}



\section{神经网络推理生成图像}
从 $\bm{x}_T\sim\mathcal{N}(\bm{0},\bm{E})$ 标准正态分布噪声图像开始，对 $t=T,T-1,\ldots,1$ 重复执行：
\[ \bm{x}_{t-1}=\bm{\mu}_{\bm{\theta}}(\bm{x}_t)+\sigma_t\bm{\epsilon}\qquad\bm{\epsilon}\sim\mathcal{N}(\bm{0},\bm{E}) \]

通常在最后一步 $t=1$ 时，我们取 $\bm{\epsilon}=\bm{0}$，避免最后刚得到图像又额外引入一次随机扰动. 这便把我们前文求得的 $\tilde{\bm{\mu}}(\bm{x}_t)$ 和 $\tilde{\beta}_t$ 与最终训练得到的参数 $\bm{\theta}$ 连成了完整的 DDPM 过程.



\section{总结}
DDPM 不是与 Diffusion Model 并列的另一个模型，而是 Diffusion Model 的一个具体实现. 更一般地说，扩散模型都遵循同一条生成思路：先定义一个逐渐破坏数据结构的正向过程，再学习其逆过程，最后从简单噪声分布逐步生成数据. 若把正向过程记为 $q$，模型学习的反向过程记为 $p_{\bm{\theta}}$，则这一共同结构可写为：
\[ \bm{x}_0\xrightarrow{q}\bm{x}_1\xrightarrow{q}\cdots\xrightarrow{q}\bm{x}_T\approx\mathcal{N}(\bm{0},\bm{E})\qquad\Longrightarrow\qquad\bm{x}_T\xrightarrow{p_{\bm{\theta}}}\cdots\xrightarrow{p_{\bm{\theta}}}\bm{x}_1\xrightarrow{p_{\bm{\theta}}}\bm{x}_0 \]

DDPM 提供的是 Diffusion Model 的基本范式：\textbf{把复杂数据分布的生成问题转化为一系列较容易学习的局部去噪问题}.

\begin{keybox}{DDPM 与 Diffusion Model 的关系}
    \begin{center}
        Diffusion Model 是“加噪 $\rightarrow$ 学习逆过程 $\rightarrow$ 从噪声生成”的总框架
        \\
        DDPM 是该框架在离散高斯马尔可夫链上的一种具体设计实现
    \end{center}
\end{keybox}



\end{document}