自然语言处理

姓名:李嘉蔚学号:16020520034


【嵌牛导读】:自然语言处理(Natural Language Processing)让计算机能够使用人类语言,例

如英语或法语。为了让简单的程序能够高效明确地解析,计算机程序通常读取和发

出特殊化的语言。而自然的语言通常是模糊的,并且可能不遵循形式的描述。自然

语言处理中的应用如机器翻译,学习者需要读取一种人类语言的句子,并用另一种

人类语言发出等同的句子。许多 NLP 应用程序基于语言模型,语言模型定义了关于

自然语言中的字、字符或字节序列的概率分布。

非常通用的神经网络技术可以成功地应用于自然

语言处理。然而,为了实现卓越的性能并扩展到大型应用程序,一些领域特定的策略

也很重要。为了构建自然语言的有效模型,通常必须使用专门处理序列数据的技术。

在很多情况下,我们将自然语言视为一系列词,而不是单个字符或字节序列。因为

可能的词总数非常大,基于词的语言模型必须在极高维度和稀疏的离散空间上操作。

为使这种空间上的模型在计算和统计意义上都高效,研究者已经开发了几种策略.

【嵌牛鼻子】:语言模型,n-gram模型,神经网络模型。

【嵌牛提问】:什么是语言模型,n-gram模型,神经网络模型。

n-gram

语言模型(language model)定义了自然语言中标记序列的概率分布。根据模型

的设计,标记可以是词、字符、甚至是字节。标记总是离散的实体。最早成功的语言模型基于固定长度序列的标记模型,称为 n-gram。一个 n-gram 是一个包含 n 个标

记的序列。

基于 n-gram 的模型定义一个条件概率——给定前 n − 1 个标记后的第 n 个标

记的条件概率。该模型使用这些条件分布的乘积定义较长序列的概率分布:

图片发自简书App


这个分解可以由概率的链式法则证明。初始序列 P(x1, . . . , xn−1) 的概率分布可以通

过带有较小 n 值的不同模型建模。

训练 n-gram 模型是简单的,因为最大似然估计可以通过简单地统计每个可能

的 n-gram 在训练集中出现的次数来获得。几十年来,基于 n-gram 的模型都是统

计语言模型的核心模块 (Jelinek and Mercer, 1980; Katz, 1987; Chen and Goodman,

1999)

对于小的 n 值,模型有特定的名称:n = 1 称为 一元语法(unigram),n = 2 称

为 二元语法(bigram)及 n = 3 称为 三元语法(trigram)。这些名称源于相应数字

的拉丁前缀和希腊后缀 “-gram’’,分别表示所写之物。

通常我们同时训练 n-gram 模型和 n − 1 gram 模型。这使得下式可以简单地通

过查找两个存储的概率来计算。

图片发自简书App


为了在 Pn 中精确地再现推断,我们训练 Pn−1 时必须省略每个序列最后一个字符。

举个例子,我们演示三元模型如何计算句子 “THE DOG RAN AWAY.’’ 的概率。句

子的第一个词不能通过上述条件概率的公式计算,因为句子的开头没有上下文。取

而代之,在句子的开头我们必须使用词的边缘概率。因此我们计算 P3(THE DOG RAN)。

最后,可以使用条件分布 P(AWAY | DOG RAN)(典型情况)来预测最后一个词。将这

与式 (12.6) 放在一起,我们得到:

P(THE DOG RAN AWAY) = P3(THE DOG RAN)P3(DOG RAN AWAY)/P2(DOG RAN). (12.7)

n-gram 模型最大似然的基本限制是,在许多情况下从训练集计数估计得到的

Pn 很可能为零(即使元组 (xt−n+1, . . . , xt) 可能出现在测试集中)。这可能会导致

两种不同的灾难性后果。当 Pn−1 为零时,该比率是未定义的,因此模型甚至不能产生有意义的输出。当 Pn−1 非零而 Pn 为零时,测试样本的对数似然为 −∞。为

避免这种灾难性的后果,大多数 n-gram 模型采用某种形式的 平滑(smoothing)。

平滑技术将概率质量从观察到的元组转移到类似的未观察到的元组。见 Chen and

Goodman (1999) 的综述和实验对比。其中一种基本技术基于向所有可能的下一个符

