从多篇论文看扩散模型在文本生成领域的应用
©作者 | 中森
研究方向 | 自然语言处理
D3PM
论文链接:
在近期北大出的一篇综述里看到扩散模型对文本生成的应用的章节里提到了 D3PM,就去看了看这篇论文。实质上参考意义非常有限,仅粗读了一遍在此简单记录一下。
D3PM 笔者认为最大的亮点在于泛化了扩散过程里的扩散方式。还记得在大一统视角理解扩散模型里,笔者复述了扩散模型的变分推导过程,其中推导到最终将得到以下主要优化的损失函数。
而具体怎么优化该损失函数,主要应用的是扩散模型里每一步加噪都是加高斯噪声的性质,使得最终该函数里的每一项都可求得具体的解析表达式。但应用了高斯分布加噪主要是因为扩散模型主要针对图像或者波形的生成,那么如果要将扩散过程加入到离散的变量里,是否可以用不同的加噪方式?论文指出,主要要满足以下两点:
该加噪方式应使得 从 中的采样方便快捷。使得我们能够对以上的去噪匹配项里的 在任意时间步上方便计算。 同时该加噪方式应使得 有方便计算的解析形式,使得我们计算去噪匹配项的 KL 散度成为可能。
很明显,高斯噪声完美符合以上两个要求。而作者则提出了对于离散变量的加噪方式。具体的数理推导笔者按下不表,但简单来说就是定义了一系列转移矩阵。其中关于文本生成的转移矩阵的特点在于基于概率在不同时间步将一个离散词转为MASK 字符或者保持不变。
笔者看到这里的时候,发现这个形式和笔者之前调研的非自回归式生成里的 CMLM 特别相像。感兴趣的读者可以看看。如果是类似该架构的扩散的话,笔者认为该扩散模型的实现方式在语言质量上仍难谈优秀。CMLM 类的非自回归模型,在文本生成质量上的确难以匹敌自回归式的生成模型。在逐渐去噪的过程中逐步确定生成词的方式,实际上和 CMLM 的做法没有太大本质区别。笔者认为对比 CMLM 不太可能有质的提升。
Diffusion-LM
论文链接:
代码链接:
反向去噪到 后则要对每个潜在向量求一个距离最近的离散词。和生成过程中的解码类似,用 softmax 即可。
在大一统视角理解扩散模型里,论文作者解释了扩散模型的不同解读最终可以看做其变分下界里的去噪匹配项里对每一个时间步的潜在向量均值 的不同变形。其具体形式如下:
而在将扩散模型应用到文本生成领域以后,因为多出的词嵌入的关系,作者在该基础上增添了两项词嵌入的优化:
在大一统视角理解扩散模型里,论文作者提到不同的扩散模型对每一时间步的均值的估计可以拆解成三种不同的解法。DDPM 里是直接对噪声进行预测,而作者 lisa 发现如果直接预测噪声会导致最终去噪后的结果不对应任何词嵌入。为了解决这个问题作者改为使用三种解法里的第一种,即直接预测初始输入 。
基于从连续到离散难以对应的这个观察,作者还进一步提出了在解码做下游推断的时候,用 clamp 的方法把每一次 预测出的初始输入“夹”到一个对应的词嵌入上后,再继续去噪。并宣称这样可以让预测更准确,减少 rounding error。
当然这篇论文主要在讨论条件生成这件事。从论文标题也可以看出。具体在条件生成上,作者用的是 SongYang 博士的 Score-matching 的角度用贝叶斯法则做的推导:
其中第二项是个需要单独训练的分类器,其分类的梯度 score 用来更新扩散的输出。其中作者每一步扩散的时候都使用了多次梯度更新计算(3 次 adagrad),为了加速解码作者将扩散步数 T 由 2000 步下降为 200 步。
至此这篇论文的核心要点笔者认为已经梳理完成。但笔者对这篇论文有几点质疑。
作者提到该扩散模型的速度比自回归式的预训练模型慢了 7 倍。但笔者试跑了一下作者代码发现,用 transformer 做初始词的误差估计,并且做 200 次去噪过程。实际生成一个句子在 A100 显卡上要花 4-5 分钟,是自回归式生成类似长度的句子所耗时间的数十倍。
作者给的源代码比较混乱,难以阅读和使用。但笔者对于其提到的即在有引导的条件生成上表现良好,又在无引导的开放生成上表现突出持保留态度。该质疑主要来源于笔者在非自回归模型里的一些感性经验。
该扩散模型的主要优化目标是每个潜在向量与其词嵌入的预测误差。似乎并没有对句子的整体性有任何的要求。甚至就连 P(w|x0) 文章采取的建模方式也是每个字词的概率的独立连乘。这样强假设先验下的建模方式对模型能力要求很高。可能在小数据集小领域上可以达到较好效果,但复杂的文本领域恐怕难以建模。笔者按照作者的开源代码所训练出的结果也不理想。但存在笔者简单尝试下误用的可能。
LatentOps
论文链接:
代码链接:
笔者自身对使用预训练模型作为基底的 VAE 生成模型比较熟悉,也一直在思考扩散模型和文本生成的最佳方式是什么。Diffusion-LM 在笔者看来仍有几个缺陷,其中比较大的一个是没有显式建模全句的生成质量。这点也是笔者自身想实验的点。另一个是其生成需要预先固定长度再开始去噪生成极大地限制了使用场景。
恰好最近发现了这篇 text control with ODE 论文。笔者认为在技术路线上,该论文比 Diffusion-LM 更为自洽和完善。一方面该论文是在 VAE 里的潜在空间上做扩散,同样是在连续空间上做扩散,该方法避免了 Diffusion-LM 仍需要训练词嵌入并且引发的一系列优化技巧(包括损失函数的增添项,clamp trick 等)。
该论文的做法使得扩散过程仅仅在一个低维的连续空间上负责文本性质的控制。而在使得潜在向量具有相应的性质后,再将潜在向量交由解码器去生成文本。这样做有三个好处。一方面,该做法避免了 Diffusion-LM 的定长生成的限制,另一方面因为文本生成依然交由自回归解码器生成,文本通畅程度也得到了一定保证。最重要的是,类似于 stable-diffusion 的出圈,diffusion+VAE 这种做法相比 diffusion-LM 快了将近两个数量级!
对于扩散的具体流程来说,如果给定一个向量 a={a_1, a_2, ..., a_n} 为我们所希望拥有的所有性质的值的向量,并且规定 f_i 为一个判断潜在向量 z 是否拥有相关性质 a_i 的能量模型(Energy-Based-Model)。那么我们可以得到以下表达式:
并且每个能量函数都会以以下形式正则化以避免尺度差异。
注意对于扩散的起点 P(T) 来说,这是个标准的高斯分布,而扩散的终点 P(0) 是我们所定义的 VAE 的高斯先验,也是标准高斯分布。那么实际上我们扩散的每一步 Pt(z) 都服从标准高斯分布。将 P(z), P(a|z) 代入我们的 ODE 采样表达式后我们可以得到以下的 ODE 表达式:
那么整个扩散采样的流程就很确定了。如果是生成新文本类的任务,我们先从高斯先验中采样一个潜在向量 Z,然后根据我们定义的能量模型的能量函数求解以上表达式。当然纯高斯先验与 VAE 的后验不可能完全贴合。所以作者训练了一个单层的 GAN 来近似 VAE 的后验网络以采样 P(T)。而如果是修改已有句子的话就比较简单,直接通过 VAE 的 encoder 得到潜在向量 z 来作为 P(T)。
本论文的主要贡献如上。那么该论文的 VAE+Difussion 的路线和普通的 CVAE 相比有什么差异呢:
CVAE 如果需要对某个性质做条件生成(如情感,关键词)需要大量数据对全量模型训练。但 VAE+Diffusion 不用,只需要固定 VAE 额外训练一个潜在向量的分类器做扩散引导即可。而在潜在向量上的分类器,首先维度低,参数量少,训练资源相比原预训练模型低几个数量级!并且所需的训练数据也极少(原论文仅使用 200 条训练) CVAE 难以做到性质聚合,往往需要对不同性质的条件生成单独训练且训练出来的模型难以有效地聚合。但 VAE+Diffusion 在理论上展现了这种可能(当然是否有效仍需具体观察)。
不过 VAE+Diffusion 的模式仍存在几个问题笔者觉得会导致条件生成的成功率不高,或者不如论文里“宣称”的那么高:
首先是分类器的准确度是需要考虑的问题。直接用 VAE 里的潜在向量去做分类而不是 BERT 的 CLS 去做分类笔者与笔者的同事做过相关实验。准确率相比 CLS 分类是有较为明显的下降的。这样的下降必然会影响扩散引导的效果。
其次是解码器生成时的采样策略必然会导致一定的随机性存在。哪怕是笔者自身训练的 CVAE,在做特定的条件生成时往往也需要对同一个潜在向量重复采样以保证条件生成满足相关性质。
再次是关于多个条件聚合时,不同性质的条件聚合是否会出现明显的互相干扰,是否需要手动调整各个性质的比重系数也值得考虑。
自身实践
笔者根据论文 DELLA [1] 复现训练了一个由两个 Transformer-XL 组成的 VAE(其中 transformer 的每一层都会出一个潜在向量 Z),根据上篇论文对一个电商正负情感评论的分类数据集做了以下几个步骤:
根据有标签数据集生成一批带标签的 Latent-Vec 数据 用这些带有特定性质的 Latent-Vec 训练一个情感二分类器
已知扩散过程的起点(Encoder 的输出)和终点(带标签的 Latent-vec)用分类器进行 Nueral-ODE 扩散。
其中笔者发现:
分类器的准确度的确不高,最高只能达到八成左右(分类器的架构没有进行太多探索,只尝试了 MLP 的一些超参调整)。分类器虽然准确率一般但对性质改变已经足够。
生成的潜在向量确定性比较高,且速度很快。相比于 Diffusion-LM 需要 5 分钟左右的扩散时间生成一句话,VAE+diffusion 的做法只需要几秒钟。
以下是几个情感极性扭转的生成样例(没有经过任何挑选):
原句1(负面):呵呵了 这物流速度也是没谁了 同城网购竟然三天了还不到。 改写句1:呵呵了 这物流速度也是没谁了 同城网购居然还可以很不错 哈哈。
原句2(正面): 还不错,等试用一段时间再说。
改写句2:还不行,等试用一段时间再说。
原句3(负面): 买错了,自己是荣耀7,悲哀了,不管商家的事,鬼火绿。
改写句3:买对了,自己是荣耀7,呵呵,感谢商家的事,快乐了,不管火鬼绿。
原句4(负面):一次很差的购物 手机到手后 没仔细检查 晚上检查发现手机背面有划痕联系了客服说换 但是 后面他们打电话说不能更换 反正就是各种各样的借口。
改写句4:一次很漂亮的购物 手机上检查 后手机没受划 具体使用体验可以打电话客服询问 后来她说我不错 而且说都是精心计划 以后说但是一定要注意换三端的电话 感觉没有各种各样的借口。
参考文献
更多阅读
#投 稿 通 道#
让你的文字被更多人看到
如何才能让更多的优质内容以更短路径到达读者群体,缩短读者寻找优质内容的成本呢?答案就是:你不认识的人。
总有一些你不认识的人,知道你想知道的东西。PaperWeekly 或许可以成为一座桥梁,促使不同背景、不同方向的学者和学术灵感相互碰撞,迸发出更多的可能性。
PaperWeekly 鼓励高校实验室或个人,在我们的平台上分享各类优质内容,可以是最新论文解读,也可以是学术热点剖析、科研心得或竞赛经验讲解等。我们的目的只有一个,让知识真正流动起来。
📝 稿件基本要求:
• 文章确系个人原创作品,未曾在公开渠道发表,如为其他平台已发表或待发表的文章,请明确标注
• 稿件建议以 markdown 格式撰写,文中配图以附件形式发送,要求图片清晰,无版权问题
• PaperWeekly 尊重原作者署名权,并将为每篇被采纳的原创首发稿件,提供业内具有竞争力稿酬,具体依据文章阅读量和文章质量阶梯制结算
📬 投稿通道:
• 投稿邮箱:hr@paperweekly.site
• 来稿请备注即时联系方式(微信),以便我们在稿件选用的第一时间联系作者
• 您也可以直接添加小编微信(pwbot02)快速投稿,备注:姓名-投稿
△长按添加PaperWeekly小编
🔍
现在,在「知乎」也能找到我们了
进入知乎首页搜索「PaperWeekly」