开场白
这篇文章是今年的best paper之一自然很受人关注,所以自然而然想了解一下,顺便蹭一下热度。这篇博客主要是先占个坑,等有时间再好好看一看paper整一篇blog,完了再看一看代码再整一篇,这个数量就上来哈哈哈。
效果
我一开始对这篇文章也不熟悉,就从一个小白的视角来看一下,粗浅的理解一下这篇文章是一个什么样的工作。
好的看到这些效果图,我大概了解这是一篇什么样的工作了,从标题可以看到这篇文章是通过添加一些额外的条件来控制扩散模型的生成效果的。从上面的一些效果图中我们也可以看到,给定的输入条件可以有多种多样的形式包括草图、法线图、深度图、边缘线条、语言文本等,扩散模型会在此基础上进行细化。
基本做法
对于模型可以从简单来说,也可以从复杂来说。我们先从简单来说:
- 神经块将特征图x作为输入,并输出另一个特征图y,如(A)所示。为了将控制网添加到这样的块,我们锁定原始块并创建可训练的副本,并使用零卷积层将它们连接在一起,即权重和偏差都初始化为零的1×1卷积。这里,c是我们希望添加到网络中的条件向量,如(b)所示。
当然这样说也太简单,我们换个更详细一些的图来看。
这里的(a) + (b)就是这个网络的一个完整结构了,既然这篇是浅析那我们就简单来看一下。
- 首先我们看到了他的效果,从效果图大概了解了这篇文章是一个什么样的工作。然后我们从最简单的结构图里看到他的做法是:先将原始点网络全部冻结,然后拷贝出了一份可训练的,并且在前后添加了一个所谓 zero convolution 把这部分的输出加在原始模型输出之前。
- 从更加详细的模型图来看,拷贝的可训练block只涉及encoder block 和middle block,剩下全是zero convolution。
- stable diffusion 的U-net结构需要把上面的图像逆时针旋转90度,这样就看出来了
- zero convolution这是重点
重点
zero convolution这个东西到底是什么?这个是我比较好奇和关注的。
原文如上,就是1*1的卷积层但是权重和偏置初始化为0。
OK,现在概念我们了解了那为什么要这样做?有什么好处?
答案是这样做一方面在训练时速度会非常快,另一方面,这样当训练开始时,有害噪声不会影响可训练副本中神经网络层的隐藏状态。此外,由于Z(c;Θz1)=0,并且可训练副本也接收输入图像x,因此可训练副本是完全功能的,并保留了大型预训练模型的能力,使其能够作为进一步学习的强大骨干。零卷积通过在初始训练步骤中消除作为梯度的随机噪声来保护该主干。我们在补充材料中详细介绍了零卷积的梯度计算。
出处在这里:
对于0值初始化的梯度计算我也看了一下,这篇paper目前挂在arxiv上的有两个版本,第二个版本里面是没有说明的我猜后面应该还会再更新,在第一个版本里面其实是有一个说明过程,我也给大家放出来,与君共赏。
我就简单给大家梳理一下,大家应该都能看懂的。
公式五定义了zero conv的公式化表达包括了输入、权重和偏置。
公式六表示在一开始0初始化的情况下对其求梯度,也就是对输入、权重和偏置求偏导。
公式七表示一次梯度下降后的权重,最一般的公式张这个样子w(t+1)= w(t) - 学习率 * 梯度。
公式八证明在经过一次梯度下降后对图像的偏导不为零,模型就可以慢慢学起来了。
然后这里有一个比较有趣的点
在训练过程中,由于零卷积不会给网络增加噪声,因此模型应该始终能够预测高质量的图像。我们观察到,该模型并没有逐渐学习控制条件,而是突然成功地跟随输入条件图像;通常在小于10K的优化步骤中。如图4所示,我们称之为“突然收敛现象”。
哈哈哈,这个真是比较有趣,突然就质变了。深度学习就是这样大家在做实验的时候会发现很多有趣的现象但是还没法给出理论上的证明,所以说这东西是”黑盒“ or ”玄学“,可解释性是差不可否认但效果就是好。
另外再提一嘴,这种有趣的现象还有很多很多,比如前两天我看到的”EFFICIENT STREAMING LANGUAGE MODELS WITH ATTENTION SINKS“ 的这篇来自机器之心报道中就有(https://mp.weixin.qq.com/s/qIwYJAfD5bXJS6j0xtp2cw)
总结
我不是做文生图的,也不是做扩散模型,这篇文章也只是非常浅的搂了一眼。但从我的出发点来看最有用的东西应该是他这种训练方式和zero conv做为特殊连接层的使用,后面搞分割大模型做微调可以尝试一下或许。
后面有空会有关于这篇文章更详细的分析(仅代表个人看法不是什么真知灼见)。