逐点预测,再把预测喂回输入:LSTM 自回归生成的奠基样本

Generating Sequences With Recurrent Neural Networks

Alex Graves

cs.NE, cs.CL

2013-08-05

用 LSTM 逐点预测序列、再把采样结果喂回输入做自回归生成,在维基百科压到 1.33 BPC,并写出盲测难辨真伪的手写体。

这篇在解决什么

2013 年的序列生成还停在统计计数上。n-gram 数最近的字符组合在训练集里出现过几次,据此猜下一个;压缩算法如 PPM 干的也是数精确匹配。这类方法的通病是「精确匹配」:只要训练集里没出现过完全一样的近期片段就抓瞎,而且维度爆炸。RNN 理论上能学模糊的、插值式的预测,但普通 RNN 有个致命弱点:记不住太久之前的事,梯度一传就消失,让它去生成长序列就会漂移、崩坏。

Graves 要解决两件事。第一,怎么用 RNN 真正生成有长程结构、能连贯上千步的复杂序列,而不只是预测。第二,一个更难的具体问题:手写体合成。给一句话,让模型写出这句话的手写体,难点在于文字和笔迹的时间对齐是未知的。同一个字母,有人三笔写完,有人一笔连下来,模型得自己学会「现在写到第几个字了」。

方法

核心思路一句话能讲完:逐点预测,再把模型自己的预测采样后喂回当下一步的输入。网络处理真实序列时,每一步预测下一个数据点的分布;生成时从分布里采样,把采样结果当作下一步输入再喂进去,如此循环。Graves 自己的类比是「像人在做梦」,模型把臆想当成真实。这就是自回归生成(autoregressive generation)。

骨架是堆叠的多层 LSTM,加上 skip connection:输入直连所有隐藏层,所有隐藏层直连输出,目的是缩短梯度路径、压住梯度消失。输出分布按数据类型选:离散的文本用 softmax 给出字符级多项分布,刻意用字符而非词,换取最大生成灵活性;连续的手写坐标用混合密度网络(Mixture Density Network),一组二维高斯分布的混合去预测笔尖的 (x, y) 偏移,另用伯努利分布预测这一笔是否抬笔。混合分布的分量数,就是网络对「下一个点有几种走法」的判断。

手写体合成的关键创新是软窗口(soft window)对齐机制。文本是一串字符,笔迹是一串坐标,两者长度天差地别且没有现成对齐。Graves 用一组高斯函数在字符序列上滑动卷积,网络每一步输出窗口的位置 κ、宽度 β 和权重 α,自己决定现在对准哪个字。一个精妙的设计:位置 κ 被定义成相对上一步的、恒为正的偏移量,即网络学的是「每步滑多远」而非「绝对位置」。论文明确说,不用偏移、用绝对位置,模型根本学不会对齐。

生成阶段还有两个控制旋钮,今天看来格外眼熟。一是偏向采样(biased sampling):故意压低高斯分量的方差,让采样更偏向高概率的笔迹,字就变得更工整易读,偏向拉满时退化成一种极度规整的「平均字迹」,相当于采样温度。二是引子采样(priming):先用某位真实书写者的笔迹打底,再继续生成,产出的就是模仿那个人风格的字。温度调节和条件生成的雏形,这里都有了。

结果

文本预测上,在 Penn Treebank 加自适应权重噪声并开动态评估后,字符级做到 1.24 BPC、122 困惑度,词级 1.23 BPC、117 困惑度。对照里,Mikolov 论文记录的 5-gram KN 平滑是 141 困惑度,PAQ8 压缩 131.1,动态评估的词级 RNN 123.2。词级网络参数多得多,作者自己承认这个对比不完全公平;而把多个 RNN、5-gram 和 cache 模型集成能做到 89.4,单模型比不了。

任务设置结果对照
Penn Treebank 字符级自适应权重噪声+动态评估1.24 BPC / 122 困惑度5-gram KN 141
Penn Treebank 词级同上1.23 BPC / 117 困惑度动态词级 RNN 123.2
维基百科(Hutter 奖数据)七层 LSTM+动态评估1.33 BPCPAQ-8 变体 1.28(含代码)
手写合成自适应权重噪声对数损失 -1128.2 nats,SSE 0.23纯预测网络 SSE 0.41,降 44%

更亮眼的是维基百科。在 Hutter 奖那 1 亿字节英文维基数据上,七层 700 单元 LSTM(约 2130 万参数)动态评估拿到 1.33 BPC,静态 1.67;当时拿奖的 PAQ-8 变体连同算法代码算在内是 1.28 BPC,主流 zip 类压缩普遍超过 2。纯神经网络模型由此逼近了专用压缩算法,只差最后一点。生成的四页样本里,网络学会了真词和子词模型,能造出 Lochroom River、submandration 这种看着像英语的生造词;能正确闭合括号和引号,甚至嵌套 XML 标签,还能生成西里尔字母、中文和阿拉伯文,而这一切跨越的是上千个时间步的长程结构。

手写体部分,合成网络加自适应权重噪声后对数损失 -1128.2 nats,比无正则的 -1096.9 改善约 31 nats;关键是知道要写什么之后,均方误差比纯预测网络降了 44%(0.23 对 0.41)。作者在公开演示时做的盲测里,至少有一部分无偏样本肉眼已分不出真假。

为什么重要

这篇是自回归神经生成的奠基样本。今天所有大模型生成文本、写代码、逐 token 吐答案,底层都是同一个配方:预测下一个点,喂回去,再预测。混合密度网络处理连续输出、软窗口学对齐这两个设计,后来分别长成了连续输出建模和注意力机制的源头。偏向采样和引子采样,则是温度调节与条件生成的最早形态。对从业者而言,它的价值不在能直接拿来跑(架构早已被超越),而在把「生成就是逐点自回归、模型把自己当训练数据」这件事讲得最清楚、demo 最直观。手写体那段一度是神经网络能生成连贯长程结构的最广为传播的证据。

局限与存疑

作者自己把话说得很透。生成的文本在短句之外没有意义,他直言指望一台从未接触过语言所指的感官世界的机器产生有意义的语言是徒劳的,这句几乎预言了后来多模态、具身语言学习的方向。手写体会犯人不会犯的错:漏字、混淆、字母糊成一团,生僻字尤其严重,因为隐式字符级语言模型对低频词很弱。评测上,手写没有独立测试集,所有结果记在验证集上,作者承认可能对验证集有所过拟合。合成实验还把数字和大部分标点统一当成「非字母」标签,作者自己标注为疏忽。词级对字符级的 PTB 对比也因参数量不对等而不完全公平。此外所有数字都是 2013 年的单模型成绩,放今天只具历史对照意义。

术语

原文与代码

社区讨论

相关论文

全部论文解读