号值添加非零概率质量。这个方法可以被证明是,计数参数具有均匀或 Dirichlet 先

验的贝叶斯推断。另一个非常流行的想法是包含高阶和低阶 n-gram 模型的混合模

型,其中高阶模型提供更多的容量,而低阶模型尽可能地避免零计数。如果上下文

xt−n+k, . . . , xt−1 的频率太小而不能使用高阶模型,回退方法 (back-off methods) 就

查找低阶 n-gram 。更正式地说,它们通过上下文 xt−n+k, . . . , xt−1 估计 xt 上的分

布,并增加 k 直到找到足够可靠的估计。

经典的 n-gram 模型特别容易引起维数灾难。因为存在 |V|

n 可能的 n-gram,而

且 |V| 通常很大。即使有大量训练数据和适当的 n,大多数 n-gram 也不会出现在训

练集中。经典 n-gram 模型的一种观点是执行最近邻查询。换句话说,它可以被视为

局部非参数预测器,类似于 k-最近邻。这些极端局部预测器面临的统计问题已经在

第 5.11.2 节中描述过。语言模型的问题甚至比普通模型更严重,因为任何两个不同的

词在one-hot向量空间中的距离彼此相同。因此,难以大量利用来自任意 ‘‘邻居’’ 的

信息——只有重复相同上下文的训练样本对局部泛化有用。为了克服这些问题,语

言模型必须能够在一个词和其他语义相似的词之间共享知识。

为了提高 n-gram 模型的统计效率,基于类的语言模型 (class-based language

model) (Brown et al., 1992; Ney and Kneser, 1993; Niesler et al., 1998) 引入词类别

的概念,然后属于同一类别的词共享词之间的统计强度。这个想法使用了聚类算法,

基于它们与其他词同时出现的频率,将该组词分成集群或类。随后,模型可以在条

件竖杠的右侧使用词类 ID 而不是单个词 ID。混合(或回退)词模型和类模型的复

合模型也是可能的。尽管词类提供了在序列之间泛化的方式,但其中一些词被相同

类的另一个替换,导致该表示丢失了很多信息。

神经语言模型

神经语言模型(Neural Language Model, NLM)是一类用来克服维数灾难的语

言模型,它使用词的分布式表示对自然语言序列建模 (Bengio et al., 2001b)。不同于

基于类的 n-gram 模型,神经语言模型在能够识别两个相似的词,并且不丧失将每个

词编码为彼此不同的能力。神经语言模型共享一个词(及其上下文)和其他类似词 (和上下文之间)的统计强度。模型为每个词学习的分布式表示,允许模型处理具有

类似共同特征的词来实现这种共享。例如,如果词 dog 和词 cat 映射到具有许多属

性的表示,则包含词 cat 的句子可以告知模型对包含词 dog 的句子做出预测,反之

亦然。因为这样的属性很多,所以存在许多泛化的方式,可以将信息从每个训练语

句传递到指数数量的语义相关语句。维数灾难需要模型泛化到指数多的句子(指数

相对句子长度而言)。该模型通过将每个训练句子与指数数量的类似句子相关联克服

这个问题。

我们有时将这些词表示称为 词嵌入(word embedding)。在这个解释下,我们将

原始符号视为维度等于词表大小的空间中的点。词表示将这些点嵌入到较低维的特

征空间中。在原始空间中,每个词由一个one-hot向量表示,因此每对词彼此之间的

欧氏距离都是 √

2。在嵌入空间中,经常出现在类似上下文(或共享由模型学习的一

些 ‘‘特征’’ 的任何词对)中的词彼此接近。这通常导致具有相似含义的词变得邻近。

图 12.3 放大了学到的词嵌入空间的特定区域,我们可以看到语义上相似的词如何映

射到彼此接近的表示。

图片发自简书App

其他领域的神经网络也可以定义嵌入。例如,卷积网络的隐藏层提供 ‘‘图像嵌

入’’。因为自然语言最初不在实值向量空间上,所以 NLP 从业者通常对嵌入的这个

想法更感兴趣。隐藏层在表示数据的方式上提供了更质变的戏剧性变化。

使用分布式表示来改进自然语言处理模型的基本思想不必局限于神经网络。它

还可以用于图模型,其中分布式表示是多个潜变量的形式。

高维输出

在许多自然语言应用中,我们通常希望我们的模型产生词(而不是字符)作为

