对比式语言模型:换一套训练目标会得到什么
Hacker News 上一个关于对比式语言模型的链接引发小范围讨论。这类模型以样本之间的距离作为学习信号,本文梳理它的做法、代价与适用场景。
一个链接引出的题目
Hacker News 上出现了一个标题为 Contrastive Language Models 的条目,链接指向 Notion 上的一个页面,发布后获得 66 分和十几条评论。分数和讨论量都算不上爆款,但它指向的训练思路,和大多数人日常接触的语言模型并不在同一条线上。
我们熟悉的大模型,学习信号来自序列本身:给定前文,预测下一个词。对比式语言模型换了一套目标,它看的是样本之间的关系——把语义相近的两段文本拉近,把不相干的推远,中间隔开一段距离。模型学到的因此是一个可以比较的空间:取一段文本得到一个向量,向量之间的距离对应语义上的远近。
这套做法从哪来
图像领域早有先例。SimCLR 用同一张图的不同增强版本互为正例,CLIP 把图片和它的文字描述对齐,都靠“配对与不配对”来训练。搬到语言上,SimCSE 是常被引用的例子:把同一句话喂给带 dropout 的编码器两次,得到两个略有差异的向量当成正例,同一个 batch 里的其他句子当负例。损失函数通常写成 InfoNCE 的形式,温度参数控制分布的尖锐程度。
负例从哪里来,几乎决定了成败。batch 内的其他样本是默认选择,但 batch size 受显存限制;更大规模的负例池往往要维护队列,或者借助动量编码器产生稳定的目标表示。更难处理的是假负例:两个句子语义相近,却被当作负例推开,训练信号就被污染了。因此实践中常加入难负例挖掘,先用检索粗筛出与正例接近但不相同的句子,再让模型去区分它们。
换来了什么,又付出什么
用下一词预测训练出的表示,在句子级任务上表现未必好。有研究观察到表示空间存在各向异性,向量挤在一个狭窄的锥形区域里,余弦相似度区分度下降。对比目标直接优化距离关系,在语义相似度、聚类、检索这类任务上往往更占优势。文本去重、语义搜索、向量数据库的召回排序,都是它落地的地方。检索增强生成也是买家之一:在生成模型动笔之前,先由对比式编码器决定该取回哪些材料。
代价同样清楚。对比训练对超参敏感,温度、负例数量、两个分支是否共享权重,改动都会反映到结果上。评测也不轻松,常用的语义相似度基准本身带有标注噪声,公开榜单上的高分不一定对应线上可用性。
讨论留下的东西
十几条评论说明这个话题仍在偏技术的圈子里流传,没有变成主流训练配方的一部分。大规模预训练依然跑在下一词预测上,对比学习更多出现在后面的环节,作为微调步骤,或者一个独立编码器挂在大系统旁边。
这种分工或许就是当下的真实状态。生成式目标擅长把文字写出来,对比式目标擅长把文字放进一个能比较的位置。越来越多的团队在串联两者:预训练用生成式,微调用对比式,或者在一个生成式阅读器前面保留一个对比式检索器。