从AutoRegression到Diffusion
Why Does Diffusion Work Better than Auto-Regression?
https://www.youtube.com/watch?v=zc5NTeJbk-k
原标题是为什么Diffusion比AutoRegression效果好?
刷到个有意思的视频,没什么公式与理论,但很通彻地讲了AutoRegression到Diffusion的过渡,Diffusion不是一蹿而就的,终究也是AutoRegression成就了它;
最早期
假设我们有labels(实际图片),有个网络,我们关心输入,反正让网络训练就行了;最终效果是让网络学到从输入到labels的映射
但问题是,网络最终得到是所有训练集的一个平均值图片;因为所有labels的平均值也可以是个meaningful的label
早期
那,我们退一万步,让一个网络只预测一个位置的像素;比如网络–编号768,只预测第768位置上的像素;
网络可能会将整个图像学习,得输出一个像素
那更进一步,让输入是缺少两个像素,然后让网络–编号767训练并输出倒数第二个位置的像素,再把补齐后的像素给网络768预测最后一位置的像素
那,再进768步;训练768个网络,每个网络就预测一个像素,网络–编号1预测了第一个像素后交给网络–编号2……
这听起来似乎是pleassible的,但现实上,如果每个网络都直接输出这个网络的最高概率像素值,最终,不管运行多少次,得到的图片会是完全一样的;这个问题也很好解决,每次添加一些扰动,每次选择不同概率的值,从而增加多样性
而且,这样的网络有什么好处呢?它是自监督的,不需要人类给图片打标签,网络可以根据已有的像素推算下一个像素
小结下,如果让网络同时预测一堆像素,最终会产生一堆比较合理的结果,网络会输出一个平均值
但如果只让网络一次预测一个像素,效果就会比较好
那,为什么会这样呢?----因为这些像素是“有相关性”的
比如,如果这些像素本身就是无关的,这些像素对下一个像素的预测本身也帮不上什么忙,从而,模型就不需要知道(或者查看)之前的像素是什么(知道了也没用)
所以,现在的理想目标是,让网络学会“不依赖原像素”预测新像素;
那么,在选择数据集时,就不一定将连续的像素块儿扣下来,而是应该随机选择一些像素块儿让网络去预测
并且,最好让这些被扣下来的像素块尽量分散(in a random order)
目前呢,是将像素完全扣下来,直接变成黑色;
不过,我们可以不这样做,而是让像素逐渐丢失信息,比如,加点儿噪声?
虽然我们不知道原图是什么了,但我们知道加了什么噪声
看,逐渐添加了很多噪声,让图像失去了信息,并且让像素相互独立
最终
于是,按上面的方法,似乎就让Diffusion的出现变得合理了