输出的基本单位。对于大词汇表,由于词汇量很大,在词的选择上表示输出分布的计

算成本可能非常高。在许多应用中,V 包含数十万词。表示这种分布的朴素方法是

应用一个仿射变换,将隐藏表示转换到输出空间,然后应用 softmax 函数。假设我

们的词汇表 V 大小为 |V|。因为其输出维数为 |V|,描述该仿射变换线性分量的权重

矩阵非常大。这造成了表示该矩阵的高存储成本,以及与之相乘的高计算成本。因

为 softmax 要在所有 |V| 输出之间归一化,所以在训练时以及测试时执行全矩阵乘

法是必要的——我们不能仅计算与正确输出的权重向量的点积。因此,输出层的高

计算成本在训练期间(计算似然性及其梯度)和测试期间(计算所有或所选词的概

率)都有出现。对于专门的损失函数,可以有效地计算梯度 (Vincent et al., 2015),

但是应用于传统 softmax 输出层的标准交叉熵损失时会出现许多困难。

假设 h 是用于预测输出概率 yˆ 的顶部隐藏层。如果我们使用学到的权重 W 和

学到的偏置 b 参数化从 h 到 yˆ 的变换,则仿射 softmax 输出层执行以下计算:

图片发自简书App


如果 h 包含 nh 个元素,则上述操作复杂度是 O(|V|nh)。在 nh 为数千和 |V| 数十

万的情况下,这个操作占据了神经语言模型的大多数计算。

12.4.3.1 使用短列表

第一个神经语言模型 (Bengio et al., 2001b, 2003) 通过将词汇量限制为 10,000

或 20,000 来减轻大词汇表上 softmax 的高成本。Schwenk and Gauvain (2002) 和

Schwenk (2007) 在这种方法的基础上建立新的方式,将词汇表 V 分为最常见词汇

(由神经网络处理)的 短列表(shortlist) L 和较稀有词汇的尾列表 T = V\L(由ngram模型处理)。为了组合这两个预测,神经网络还必须预测在上下文 C 之后出现

的词位于尾列表的概率。我们可以添加额外的 sigmoid 输出单元估计 P(i ∈ T | C)

实现这个预测。额外输出则可以用来估计 V 中所有词的概率分布,如下:

P(y = i | C) =1i∈LP(y = i | C, i ∈ L)(1 − P(i ∈ T | C))

+ 1i∈TP(y = i | C, i ∈ T)P(i ∈ T | C), (12.10)

其中 P(y = i | C, i ∈ L) 由神经语言模型提供 P(y = i | C, i ∈ T) 由 n-gram 模型提

供。稍作修改,这种方法也可以在神经语言模型模型的 softmax 层中使用额外的输

出值,而不是单独的 sigmoid 单元。

短列表方法的一个明显缺点是,神经语言模型的潜在泛化优势仅限于最常用的

词,这大概是最没用的。这个缺点引发了处理高维输出替代方法的探索,如下所述。

12.4.3.2 分层 Softmax

减少大词汇表 V 上高维输出层计算负担的经典方法 (Goodman, 2001) 是分层地

分解概率。|V| 因子可以降低到 log |V| 一样低,而无需执行与 |V| 成比例数量(并且

也与隐藏单元数量 nh 成比例)的计算。Bengio (2002) 和 Morin and Bengio (2005)

将这种因子分解方法引入神经语言模型中。

我们可以认为这种层次结构是先建立词的类别,然后是词类别的类别,然后是

词类别的类别的类别等等。这些嵌套类别构成一棵树,其叶子为词。在平衡树中,

树的深度为 log |V|。选择一个词的概率是由路径(从树根到包含该词叶子的路径)

上的每个节点通向该词分支概率的乘积给出。图 12.4 是一个简单的例子。Mnih and

Hinton (2009) 也描述了使用多个路径来识别单个词的方法,以便更好地建模具有多

个含义的词。计算词的概率则涉及在导向该词所有路径上的求和。

为了预测树的每个节点所需的条件概率,我们通常在树的每个节点处使用逻辑

回归模型,并且为所有这些模型提供与输入相同的上下文 C。因为正确的输出编码

在训练集中,我们可以使用监督学习训练逻辑回归模型。我们通常使用标准交叉熵损

