今天研读 Bengio 的《A Neural Probabilistic Language Model》
一句话概括:本文提出通过联合学习词的分布式表征与基于神经网络的概率函数来应对维数灾难,利用词的相似性使未见序列获得合理概率并有效利用更长上下文,实验表明其建模表现相较于传统 n-gram 模型有显著提升。
1. 引言
离散随机变量建模的非参数密度估计思想
作者指出,语言建模与其他机器学习问题面临的根本困难是“维数灾难”。当尝试建模多个离散随机变量(例如句子中的词,或数据挖掘任务中的离散属性)之间的联合分布时,这一问题尤为明显。例如,如果对词表大小为 V = 100, 000 的自然语言中连续 10 个词的联合分布进行建模,潜在的自由参数数量可达到 1050 - 1 。
在建模连续变量时,我们更容易获得泛化能力(例如使用多层神经网络或高斯混合模型等光滑函数族)。这是因为待学习的函数通常可预期具备局部光滑性。而在离散空间中,泛化结构并不显见。离散变量的任何改变,都可能对待估计函数的值产生剧烈影响。当每个离散变量可取的值数量很大时,绝大多数被观测到的对象在汉明距离上几乎都处于最大距离。
注:
汉明距离是衡量两个等长字符串对应位置不同字符个数的度量。
简单来说,作者要表达的意思是,在离散符号空间下,样本之间缺乏连续过渡的相似度度量(几乎所有样本彼此之间都“最大程度地远离”),模型就无法像在连续空间中那样利用几何邻近性进行外推。这就是离散变量在原始空间中难以泛化、导致维数灾难的几何根源。
借鉴非参数密度估计的思想,我们获得了一种观察不同学习算法泛化过程的视角:思考最初集中在训练点(如训练句子)上的概率质量(probability mass),是如何扩散分布到更大体积的区域中(通常是在训练点周围的某种邻域形式内)。在高维空间中,至关重要的原则是将概率质量分配到 “真正重要的地方” ,而不是沿着训练点周围的所有方向进行均匀扩散。于是,作者在此引出全文论点,指出本文所提出的方法在泛化机制上,与此前 SOTA 统计语言建模方法有着根本性的不同。
注:
非参数密度估计:在统计学中,当不知道总体遵循何种解析分布时,通常会在每一个实际观测到的训练样本点上放置一个核函数(如高斯核),将离散的观测点平滑为一个连续的概率密度分布。
“概率质量的扩散”:
在训练阶段,数据集中出现的样本获得了所有已知的经验计数(即概率质量最初完全聚集在见过的训练句子上)。
如果模型不做任何扩散,模型就只能预测训练集中出现过的句子,任何新句子获得的概率都为 0,这代表没有泛化能力。
为了对未见过的句子进行预测,模型必须把集中在训练样本点上的“概率质量”,合理地外推或扩散到训练点周边的区域中。
“真正重要的地方”:
在高维状态空间中,如果模型像普通的各向同性高斯核一样,在训练点周围的所有方向上均匀扩散概率质量,概率密度会迅速被巨大维度的体积稀释,同时大部分概率质量会被浪费在语法不通、语义荒谬的垃圾序列上。
“真正重要的地方” 指的是具有合法语义和语法结构的序列空间。例如:训练集观察到了 “The cat walks in the room” ,合理的扩散方向应该是赋予 “The dog walks in the room” 较高的概率,而不是在所有随机词组合的方向上均摊概率。
与“学习算法泛化能力”的关系:
学习算法的泛化实质上就是概率质量的分配策略。
传统 n-gram 模型通过截断历史长度来分配概率(在短重叠序列上扩散)。
本文提出的神经网络模型则是将离散词映射到低维连续空间,通过词向量之间的相似度,使概率质量定向沿着“语义邻近”的方向扩散,从而使未见序列获得合理的概率估计。
统计语言模型的建模
统计语言模型可以通过“给定此前所有词时下一个词的条件概率”来表示。基于概率的链式法则,整个序列的联合概率写为:

其中,wt 代表序列中的第 t 个词,wij 表示一个子序列:

上述统计语言模型在许多涉及自然语言的实际技术中被广泛应用,例如语音识别、语言翻译和信息检索。统计语言模型的性能改善,能够对上述应用领域产生重要影响。
事实上,构建自然语言统计模型时,作者指出可以通过利用以下两个事实来显著降低建模难度:
词序信息;
位置上的局部依赖性:词序列中在位置上更为临近的词,在统计上存在更强的依赖关系。
基于上述性质,传统 n-gram 模型出现了。它针对由前 n-1 个词组合构成的海量上下文,分别构建下一个词的条件概率表。模型将基于完整历史的条件概率近似截断为仅依赖最近的 n-1 个词:

