来自 论文《 Denoising Diffusion Probabilistic Model》(DDPM)
论文链接: https://arxiv.org/abs/2006.11239
Hung-yi Lee 课件整理
讲到这里还没有解决的问题是,为什么这里还要多加一个噪声。Denoise模型算出来的是高斯分布的均值,做sample的时候考虑需要加上一个噪声,代表说考虑高斯分布的方差这一项。为什么不直接取均值呢?
同样的问题你也可以问,为什么语言模型在产生问句的时候,一定要做sample,为什么我们先产生一个有可能的分布,再从这个分布中sample出文字呢?取概率最大的就行,有人说做sample的好处是你每次问同一个问题,chatgpt的答案都不一样,当你问某个人有没有打疫苗,chatgpt有时候会说有有时候会说没有,就可以制造很多假新闻。
为什么一定要这样呢,为什么不能固定住去概率最大的呢?让模型每次都回答概率最大的句子,为什么需要有随机性?
这个问题之前就有人提出来了,这篇文章发现如果取概率最大的句子和词汇,那么输出的结果会是不断重复的句子,机器就会不断地跳帧,讲重复的话,虽然做sampling机器会说一些奇怪的话,和跳帧比起来sample的结果更好,为什么呢?他做了一个分析。
我们来看看人写的句子吧,橙色的线代表的是人写的句子,右边是人写的一篇文章,用我们的语言模型来计算人写的每一个单词的概率,发现人写出来的文章用字遣词并不是选概率最大的词汇。
我们让机器每一步都产生概率最大的词汇,发现它一直在不断地讲重复的话。
在做生成模型的时候概率最大的结果未必是最好的结果。
这是在文字上的观察。
实际上在语音合成模型上也有类似的规律。
在语音合成模型的推理阶段使用dropout效果很好,这个和我们想象的不太一样,我们一般是在训练阶段过拟合的时候才加dropout。
这篇文章里写到,为了引入输出结果的多变性,在推理的某一层加了dropout。
diffusion 模型其实是一种自回归模型,自回归的模型是一次到位,这样通常产生的结果不够好,我们把它改成N次到位,这就是diffusion模型的概念。
所以在做Denoise的时候就好比是自回归里面的一个step,在做自回归的时候每个step我们都要加一点噪声,加一点随机性结果才会好,所以在做Denoise的时候我们要加一点随机性,这样结果才会好。
李教授找助教做实验验证了,如果像论文里一样加噪声会生成小女孩头像这样正常的图片,把噪声去掉就只会产生一张黄色的图片。
到这里就是diffusion模型的全部玄机了。
训练的时候为什么不是一次一次地加噪声,顺便讲了什么sampling的时候需要加噪声。
diffusion模型不是只用在图像上,在语音合成任务上也可以。
这里没有什么好讲的,和图像几乎是一样的,图像的输入是2维的,在语音上变成了1维的,从一个完全高斯的杂训一步一步做Denoise,把它变成一段声音。
其中比较知名的方法就是WavGrad
基本上和DDPM没有什么差别。
但是把diffusion模型直接用在文字上就很困难了,我们没办法直接在文字上加噪声,文字是描述性的,没把法在描述性的东西上加噪声让它看不出来是什么。
有一些提法是把噪声加在word embedding上,就这样。
有几篇论文这样做的,比如diffusion-LM。
还有这篇论文 DiffuSeq,它是一个seq2seq的模型,是在latent representation上加噪声。
还有这篇论文,假设加高斯噪声是不行的,能不能加其他类型的噪声加到文字上?
这篇论文里面的噪声分布全部都是 [ m a s k ] [mask] [mask],然后再慢慢把有 [ m a s k ] [mask] [mask]的地方填充回来。
写在最后
diffusion模型最大的成功是把自回归的一步到位改为了N步到位。