失,对应于最大化正确判断序列的对数似然。

因为可以高效地计算输出对数似然(低至 log |V| 而不是 |V|),所以也可以高效

地计算梯度。这不仅包括关于输出参数的梯度,而且还包括关于隐藏层激活的梯度。

优化树结构最小化期望的计算数量是可能的,但通常不切实际。给定词的相对

频率,信息理论的工具可以指定如何选择最佳的二进制编码。为此,我们可以构造

树,使得与词相关联的位数量近似等于该词频率的对数。然而在实践中,节省计算通

图片发自简书App

常事倍功半,因为输出概率的计算仅是神经语言模型中总计算的一部分。例如,假

设有 l 个全连接的宽度为 nh 的隐藏层。令 nb 是识别一个词所需比特数的加权平均

值,其加权由这些词的频率给出。在这个例子中,计算隐藏激活所需的操作数增长

为 O(ln2

h

),而输出计算增长为 O(nhnb)。只要 nb ≤ lnh,我们可以通过收缩 nh 比

收缩 nb 减少更多的计算量。事实上,nb 通常很小。因为词汇表的大小很少超过一

百万而 log2

(106

) ≈ 20,所以可以将 nb 减小到大约 20,但 nh 通常大得多,大约为

103 或更大。我们可以定义深度为 2 和分支因子为 √

|T| 的树,而不用仔细优化分支

因子为 2 的树。这样的树对应于简单定义一组互斥的词类。基于深度为 2 的树的简

单方法可以获得层级策略大部分的计算益处。

一个仍然有点开放的问题是如何最好地定义这些词类,或者如何定义一般的词

层次结构。早期工作使用现有的层次结构 (Morin and Bengio, 2005) ,但也可以理想

地与神经语言模型联合学习层次结构。学习层次结构很困难。对数似然的精确优化

似乎难以解决,因为词层次的选择是离散的,不适于基于梯度的优化。然而,我们

可以使用离散优化来近似地最优化词类的分割。

分层 softmax 的一个重要优点是,它在训练期间和测试期间(如果在测试时我

们想计算特定词的概率)都带来了计算上的好处。

当然即使使用分层 softmax,计算所有 |V| 个词概率的成本仍是很高的。另一个

重要的操作是在给定上下文中选择最可能的词。不幸的是,树结构不能为这个问题

提供高效精确的解决方案。

缺点是在实践中,分层 softmax 倾向于更差的测试结果(相对基于采样的方法),

我们将在下文描述。这可能是因为词类选择得不好。

12.4.3.3 重要采样

加速神经语言模型训练的一种方式是,避免明确地计算所有未出现在下一位置

的词对梯度的贡献。每个不正确的词在此模型下具有低概率。枚举所有这些词的计

算成本可能会很高。相反,我们可以仅采样词的子集。使用式 (12.8) 中引入的符号,

梯度可以写成如下形式

图片发自简书App

其中 a 是 presoftmax 激活(或得分)向量,每个词对应一个元素。第一项是正相

(positive phase) 项,推动 ay 向上;而第二项是负相 (negative phase) 项,对于所有

i 以权重 P(i | C) 推动 ai 向下。由于负相项是期望值,我们可以通过蒙特卡罗采样

估计。然而,这将需要从模型本身采样。从模型中采样需要对词汇表中所有的 i 计

算 P(i | C),这正是我们试图避免的。

我们可以从另一个分布中采样,而不是从模型中采样,这个分布称为 提议分布

(proposal distribution)(记为 q),并通过适当的权重校正从错误分布采样引入的偏

差 (Bengio and Sénécal, 2003; Bengio and Sénécal, 2008)。这是一种称为 重要采样

(Importance Sampling)的更通用技术的应用,我们将在第 12.4.3.3 节中更详细地描

述。不幸的是,即使精确重要采样也不一定有效,因为我们需要计算权重 pi/qi,其

中的 pi = P(i | C) 只能在计算所有得分 ai 后才能计算。这个应用采取的解决方案

称为有偏重要采样,其中重要性权重被归一化加和为 1。当对负词 ni 进行采样时,

相关联的梯度被加权为:

图片发自简书App

qnj

. (12.17)

这些权重用于对来自 q 的 m 个负样本给出适当的重要性,以形成负相估计对梯度的

贡献:

图片发自简书App