传统 n-gram 模型的问题与本文的改进方案
n-gram 模型虽然依据马尔可夫假设大幅减少了建模过程的计算开销,但是却存在如下问题:
零概率问题:实际建模中只能统计训练语料中真实出现或出现频率足够高的词组合。当遇到未曾出现过的 n 元组时,模型不能直接赋予其 0 概率,因为新组合在实际语言中必然会出现,且随着上下文窗口增大,未见组合出现的频率还会更高。
回退与插值平滑:传统模型的应对策略是参考更小上下文下的预测概率,例如回退三元模型、平滑/插值三元模型。
泛化的物理本质(拼接机制):
若从生成模型的角度来理解回退或插值 n-gram,新词序列的生成本质上是通过“拼接”训练数据中高频见过的、长度为 1、2 到 n 个词的极短重叠片段来实现的。
实践中研究者通常取 n = 3 来取得当时的基准性能。但作者指出,待预测词前面的序列所包含的信息,显然远多于仅仅前一两个词的身份标记。
作者于是指出了本文聚焦改进的两个关键缺陷:
无法利用较长上下文:无法考虑距离当前位置超过 1 到 2 个词之外的上下文信息。
忽略了词与词之间的相似性:
例如在语料库中观察到了句子 “The cat is walking in the bedroom”,模型理应能够泛化并赋予句子 “A dog was running in a room” 几乎相近的概率。
原因:dog 与 cat、the 与 a、room 与 bedroom 在语义角色和语法功能上高度相似,但传统离散符号表示无法利用这种相似关系。
针对上述两个缺陷,作者给出了本研究的主要工作:
核心方案:使用共享参数的多层神经网络来形式化实现结合词相似度与长上下文的基本思想。
工程与计算贡献:解决在大规模数据集(包含数百万至数千万样本)上训练具有数百万参数的大型神经网络所带来的计算挑战。
可行性与效果验证:在后文证明,训练此类大规模模型虽然计算成本高,但完全可行,能够扩展到更长的上下文环境,并取得优良的对比实验结果。
下表介绍了后续使用的符号规范:

2. 方法论
2.1 核心方法概述
作者将本文方法的基本思路概括为三步:
构建分布式特征向量:为词表中的每一个词关联一个分布式词特征向量(即 m 维实数向量 ℝm )。
基于特征向量表达联合概率:用序列中各个词的特征向量来表达词序列的联合概率函数。
联合学习:同时学习词特征向量以及该概率函数的参数。
其中,特征向量代表词的不同侧面,每个词对应向量空间中的一个点。特征维度 m(实验中取 30、60 或 100)远小于词表规模(实验中词表规模约为 17,000);概率函数表达为给定前文预测下一个词的条件概率连乘积(实验中采用多层神经网络来实现)。模型的参数通过迭代优化进行调整,优化目标是最大化训练数据的对数似然,或采用带正则化的准则。
词特征向量是随模型共同学习得到的,但也可以利用先验语义特征进行初始化。
为什么这一套方法能够具备更好的泛化性呢?可以通过下例来展示:
若已知词对之间在语法与语义上扮演相似角色——如 (dog, cat)、(the, a)、(bedroom, room)、(is, was)、(running, walking),当训练集中只出现过句子:

模型应当能够自然地将概率质量转移给形式未见但语义相近的句子,例如:

模型内部的数学传导机制:
相似词具有相似的特征向量:在训练优化过程中,语义和语法角色相似的词会被映射到欧氏空间中距离相近的位置。
概率函数的光滑性:神经网络构建的条件概率函数是输入特征值的光滑函数。特征向量的微小变动,只会引起输出概率的较小变动。
组合级维度的邻域扩散: 由于上述性质,训练数据中哪怕仅存在上述句子中的某一个,不仅会提升该句子本身的概率,还会同步提升其在句子空间中由特征向量组合而成的、呈组合数级别的“邻近句子”的概率。
2.2 神经网络语言模型的建模
建模目标、评估指标与数学约束
给定有限词表 V 下的文本序列 w1 ··· wT ,目标是学习一个条件概率模型:

采用困惑度作为评估指标,其定义为条件概率倒数

的几何平均数,在数学上等价于平均负对数似然的指数形式。此外,模型输出必须严格满足概率公理约束,即对于任意历史序列 w1t−1 ,均有 f > 0 且词表上的概率和为 1 :

通过各步条件概率的连乘,即可得到词序列的联合概率模型。
映射分解与网络前向计算

作者将条件概率函数 f 分解为两项映射的复合:
词特征映射矩阵 C :将词表中任意词 i ∈ V 映射为一个实值特征向量 C(i) ∈ ℝm 。C 是一个维度为 |V| * m 的自由参数矩阵,第 i 行即为词 i 的特征向量,且在上下文的所有词之间共享。
概率函数 g :将上下文输入词的特征向量序列映射为词表 V 上的条件概率分布。
前向计算过程:将前 n - 1 个上下文词的特征向量按位置先后顺序拼接为长向量 x :

