你有没有想过,让AI做数学题和让AI写一篇流畅的文章,哪个更难?
直觉上你可能觉得写文章更难,毕竟文章要讲逻辑、要有文采。但现实恰恰相反。像GPT这样的语言模型写文章得心应手,可一旦碰到数独、碰到需要同时满足多个限制条件的逻辑谜题,就经常翻车。这背后藏着一个工程师们苦恼了很久的技术矛盾,而这篇论文想解决的,正是这个矛盾。
**问题出在"一个一个来"还是"一起来"**
先说说传统的语言模型是怎么生成文字的。像ChatGPT这类主流模型用的是自回归生成,一个词接一个词往后写,写完"今天"才能写"天气",写完"天气"才能写"很好"。这种方式的好处是逻辑连贯,坏处是慢,而且一旦前面写错了一个词,后面很难改。
这个毛病在解数独这种任务上会被放大。数独需要同时考虑九行九列和九个小格子里的数字约束,如果模型从左上角开始一个一个填,填到后面才发现前面填错了,整盘棋就崩了。
就像你搬家具进新房,如果你先把沙发搬到门口的位置,再去量客厅尺寸,等你发现沙发根本放不进去的时候,家具已经卡在门框里动不了了。你得先看清整个房间的格局,才能决定每件家具放哪,而不是走一步看一步。
扩散语言模型*:一种和自回归模型不同的文本生成方式,它不是一个词接一个词写,而是先把整段文字弄得"模糊"(比如全部替换成特殊的遮罩符号),然后通过多轮"去噪"把模糊的文字逐渐变清晰,这个过程允许同时修改多个位置的词,适合需要全局考虑的任务。
正是扩散语言模型想解决"一个一个来"的笨拙,它可以同时对多个位置做判断,一轮迭代能同时填好数独里的好几个格子,而不是死板地从左上角往右下角爬。这类研究在逻辑推理和数学规划任务上确实展现出优势,有论文显示它能超越参数量大得多的自回归模型。
但扩散语言模型自己也有一个隐藏的毛病,而这正是这篇论文要揪出来的。
**并行解码的代价:各算各的**
扩散语言模型在同一轮迭代里,会同时对好几个被遮住的位置做预测。问题是,这些位置的预测是各自独立算出来的,彼此并不知道对方猜了什么。
打个比方,假设你和另外三个朋友在玩一个默契游戏,题目是"说出一个和前一个人说的词搭配的词",但规则残忍地要求你们四个人同时写下答案,谁都看不到别人写的是什么。你写"苹果",隔壁写"手机",再隔壁写"树",最后拼起来的句子根本不成逻辑。这就是并行解码的代价:每个位置都按照自己手里的局部信息做出了"合理"的猜测,但这些猜测合在一起未必自洽。
论文把这个现象叫做token独立性瓶颈,意思是模型把联合概率简化成了各个位置概率的乘积,丢掉了位置之间本该存在的统计关联。在数独这种每一步都牵一发而动全身的任务里,这个丢失致命。
那连续扩散模型能不能解决这个问题?论文给出的答案是:能解决一半,但留了另一个坑。
**连续扩散的另一面:去噪时眼里没有"字"**
和离散扩散不一样,连续扩散语言模型*:这类模型不直接对离散的词进行加噪去噪,而是先把文字映射成一段连续的向量(可以理解成一组实数坐标),对这个连续的"潜在表示"做扩散去噪,最后再把去噪完的结果解码回文字。
这种方法的好处是,所有位置共享同一个连续状态,大家不再是各算各的,而是依赖同一个"全局草稿"。听起来正好弥补了前面说的问题,对吧?
可惜还有另一半坑没填上。这个连续状态在被一步步去噪的过程中,模型看到的只是一堆浮点数,它完全不知道这堆数字此刻对应着怎样的具体文字组合。换句话说,去噪的整个过程里,模型手里握着的是一张写满了草图的纸,但这张纸直到最后一步解码之前,从没真正变成一句话,它可能在中途偏离到任何一个方向,而没有任何机制去检查这个方向是否符合"这应该是一句通顺的中文"或者"这应该是一盘能解开的数独"。
这就像你在画一幅肖像画,整个绘画过程中你只盯着画布上的色块和线条调整,却从头到尾不去对照任何参考照片。画到最后,色块组合可能很和谐,但画出来的人脸可能五官完全不对称。你需要一个机制,让画布上的每一笔,都时刻和"这应该画成一张脸"这个具体目标保持联系。
论文指出,像之前的rounding和self-conditioning这类技巧,会把模型自己猜的字反馈回输入里,试图缓解这个问题,但这些猜测只是临时拿来用一下,并不是模型本身训练目标里正式承认的一个变量,相当于你偷偷瞟了一眼照片,但没有把这张照片真正纳入你的创作流程。
**HC-DLM:让"字"和"潜在状态"互相喊话**
论文提出的方法叫HC-DLM
HC-DLM*:全称Hierarchical Continuous Diffusion Language Models,中文可以理解为"层级式连续扩散语言模型",核心设计是把离散的字和连续的潜在状态绑定成一个两层的生成链条。
它的核心思路说起来并不复杂:既然离散扩散缺一个共享的全局状态,连续扩散缺一个和具体字对齐的锚点,那就把两者结合起来,让连续状态成为唯一贯穿始终的"主干",而离散的字每一步都从这个主干里被重新读出来,再反过来告诉主干下一步该往哪走。
具体来说,整个生成过程是这样的循环:模型先从一个充满噪声的连续潜在状态出发,用一个叫做去噪器的网络,根据当前的潜在状态和当前这一步猜的字,算出一个"干净潜在状态"的估计;接着用另一个叫做token预测器的网络,把这个干净的估计解码成具体的字;然后把这些字重新加上噪声,作为下一步去噪器的输入条件。
这里有个关键区别,字(论文里叫做token,也就是分词后的最小文字单位)在这套机制里没有自己独立的"记忆链条"。它每一步都是被潜在状态重新"读出来"的,不是从上一步的字直接继承而来的。这意味着任何一个位置的字,在生成过程的任何一步,都还有机会被改掉,而不是像传统扩散模型那样一旦解锁就定死了。
打个比方,这就像一个作家在写小说草稿,但他每写完一段就会立刻停下来,把这一段读出声来给自己听一遍(这是"读出字"的动作),然后根据听到的内容去修改脑子里对整个故事走向的构思(这是"反馈给潜在状态"的动作),再基于更新后的构思去修订刚才那段文字。如果不这样做,而是像传统写法那样写完一段就彻底定稿往后走,那遇到后面情节和前面设定冲突的时候,就只能硬着头皮将错就错,或者推翻重写整本书。HC-DLM相当于让"构思"和"文字"之间建立了一条持续对话的通道,构思指导文字,文字反过来修正构思,谁都不是孤立运作的。
论文用图1形象地展示了这个双轨机制:上面一条轨道是离散的字从干净状态一路被加噪到完全随机,下面一条轨道是连续的潜在状态同样经历从干净到随机的过程,但在"倒过来生成"的方向上,两条轨道紧紧缠绕,潜在状态的每一步更新都要看当前的字是什么,字的每一次读出也都依赖当前的潜在状态。
**这不是简单地把两条链拼在一起**
你可能会问,这跟"同时跑两个扩散模型,然后让它们互相看一眼"有什么区别?论文特意强调了这一点,强调自己和此前的一些"混合"方法有本质不同。
此前已经有一些工作尝试把离散和连续两种扩散结合,论文里提到的CADD和CCDD就是代表。CADD的做法是给每个字配一个连续的"提示",但这个提示本质上是模型早先预测结果的复制品,并没有自己的独立演化规则;CCDD则是让字和一串独立的嵌入向量各自保持一条完整的扩散链,两条链只是在网络内部共享一下中间计算结果,但各自依然"记得"自己上一步是什么样子。
这些方法本质上都是两条并列的、各自完整的生产线,中途互相递个条子。而HC-DLM是层级结构,连续状态是唯一真正拥有"记忆"的那条线,字完全没有自己的记忆链,每一步都是从连续状态里重新生成的。
这个区别听起来细微,但效果差异很大。论文的实验显示,去掉这种层级耦合,换成字自己有独立记忆的方案,在数独困难题上的准确率会从72.41%掉到70.73%(也就是CCDD的表现)。差距看起来不算夸张,但考虑到数独困难题本身就是训练数据里没见过的解题策略组合,这几个百分点代表的是模型泛化能力的真实差距。
**训练目标怎么来:一个变分下界撑起整套方法**
光有架构设计还不够,论文还要证明这套机制是一个"合法"的生成模型,而不是拍脑袋拼出来的工程技巧。为此,作者推导了一个变分下界
变分下界*:ELBO,这是训练生成模型(尤其是扩散模型、VAE这类模型)时常用的一种数学工具,因为真实的数据概率算不出来,所以构造一个可以计算的下界,只要把这个下界训练到足够大,真实概率也会跟着变大。
这个下界拆解开来,主要包含四块:第一块是"重构项",衡量从干净的潜在状态能不能准确解码回原始文字;第二块是"先验匹配项",确保潜在状态在扩散到最后一步时和一个标准的高斯分布对齐,这部分不含可训练参数;第三块是边界项,处理生成链条两端的衔接问题;第四块是最核心的"去噪步骤项",对每一个中间时间步同时产生两个信号,一个是关于字预测的监督信号,一个是关于连续潜在状态去噪的监督信号。
这里有个数学上挺巧妙的处理。作者发现,在每个中间步骤,离散的字和连续的状态的联合KL散度,可以用链式法则拆成两部分:一部分是单纯的字预测误差,一部分是在已知字的条件下的连续去噪误差。这个拆解意味着,训练时既不会漏掉"字要预测准"这个要求,也不会漏掉"潜在状态轨迹要走得对"这个要求,两者是同一个数学框架自然推出来的,不是硬拼上去的两个损失函数。
最终落地的训练损失包含三部分:重构损失(让干净潜在状态能解码回正确的字)、熵正则项(防止编码器变成一个确定性的映射,丢失必要的随机性)、以及连续去噪损失(用流匹配
流匹配*:Flow Matching,一种训练生成模型的技术,和传统扩散模型用噪声预测不同,它直接学习一个"速度场",告诉模型应该往哪个方向移动才能从随机噪声走到真实数据,通常采样效率更高。
来实现)。训练时每次只随机采一个时间步,用蒙特卡洛的方式估计整体损失,这是扩散模型训练里常见的工程简化。
**离散噪声到底该怎么加:遮盖还是打乱**
论文还做了一个很实际的对比实验,关于离散部分的"加噪方式"该怎么选。
常见的离散扩散有两种加噪策略。一种叫absorbing,也就是吸收态,把字逐渐替换成一个特殊的"遮罩"符号,有点像完形填空里的空白;另一种叫uniform,均匀态,把字替换成词表里随机抽取的另一个字,相当于把句子打乱成乱码而不是留白。
直觉上你可能觉得遮罩更合理,毕竟它明确标出了"这个位置还不知道是什么"。但论文的实验结果恰恰相反:在HC-DLM这套层级结构里,uniform噪声的表现明显优于absorbing噪声,在数独简单题上差了将近20个百分点(94.21% vs 75.59%,这是用了较优的"top-prob margin"调度策略之后absorbing能达到的最好成绩)。
为什么会这样?论文给出的解释是,在这套机制里,字的作用是给连续状态去噪过程提供一个"信息充足的脚手架"。如果用absorbing噪声,被遮住的位置就变成了一个空符号,这个空符号对连续状态的去噪过程没有任何实质帮助,相当于脚手架上缺了一截,撑不住上面的东西。而uniform噪声虽然每个位置的字可能是错的,但始终是一个具体的、完整的字,它仍然能给连续状态提供某种结构信息,哪怕这个信息是带噪声的。
这就好比你在装修房子前搭脚手架,absorbing方式相当于脚手架有些地方故意留空不装钢管,心想"反正这里以后会补上";uniform方式则是先用现成的旧钢管把脚手架搭满,哪怕有些钢管位置摆得不太对,之后再逐步换成合适的。实验证明后一种做法反而更稳,因为连续的去噪过程始终有东西可以"扶一把",不会凌空发力。
另外还有一个原因,absorbing噪声通常搭配"自信度排序"的解码策略,模型会优先把自己最确定的位置先填上,填上之后这个位置就不会再改了。但论文指出,这种"先填先定"的策略在约束密集的任务里很危险,一旦某个早期填错的位置被当成了"高置信度"而提前锁死,后面所有依赖它的位置都会跟着错。而uniform噪声配合的是"每一步整体重新读取"的策略,相当于每一步都给了模型一次重新审视全局、修正错误的机会。
**三个战场的实测成绩**
说了这么多设计原理,实际效果怎么样?论文选了三个很有代表性的测试场景。
第一个是数独,前面已经提过,HC-DLM在困难题上拿到72.41%的准确率,超过了参数规模相近的其他扩散模型方案,也超过了42M参数的自回归模型(87.18%简单题 vs 它在困难题上32.57%的表现,困难题差距尤其明显)。
第二个是Countdown,一个类似"24点"游戏的数学推理任务,给定几个数字和一个目标值,要求用加减乘除拼出等于目标值的算式。这个任务对"规划能力"要求很高,因为中间步骤选错了,后面全盘推翻。在五个数字的更难版本(CD5)上,HC-DLM达到37.52%的准确率,而参数规模相当的CCDD只有25.35%,差了超过12个百分点。有意思的是,论文还提到一个现象,很多扩散模型在这个任务上表现超过了参数量大得多的自回归模型,哪怕是130亿参数的LLaMA在CD5上也只有7.4%的准确率。这说明"任意顺序解码"这个能力,在需要灵活规划的任务里,有时候比单纯堆参数更管用。
第三个是LM1B,一个通用的语言建模基准测试,用来衡量模型写出的句子有多"像人话"。这里用的指标叫生成式困惑度
生成式困惑度*:Gen. PPL,用另一个独立的、更权威的语言模型(这里用的是GPT-2-Large)去给生成的文本打分,分数越低说明生成的文本越流畅、越符合自然语言的统计规律。
HC-DLM在这项测试里拿到75.5分,比参数相近的离散扩散模型MDM(103.9分)、SEDD(115.9分)都好很多,也比两个连续扩散模型Plaid(77.3分)和LangFlow(92.2分)更优。真实人类写的文本(Ground truth)的困惑度是40.4分,作为对照的自回归Transformer是66.7分,HC-DLM离人类水平和主流自回归模型都更近了一步,而且是在不依赖自回归生成方式的前提下做到的。
**拆开来看,两条腿缺一不可**
光看综合成绩可能还说明不了问题,所以论文专门做了"拆解实验",把HC-DLM的两个核心部件分别拿掉,看看各自单独的贡献有多大。
拿掉"字反馈"这一环,只保留连续潜在状态的扩散过程,相当于一个标准的连续潜在扩散模型,字只在最后一步才被解码出来。这个版本在数独简单题上的准确率直接从94.21%掉到50.46%,困难题上从72.41%掉到24.74%,几乎是腰斩再腰斩。
拿掉连续潜在状态,只保留纯粹的离散扩散链条,这就是前面提到的MDM,困难题上最好的成绩是49.88%。
这两个对照实验说明一件事:潜在状态提供全局视野,字提供精确的局部约束,这两者谁也替代不了谁。只有连续状态会导致"过度平滑",模型在抽象层面想明白了大致方向,但具体到每个格子该填几这种硬性约束却守不住;只有离散的字会导致各算各的老毛病,缺乏统一的全局协调。
**生成过程中信息是怎么"结晶"出来的**
论文还做了一个很直观的分析,观察生成过程中模型的"信心"是怎么随时间变化的。具体做法是,在每一步生成过程中,把当前模型对"干净状态"的估计提前解码出来,看看这时候的准确率是多少。
结果显示,HC-DLM的准确率曲线在生成过程早期就迅速爬升,而且最终达到的平台期明显更高;相比之下,去掉字反馈的纯连续模型,曲线爬升得慢,而且最终平台期低得多。论文把这个解读为,字作为脚手架让连续去噪过程"更早锁定结构性约束",打个比方,这就像拼乐高积木,如果你先把底座和主要骨架搭好(这是"锁定结构约束"),后面添加细节零件就会很顺畊;但如果你一开始东拼西凑、没有骨架概念,到最后往往发现各个零件根本拼不到一起,得推翻重来。
这个发现还带来一个额外的好处:步数更少的时候,HC-DLM依然保持较高准确率,而纯离散的MDM在步数减少时准确率下滑得更明显。这意味着HC-DLM不需要靠"反复迭代修修补补"来弥补自己结构上的缺陷,它天生就把更多信息锁定得更早,所以步数砍半也不至于崩盘。
**这篇论文还留下了什么没解决**
论文自己也承认,HC-DLM在训练阶段要同时优化编码器、连续去噪器、字预测器三个网络,这比单纯训练一个离散扩散模型要费力得多。好消息是这个额外开销只发生在训练阶段,推理阶段编码器直接扔掉不用,实测下来HC-DLM的推理速度反而比对照的MDM更快。
另外,论文目前的实验规模是中等的,数独、Countdown这类任务可以被精确验证对错,适合在有限计算预算下做严谨对比,但距离在超大规模预训练模型上验证这套思路,还有一段距离要走。
写在后面
读完这篇论文,让我印象最深的其实不是HC-DLM本身的架构设计,而是那个"uniform噪声反而比absorbing噪声更好"的反直觉实验结果。
这个结果值得多想一层。遮罩(absorbing)这种做法,本质上是在模仿人类做填空题的方式,看到空白,去填空白。而均匀替换(uniform)更像是先给你一份写满了错误答案的草稿,让你去逐步纠正。直觉上前者更"干净",后者更"混乱"。但在这套层级耦合的框架里,混乱反而成了优势,因为混乱里至少还有"具体的内容"可以依附,而干净的空白是真的什么都没有。
这让我想到一个更普遍的问题:我们在设计任何需要"迭代修正"的系统时,是不是总是本能地偏向"干净的起点",而低估了"带着错误信息的满编起点"的价值?从数独任务反推回去,这个问题其实也适用于很多协作场景,比如团队写报告的时候,一份充满错误但结构完整的初稿,有时候比一张完全空白的纸更容易被改好,因为空白没有给任何人提供"下笔"的锚点。
论文最后留的一个开放问题也挺值得琢磨:这套方法目前只用了一个连续潜在token(M=1),但附录里的消融实验显示,适当增加潜在token数量到4个的时候,困难题准确率还能从55.81%提升到71.11%,但再往上加到8个、16个,效果反而下降。这个"倒U形"曲线背后,到底是训练数据量不够撑起更大的潜在空间,还是潜在维度和任务复杂度之间存在某种更微妙的匹配关系?论文没有深挖,这倒是留给后来者的一个有意思的坑。
Q&A
Q1:HC-DLM是什么?
A:HC-DLM全称是Hierarchical Continuous Diffusion Language Models,一种把离散文字生成和连续潜在状态扩散结合起来的语言模型框架,核心是让连续潜在状态作为唯一持续演化的主干,文字每一步都从这个主干里重新读出并反馈回去,解决了传统离散扩散模型"并行解码时各位置互不知道对方猜了什么"的问题。
Q2:HC-DLM相比传统的离散扩散语言模型有什么优势?
A:在数独困难题上准确率达到72.41%,明显超过纯离散扩散模型MDM的49.88%;在数学规划任务Countdown的更难版本上达到37.52%,远超参数相近的混合模型CCDD的25.35%;在LM1B语言建模任务上生成式困惑度为75.5,优于多个离散和连续扩散基线模型。
Q3:为什么HC-DLM用均匀噪声而不是遮罩噪声效果更好?
A:论文实验发现,遮罩噪声会让字的位置变成空白符号,无法为连续潜在状态的去噪过程提供有效的结构信息,而均匀噪声替换成的字虽然可能是错的,但始终是具体内容,能给去噪过程提供可依附的脚手架,数独简单题上准确率因此相差近20个百分点。
热门跟贴