一元语法或二元语法分布与提议分布 q 工作得一样好。从数据估计这种分布的参数

是很容易。在估计参数之后,也可以非常高效地从这样的分布采样。

重要采样(Importance Sampling)不仅可以加速具有较大 softmax 输出的模

型。更一般地,它可以加速具有大稀疏输出层的训练,其中输出是稀疏向量而不是n 选 1。其中一个例子是 词袋(bag of words)。词袋具有稀疏向量 v,其中 vi 表示

词汇表中的词 i 存不存在文档中。或者,vi 可以指示词 i 出现的次数。由于各种原

因,训练产生这种稀疏向量的机器学习模型的成本可能很高。在学习的早期,模型

可能不会真的使输出真正稀疏。此外,将输出的每个元素与目标的每个元素进行比

较,可能是描述训练的损失函数最自然的方式。这意味着稀疏输出并不一定能带来

计算上的好处,因为模型可以选择使大多数输出非零,并且所有这些非零值需要与

相应的训练目标进行比较(即使训练目标是零)。Dauphin et al. (2011) 证明可以使

用重要采样加速这种模型。高效算法最小化 ‘‘正词’’(在目标中非零的那些词)和相

等数量的 ‘‘负词’’ 的重构损失。负词是被随机选取的,如使用启发式采样更可能被误

解的词。该启发式过采样引入的偏差则可以使用重要性权重校正。

在所有这些情况下,输出层梯度估计的计算复杂度被减少为与负样本数量成比

例,而不是与输出向量的大小成比例。

12.4.3.4 噪声对比估计和排名损失

为减少训练大词汇表的神经语言模型的计算成本,研究者也提出了其他基于采

样的方法。早期的例子是 Collobert and Weston (2008a) 提出的排名损失,将神经语

言模型每个词的输出视为一个得分,并试图使正确词的得分 ay 比其他词 ai 排名更

高。提出的排名损失则是

图片发自简书App


如果观察到词的得分 ay 远超过负词的得分 ai(相差大于 1),则第 i 项梯度为零。

这个准则的一个问题是它不提供估计的条件概率,条件概率在很多应用中是有用的,

包括语音识别和文本生成(包括诸如翻译的条件文本生成任务)。

最近用于神经语言模型的训练目标是噪声对比估计,将在第 18.6 节中介绍。这

种方法已成功应用于神经语言模型 (Mnih and Teh, 2012; Mnih and Kavukcuoglu,

2013)。

12.4.4 结合 n-gram 和神经语言模型

n-gram 模型相对神经网络的主要优点是 n-gram 模型具有更高的模型容量(通

过存储非常多的元组的频率),并且处理样本只需非常少的计算量(通过查找只匹配当前上下文的几个元组)。如果我们使用哈希表或树来访问计数,那么用于 n-gram 的

计算量几乎与容量无关。相比之下,将神经网络的参数数目加倍通常也大致加倍计

算时间。当然,避免每次计算时使用所有参数的模型是一个例外。嵌入层每次只索

引单个嵌入,所以我们可以增加词汇量,而不会增加每个样本的计算时间。一些其

他模型,例如平铺卷积网络,可以在减少参数共享程度的同时添加参数以保持相同

的计算量。然而,基于矩阵乘法的典型神经网络层需要与参数数量成比例的计算量。

因此,增加容量的一种简单方法是将两种方法结合,由神经语言模型和 ngram 语言模型组成集成 (Bengio et al., 2001b, 2003)。

对于任何集成,如果集成成员产生独立的错误,这种技术可以减少测试误差。集

成学习领域提供了许多方法来组合集成成员的预测,包括统一加权和在验证集上选

择权重。Mikolov et al. (2011a) 扩展了集成,不是仅包括两个模型,而是包括大量

模型。我们也可以将神经网络与最大熵模型配对并联合训练 (Mikolov et al., 2011b)。

该方法可以被视为训练具有一组额外输入的神经网络,额外输入直接连接到输出并

且不连接到模型的任何其他部分。额外输入是输入上下文中特定 n-gram 是否存在

的指示器,因此这些变量是非常高维且非常稀疏的。

模型容量的增加是巨大的(架构的新部分包含高达 |sV |

n 个参数),但是处理输

入所需的额外计算量是很小的(因为额外输入非常稀疏)。