除词特征映射层外,网络包含一个常规的双曲正切(tanh)隐藏层,以及可选的从词特征层到输出层的直接连接(直连通路)。特征层 C 内部不设非线性激活,因为作者指出此处加入非线性并无额外增益。因此,未归一化对数概率可表示为:

参数含义:

最后,通过 Softmax 函数将 y 转化为归一化概率分布,保证输出严格为正且和为 1:

参数集合与规模复杂度分析
模型待学习的参数记作 θ = (b, d, W, U, H, C) 。自由参数总数为:

可见,该模型的参数量仅随词表规模 |V| 和上下文阶数 n 呈线性增长。作者同时指出,如果进一步引入时延神经网络(TDNN)或循环神经网络(RNN)等参数共享机制,对 n 的扩展因子还可以降低至亚线性。
优化目标与训练机制
目标函数:采用带惩罚项的对数似然函数进行最大化训练:

正则化设定:
R(θ) 采用权重衰减惩罚,仅施加在神经网络的权重矩阵(W, U, H)与词表矩阵 C 上,不对各层偏置向量(b, d)施加惩罚。
作者补充说明:理论上如果对权重 W 和 H 施加衰减而不对 C 施加,可能引发 W 与 H 趋于 0 而 C 趋于无穷大的数值发散;但在实际采用随机梯度上升训练时,并未观察到该现象。
随机梯度上升更新: 每输入一个训练样本词,参数按下式进行迭代更新:

其中 ε 为学习率。
稀疏访问与更新特性:在每次样本迭代中,大部分参数并不需要被计算或更新——即所有未出现在当前上下文输入窗口中的词 j ,其对应的特征向量 C(j) 均保持不变,仅需对窗口内出现的 n-1 个词向量进行梯度更新。
模型融合策略
作者尝试将神经网络输出的条件概率与插值三元模型输出的条件概率进行线性组合(加权混合)。在实验中发现,这种组合方式带来了模型性能的进一步提升。
作者在实验中测试了三种确定组合权重的方法:
简单固定权重:
采用固定的权重系数 0.5(即对两者的概率预测直接取算术平均)。
基于验证集学习权重:
在验证集上,通过极大似然准则优化学习出一个统一的混合权重参数。
基于上下文频数的条件权重:
依据上下文(前文词序列)在语料中出现的频数,动态分配一组权重。
该方法直接复用了传统插值三元模型在融合三元、二元和一元概率时所使用的相同算法机制。
作者的归因分析:
互补性:传统插值三元模型基于具体的 n-gram 频数统计,对训练集中高频出现的局部模式具有直接的记忆能力;而神经网络语言模型则更擅长利用低维连续空间的平滑性对低频或未见组合进行泛化。
低成本提升:这种在概率输出层面的加权混合不改变各模型原有的结构,是一种在推理阶段结合二者优势的实用策略。
3. 并行处理机制
神经网络语言模型的计算瓶颈来源
尽管神经网络语言模型参数量呈线性增长,但计算输出概率所需的实际计算量,远大于传统的 n-gram 模型:
传统 n-gram 的计算特点:
在获取特定词的条件概率时,并不需要计算词表中所有其他词的概率。
这是因为传统模型基于相对频率的线性组合,其归一化过程在模型训练阶段就已经简单完成(只需通过查找对应的计数值与分母频数进行除法运算即可)。
神经网络的核心瓶颈:
神经网络的主要计算瓶颈集中在输出层激活值的计算。
根据前一节的 Softmax 公式,即便只需要评估某一个词的概率,分母的求和项依然强制要求模型必须先算出词表中全部 |V| 个词对应的输出激活值。
为降低训练和测试阶段的计算耗时,作者采用了在并行计算机上运行模型的方案,并具体探索了两种硬件平台的并行化:
共享内存多处理器机器;
连接高速网络的 Linux 集群。
在共享内存机器上实现数据并行
数据并行架构与初始同步方案
实现基础:在共享内存架构中,各处理器之间通过共享内存区域通信,通信开销较低,因而并行化相对容易搭建。
数据并行划分:每个处理器分别负责处理不同的训练数据子集,各自计算样本梯度,并将更新应用到统一存放在共享内存中的模型参数上。
加锁同步的瓶颈:作者最初的实现采用了同步指令,确保多个处理器不会同时向相同的参数子集执行写入操作。但该方案运行效率很低,原因在于各处理器的大部分计算周期都消耗在等待其他处理器释放写入锁上。
异步无锁更新机制及其影响
异步写入策略:为消除等待锁带来的耗时,作者转而采用了异步更新实现,允许各个处理器在任何时间直接向共享内存区域写入参数。
参数覆盖与噪声:
在异步模式下,某个处理器对参数矢量的部分更新可能会被其他处理器的更新所覆盖,从而造成更新丢失。
这种覆盖会向参数更新中引入少量噪声。
实际影响评估:实验观察表明,这类由覆盖产生的噪声很小,并未对模型的训练收敛速度造成明显的负面影响。
硬件平台的局限性与转向
共享内存机器的缺陷:大型共享内存并行设备成本高昂,且其处理器的单核运行速度通常落后于能够组装成集群的主流通用 CPU。
集群优势:鉴于上述硬件局限,作者在配备高速网络的 Linux 集群上获得了快得多的训练速度。
在网络连接的 CPU 集群环境上采用参数并行
放弃全量参数同步的动因
通信开销限制:在由局部网络连接的 CPU 集群中,若像传统数据并行那样频繁在处理器之间同步全部参数,通信代价难以承受。
参数体量:模型参数规模达到数十兆字节(对于其实验中最大的网络,参数量接近 100 MB),通过局域网频繁传输这部分数据会耗费大量时间。
输出层参数切分与分工策略
为避免全量通信,作者选择对输出单元的参数进行切分并行:
核心依据:在该网络架构中,绝大部分计算集中在输出层。
各 CPU 的分工:
每个 CPU 仅负责计算一部分输出单元的未归一化概率(logits)。
每个 CPU 仅负责更新该部分输出单元对应的输入权重参数。
极小的通信开销:通过这一设计,CPU 之间每次样本更新仅需通信两项数据:
输出层 Softmax 的归一化常数(即分母求和项);
隐藏层激活值(记为 a)与词特征层(记为 x)上的反向传播梯度。
冗余计算与整体效率的权衡
前置计算的本地复制:所有 CPU 都会独立重复运行输出层之前的前向与反向计算,包括查表提取词特征向量、计算隐藏层激活值 a ,以及对应的梯度回传和局部更新。
权衡的合理性:尽管存在重复计算,但这些操作在整个网络计算量中所占比例极低,对于数十个处理器的并行规模而言,并不会对总计算耗时造成实质性影响。
计算量分布的量化分析
作者以美联社新闻数据的实验配置进行了算力分解验证:
参数设定:词表大小 |V| = 17,964 ,隐藏单元数 h = 60 ,模型阶数 n = 6 ,词特征维度 m = 100 。
计算输出单元加权和所消耗的运算量在整体运算量中的占比约为:

