测时对近期文本做梯度下降,WikiText-2 困惑度从 66.1 到 44.3

2026-08-25

爱丁堡团队把测时梯度下降做成一套可复用方法:在近期文本上微调参数,AWD-LSTM 的 WikiText-2 困惑度从 66.1 掉到 44.3,胜过 neural cache 的 52.0。

这篇在解决什么

RNN 语言模型有个很具体的盲区:一个词刚在文档里出现过,很快再出现一次的概率明明很高,隐状态却经常用不上这条线索。Grave 等人给 RNN 加一个最简单的 unigram cache,困惑度就会降,等于当面指出模型没学会「刚见过的东西更可能再来」。

Pointer network、copy net、neural cache 能处理直接重复,同一个符号再出现一次。同义词、相关词、话题和文风这类间接重复,它们够不着。neural cache 把过去的隐状态和下一个词存成键值对,新隐状态用近邻方式抬高已经见过的词的概率;循环层的动态它改不了,没见过的符号它也抬不起来。字符级语言模型里单个字符几乎没有独立语义,这个问题更硬。

训练学到的是全局分布,测试时每一段文本来自一个在漂的局部分布。文档换话题、基准把许多文档拼成一条长序列,局部分布一直在变。静态参数对全局最优,对当下这一段不是。

方法

Dynamic evaluation(动态评估)的做法很直接:测试时拿刚评过的那段文本做一步梯度下降,用更新后的参数去评下一段。

这仍然是合法的自回归对数概率,更新只用已经评过的 token。计算量是一遍前向加一遍反传,外加每次更新本身的开销。

Mikolov 2010 和 Graves 2013 已经用过这个点子,当时每步都更新、用普通 SGD,结果时好时坏。这篇把更新规则收成一套能反复打赢的配方。片段拉长,梯度更准,更新次数也少。每次更新后把参数往全局参数拉一把,旧适应指数衰减,更信最近的历史;局部分布本来就在漂,这是对的。学习率按 RMSprop 的方式按参数缩放,均方梯度在训练集上预先攒好,不在测试序列上现估,因为测试开头梯度太少、现估不稳。衰减率也按 RMS 归一化来调,梯度大的参数衰减更快。

学习率要在验证集上扫。过去结果混乱,主因是测时超参直接沿用训练时的设置。Sprechmann 等人后来也这么做过,几乎没涨点。学习率是最敏感的一项。

还有一个稀疏变体:不改原网络权重,另加一个初始化为零的适应矩阵 M,让隐状态变成 h + Mh,还可以只作用在一部分隐单元上。Hutter Prize 上只用 500×500=25 万个适应参数,约占全量适应参数的 0.5%。

结果

基座是当时的公开 SOTA:词级用 AWD-LSTM,字符级用 2800 隐单元的 mLSTM。动态评估的超参在验证集上调,静态和动态两套数字都在测试集上报告。

设置PTB 困惑度WikiText-2 困惑度
AWD-LSTM 静态(复现)57.766.1
AWD-LSTM + neural cache52.852.0
传统动态评估(SGD,逐步更新)53.549.0
最终动态评估(RMS + RMS 先验)51.144.3

WikiText-2 的降幅最大。文档按原顺序排、词表 3.3 万、跨文档依赖正好是适应方法该吃的。PTB 上传统动态评估已经能到 53.5,每改一项再抠一点,最终 51.1。text8 词级上静态 87.5、neural cache 75.1、动态评估 70.3,更大语料上优势还在。

字符级同样。Hutter Prize 上 mLSTM 静态 1.24 bits/char,稀疏动态评估 1.13,全量 1.08;text8 字符级从 1.27 降到 1.19。几百个字符之后优势就出来。Hutter 上优势在看过大约 2000 到 3000 个字符时最大,说明适应是局部的,不是把整个测试集拟合成一套新参数。换成西班牙语欧议会语料(Hutter 训练数据几乎没西语),优势会一直涨。看完 1 万西语字符再条件采样:静态模型很快切回类维基百科英语,动态模型整段都在产带西语形态的词。

间接重复也吃得到。WikiText-2 测试集里对 production 做一次更新后,这个词本身的 log 概率 +2.42,construction +1.29,recording +1.27,development +1.14;全词表中位数是 −0.66。相关词被抬高,无关词被压下去。

为什么重要

这是测时适应,不是新架构。基座不动,测试时对近期历史做梯度下降。2018 年它把当时词级和字符级语言模型的公开数字都刷了一遍,而且稳定地胜过只能回放已见符号的 neural cache。

今天还能用的部分是操作,不是那几个 LSTM 数字。只要任务是自回归的,测时用近期上下文改参数,比加一个 cache 更能泛化到近义词和文风。稀疏版把适应参数压到 25 万,给「每条序列一套参数」的批量推理留了口子。Transformer 的 KV cache 记住的是激活,动态评估改的是权重;两条路现在都还在,只是换了 test-time training、内循环适应这类名字。

局限与存疑

边界是作者自己划的:只适用于自回归序列建模,必须在预测之后看到真值才能更新。批量推理时每条序列要存一套参数,显存会爆,稀疏版是为这个准备的。计算上多一次反传。片段长度、学习率、衰减率都要在验证集上调,测时不是零超参;学习率调错,「几乎没涨」就会重演。

实验全是 LSTM 和 mLSTM,没有 Transformer,也没有指令微调模型。WikiText-2 文档不打乱,涨幅有多少来自「文档顺序可被利用」,论文没拆开。Hutter Prize 含 XML 和非拉丁字符,1.08 bits/char 不好直接跟纯英语压缩数字比。production 那组相关词是单点案例,不是系统评测;西语条件采样放在附录,没有自动指标。对语音识别和机器翻译有用,这篇里没有做。

术语

原文与代码

社区讨论

全部论文解读