由上述结果可见,高达 99.7% 的数值运算都发生在输出层,因此将输出层切分并行在工程上具有显著优势。同时作者指出,如果未来采用很大规模的隐藏单元 h ,那么并行化隐藏层的计算也会具备收益,但本文未对此进行展开。
实验环境
硬件平台:由 32 台双 CPU 的 1.2 GHz Athlon 处理器组成的集群,节点间采用 Myrinet 低延迟千兆局域网连接。
软件环境:使用 MPI(Message Passing Interface)通信库编写并行调度逻辑。
4. 对比实验
4.1 基础设置
实验数据集与预处理对比
神经网络训练超参数设置
baselines 及其实现工具与评估规范

4.2 实验结果
训练与优化配置对比
实验结果


模型结构与消融分析结论
5. 结论
在两个语料库(一个包含超过 100 万样本,另一个规模更大,超过 1500 万词)上的实验表明,本文所提出的神经网络语言模型方法取得了远好于当时顶尖方法(平滑三元模型)的困惑度表现,困惑度差异在 10% 到 20% 之间。
作者指出,带来这些改善的主要原因在于,该方法能够借助学习到的分布式表征,以维数灾难自身的武器来对抗维数灾难:每一个训练句子都能使模型获取关于呈组合数数量的其他句子的信息。
在网络架构、计算效率以及利用先验知识等层面,显然还有诸多工作可以进一步改进该模型。未来研究的一个重要优先方向应当是提升加速技术,以及探索在不过多增加训练时间的前提下扩充模型容量的方法(以应对包含数亿词或更大规模的语料库)。一个能够利用时序结构、并将输入窗口尺寸扩展至可能覆盖整个段落(同时不过度增加参数量或计算时间)的简明思路,是采用时延神经网络以及可能的循环神经网络。在实际应用场景中评估此类模型同样十分有益。
更为宏观地看,本文的研究工作为统计语言模型的推进开启了新的可能:即用基于分布式表征的、更为紧凑和平滑的表征体系,来替代传统的“条件概率表”,这种新表征能够接纳多得多的条件变量。以往统计语言模型(如随机文法)为了避免过拟合,耗费了大量精力去限制或浓缩条件变量;而本文所阐述的模型则将困难转移到了另一个维度:虽然它需要进行多得多的计算,但其计算与内存开销随条件变量数量的增加仅呈线性扩展,而非指数级扩展。