NLP教程(9) - 句法分析与树形递归神经网络

12,855 阅读18分钟

ShowMeAI研究中心


句法分析与树形递归神经网络

本系列为斯坦福CS224n《自然语言处理与深度学习(Natural Language Processing with Deep Learning)》的全套学习笔记,对应的课程视频可以在 这里 查看。

句法分析与树形递归神经网络

ShowMeAI为CS224n课程的全部课件,做了中文翻译和注释,并制作成了 GIF动图!点击 第18讲-句法分析与树形递归神经网络 查看的课件注释与带学解读。更多资料获取方式见文末。


引言

CS224n是顶级院校斯坦福出品的深度学习与自然语言处理方向专业课程,核心内容覆盖RNN、LSTM、CNN、transformer、bert、问答、摘要、文本生成、语言模型、阅读理解等前沿内容。

本篇笔记对应斯坦福CS224n自然语言处理专项课程的知识板块:句法分析与树形递归神经网络。主要讲解树形递归神经网络(注意,这里的RNN指的是Recursive Neural Networks,而不是我们之前提到的Recurrent Neural Networks循环神经网络)。

笔记核心词

  • 树形模型
  • 递归神经网络 / Recursive Neural Networks
  • 句法分析 / Constituency Parsing
  • 成分句法分析
  • SU-RNN
  • MV-RNN
  • RNTN

1.递归神经网络

标准递归神经网络

递归神经网络(如上图所示)非常适合具有嵌套层次结构和内在递归结构的设置。如果我们思考一个句子,我们会发现它其实是有这样的结构的,以 A small crowd quietly enters the historical church 为例。首先,我们将句子分成名词短语、动词短语、 A small crowdquietly enters the historical church 。但是有一个名词短语在动词短语中: quietly entershistorical church ,等等。这看起来确实很递归。

语言的语法规则是高度递归的。因此,我们使用一个利用了递归结构的模型。使用递归神经网络建模句子的另一个好处是我们现在可以输入任意长度的句子。(see Bengio et al., 2003; Henderson, 2003; Collobert & Weston, 2008)

假设我们的任务是取一个句子,并将其表示为与单词本身语义空间相同的向量。所以像 I went to the mall yesterdayWe went shopping last weekThey went to the store 这样的短语,彼此之间的距离都非常近。我们已经看到了训练单字向量的方法,我们是否应该对二元组、三元组等也做同样的事情。这可能非常有效,但这种想法存在两个主要问题。

    1. 单词的组合有无数种可能。存储和训练无限数量的向量将是荒谬的。
    1. 有些单词的组合虽然在语言中完全可以听到,但可能永远不会出现在我们的 训练 / 开发 语料库中,所以我们永远学不会。

我们需要一种方法来取一个句子及其相应的词向量,并推导出嵌入向量应该是什么。现在让我们先问一个非常有争议的问题。我们用来表示所有单词的向量空间,具有足够的表达能力以至于能够表示任意长度的所有句子,这是天真的想法吗?虽然这可能是不直观的,但这些模型的性能表明,这实际上是一件合理的事情。

我们先来讨论一下句子的语义理解和语法理解的区别。语义分析是对句子意义的理解,能够在结构语义空间中把短语表示为一个向量,相似的句子非常近,不相关的句子非常远。语法理解是指我们已经确定了句子的基本语法结构,句子的哪一部分取决于哪一部分,哪些词在修饰哪些词,等等。这种理解的输出通常用解析树表示,如下图所示。

句子的解析树

现在,让我们来看看最重要的问题。如果我们想要知道语义的表达方式,是否需要有语法上的理解?有些人可能不同意,但现在我们将用下面的方法来处理这个语义组合任务。首先,我们需要理解单词。然后,我们需要知道单词是如何组合在一起的,然后,最后,我们可以通过利用前面的两个概念得到一个短语或句子的意思。

让我们从我们的第一个基于这个原则的模型开始。假设我们有一个句子,我们知道这个句子的解析树,如上图所示,我们能找出这个句子的编码吗?也许还能从句子中的单词向量中得到一个情感得分?我们观察一个简单的递归神经网络是如何完成这项任务的。

1.1 递归神经网络的单层结构

一个标准RNN示例

让我们浏览一下上图中显示的模型。我们首先获取一个句子解析树和句子单词向量,然后开始遍历该树。图中最低的节点是 Node3\text{Node}_3 ,所以我们将 L29L_{29}L430L_{430} 连接起来形成一个向量 [L29 L430]R2d\left[\begin{array}{c}{L_{29}} \ {L_{430}}\end{array}\right]\in \mathbb{R}^{2 d} ,并将其输入到我们的网络中进行计算:

h(1)=tanh(W(1)[L29 L430]+b(1))h^{(1)}=\tanh \left(W^{(1)}\left[\begin{array}{c}{L_{29}} \ {L_{430}}\end{array}\right]+b^{(1)}\right)

考虑到 W(1)Rd×2d and b(1)Rd,h(1)RdW^{(1)} \in \mathbb{R}^{d \times 2 d} \text { and } b^{(1)} \in \mathbb{R}^{d}, h^{(1)} \in \mathbb{R}^{d} ,我们现在可以将 h(1)h^{(1)} 看做是 bigram this assignment 的相同单词向量空间的一个点,我们不需要分别学习表示,而是从其构成的单词向量中派生。

我们现在将 h(1)h^{(1)} 投进一个 softmax 层中来获得一个情感类别的分数,情感类别是一个已知的代表一些含义的离散集合。在积极/消极情绪分析的情况下,我们会有5个类,类0表示强烈的消极,类1表示消极,类2表示中性,类3表示积极,最后类4表示强烈的积极。

现在我们对 Ilove 做同样的处理,生成短语 I love 的向量 h(1)h^{(1)} 。同样,我们计算该短语在情感类上的得分。最后,最有趣的一步,我们需要合并两个短语 I lovethis assignment 。这里我们连接的是单词短语,而不是单词向量!我们用同样的方法,把两个 h(1)h^{(1)} 连接起来并且计算

h(1)=tanh(W(1)[hLeft(1) hRight(1)]+b(1))h^{(1)}=\tanh \left(W^{(1)}\left[\begin{array}{c}{h_{L e f t}^{(1)}} \ {h_{R i g h t}^{(1)}}\end{array}\right]+b^{(1)}\right)

现在我们有一个向量在向量空间中表示完整的句子 I love this assignment 。此外,我们可以将这个 h(1)h^{(1)} 通过与前面相同的 softmax 层,并计算整个句子的情绪概率。当然,模型只有在经过训练后才能可靠地做到这一点。

现在让我们后退一步。首先,认为我们可以使用相同的矩阵 WW 将所有单词连接在一起,得到一个非常有表现力的 h(1)h^{(1)} ,然后再次使用相同的矩阵 WW 将所有短语向量连接起来,得到更深层的短语,这样的想法是不是太天真了?我们可以通过下面对递归神经网络的调整来解决它们。

1.2 Syntactically Untied SU-RNN

正如我们在前一节的批评中所讨论的,使用相同的 WW 将名词短语和动词短语组合在一起,将介词短语和另一个词向量组合在一起,从直觉上看似乎是错误的。也许我们是直接将所有这些功能合并到一个太弱的模型中。

我们能做的就是 “从语法上解开” 这些不同任务的权重。我们的意思是,没有理由期望某一类输入的最优 WW 与另一类输入的最优 WW 完全相关。所以我们让这些 WW 不一样,放松这个约束。虽然这确实增加了我们要学习的权重矩阵,但是我们获得的性能提升却不是微不足道的。

对不同类别的输入使用不同的W比对所有类别只使用一个W更自然

正如上图所示,我们注意到我们的模型现在取决于输入的语法类别。注意,我们通过一个非常简单的概率上下文自由语法(PCFG)来确定类别,这个语法或多或少是通过计算Penn Tree Bank上的汇总统计信息来学习的,以学习规则,比如 the 总是一个DT等等。不需要对这部分有更深的理解,只需要知道它非常简单。

这个模型中唯一的其他主要区别是,我们根据语言类别分别初始化了 WW 。这样做的默认做法是对输入的两个单词向量求平均值。缓慢但肯定的是,模型会学会哪个向量更重要,以及向量的任何旋转或缩放都可以提高性能。我们在下图中观察到,经过训练的权重矩阵学习了实际意义!例如,DT-NP 规则,或者说是限定词后跟名词短语 (如 The carA man ) 的例子中,更强调名词词组。(这是显而易见的,因为右边的对角线是红色的,表示更高的权重)。这被称为soft head words 的概念,语言学家们长期以来一直认为这是正确的,然而这个模型仅仅通过观察数据就学会了这一点。很酷!

学习到的 DT-NP 组合的权重 W 符合语言学理论

SU-RNN确实比之前讨论过的模型表现得更好,但也许它的表现力还不够。如果我们考虑修饰词,比如副词 very ,任何与这个单词向量和下面这个单词向量的插值,肯定不是我们所理解的 very 的本质。

作为副词,它的字面意思是 用于强调 。当我们只做线性插值时,我们怎么能得到一个强调其他向量的向量呢?我们如何构造一个向量,它将以这种方式“缩放”任何其他向量?事实是我们不能。我们需要一个词对另一个词的乘法。我们在下面发现了两个这样的组合,它们可以实现这一点。第一个利用单词矩阵,另一个利用二次方程的典型仿射。

1.3 MV-RNN (Matrix-Vector Recursive Neural Networks)

MV-RNN示例

我们现在扩大我们的单词表示,不仅包括一个单词向量,而且还包括一个单词矩阵!所以单词 very 将有一个单词向量 vveryRdv_{v e r y} \in \mathbb{R}^{d} ,和单词矩阵 VveryRd×dV_{v e r y} \in \mathbb{R}^{d \times d} 。这让我们不仅能够表达一个单词的意思,还能学习单词 modify 修饰 其他单词的方式。单词矩阵指的就是后者。为了将两个单词 aabb 输入RNN,我们取它们的单词矩阵 AABB ,形成输入向量 xx,作为向量AbAbBaBa的组合。在我们的 very 例子中,VveryV_{very}可以是单位矩阵乘以任意大于 11 的标量。它可以将任何相邻的词向量乘以这个数!这正是我们所需要的那种表示能力。当新的单词表示开拓了我们的特征空间时,我们可以更好地表达单词彼此修饰的方式。

通过对模型误差的观察,我们发现即使是MV- RNN也不能表达一定的关系。我们观察到三大类错误。

Negated Positives

第一,Negated Positives 否定积极。当我们说一些积极的东西,但一个词变成了消极的,模型不能衡量一个词强大到足以翻转整个句子的情绪。上图显示了这样一个例子,将单词 most 转换为 least 应该会翻转整个句子的情绪,但是MV-RNN没有成功地捕捉到这一点。

Negated Negatives

第二类错误是 Negated Negative 否定的否定形式。我们说某事不坏,或者不枯燥,如上图所示。MV-RNN不能识别出 not 这个词会使情绪从消极变为中性。

使用递归神经网络可以正确地对对比连词X和Y的情感进行分类,而MV-RNN则不能

我们观察到的最后一类错误是上图中显示的 X but Y连接词 。这里的 X 可能是负的,但如果Y是正的,那么模型对句子的情感输出应该是正的!MV-RNNs正在与之斗争。

因此,我们必须寻找一种更富表现力的组合算法,能够完全捕捉这些类型的高级构成。

1.4 RNTN (Recursive Neural Tensor Network)

RNTN的一个切片(d个切片)

我们将在这里讨论的最后一个递归神经网络是迄今为止在我们所总结的三种错误类型中效果最成功的。递归神经张量网络 Recursive Neural Tensor Network 消除了单词矩阵的概念,进一步消除了传统仿射变换的 pre-tanh/sigmoid 的概念。为了组合两个单词向量或短语向量,我们再次将它们连接起来,形成一个向量R2d\in \mathbb{R}^{2 d},但是我们没有先将其放入仿射函数,然后是一个非线性的,而是先将其放入一个二次方程,然后是一个非线性的,比如:

h(1)=tanh(xTVx+Wx)h^{(1)}=\tanh \left(x^{T} V x+W x\right)

这里,VV 是一个三阶张量 R2d×2d×d\mathbb{R}^{2 d \times 2 d \times d},我们计算 xTV[i]x,i[1,2,d]x^{T} V[i] x, \forall i \in[1,2, \ldots d] 张量的切片输出向量Rd\mathbb{R}^{d}。然后我们加上WxWx,把它变成一个非线性函数。二次方显示了乘法,我们确实可以使得词向量之间进行乘法交互,而不需要维护和学习单词矩阵!

否定正数据集和否定负数据集的性能比较

如上图所示**,RNTN是唯一能够在这些非常难的数据集上成功的模型**。之前的笔记中讨论过的卷积神经网络(CNN) 在某些方面优于RNTN,并且不需要输入解析树!

2 成分句法分析

自然语言理解要求能够从较大的文本单元中较小的部分的理解中提取意义。这种提取要求能够理解较小的部件是如何组合在一起的。分析句子句法结构的方法主要有两种:constituency parsing and dependency parsing 成分句法分析和依存分析。依存分析在前几节课中已经讨论过(参见ShowMeAI的文章NLP教程(4) - 句法分析与依存解析)。通过在单词及其依赖项之间建立二进制非对称关系,结构显示了哪个单词依赖于哪个单词。现在我们关注成分句法分析,它将单词组织成嵌套的成分。

成分句法分析是将一段文本(例如一个句子)分成子短语的一种方法。成分句法分析(也称为“短语结构分析”)的目标之一是识别文本中的成分,这些成分在从文本中提取信息时非常有用。通过分析句子后了解成分,就有可能生成语法上正确的类似句子。

2.1 成分

在句法分析中,一个成分可以是一个单词或短语,作为一个层次结构中的一个单元。短语是由两个或两个以上的单词组成的词组,围绕 a head lexical item 一个词首词项,在一个句子中作为一个单位使用。作为一个短语,一组词应该在句子中发挥特定的作用。此外,一组词可以一起移动或替换为一个整体,句子应该保持流利和语法。

我们用较小元素的符号组合来解释大的文本单元。这些较小的元素可以在保持相同含义的同时进行更改,如下面的示例所示。

例如,下面的句子包含名词短语:wonderful CS224N

  • I want to be enrolled in the wonderful CS224N!

我们通过移动整个短语到最前面来重写这个句子

  • The wonderful CS224N I want to be enrolled in

或者这个短语可以被一个类似功能和意义的成分所替代,例如 great CS course in Stanford about NLP and Deep Learning

  • I want to be enrolled in the great CS course in Stanford about NLP and Deep Learning!

对于成分句法分析,基本子句结构被理解为,子句分为主语(名词短语NP) 和 谓语(动词短语VP) 的二元划分,表达如下规则。

子句的二元划分导致一对一或一对多通信。对于句子中的每个元素,树结构中都有一个或多个节点。

  • SNPVP\mathrm{S} \rightarrow \mathrm{NP} \quad \mathrm{VP}

事实上,解析的过程说明了某些类似的规则。我们从句子符号 S 开始推导规则,依次对短语结构规则进行叠加,最后应用替代规则来使用抽象符号代替实际单词。根据提取规则,可以生成相似的句子。如果规则正确,那么以这种方式产生的任何句子都应该在语法上正确。然而,生成的句子在语法上可能是正确的,但在语义上却是荒谬的,比如下面这个众所周知的例子:

  • Colorless green ideas sleep furiously

“Colorless green ideas sleep furiously”的选区解析树

2.2 成分句法解析树

有趣的是,在自然语言中,这些成分很可能彼此嵌套在一起。因此,这些短语的自然表示形式是树。通常我们使用成分解析树来演示解析过程。基于结构语法的成分解析树可以区分终端节点和非终端节点。树中的非终结符被标记为短语的类型(例如名词短语),终结符是句子中的准确单词。以 John hit the ball 为例,英语句子的句法结构如下图所示。

以 John hit the ball 为例,英语句子的句法结构如下图所示

我们有一个解析树,从表示整个句子的根 SS 开始,到表示句子中的每个单词的每个叶子节点结束。我们使用以下缩写

  • S 代表句子,最高级的结构
  • NP 代表名词短语,包括句子的主语和宾语
  • VP 代表动词短语,充当谓语
  • V 代表动词
  • D 代表限定词,例如 the
  • N 代表名词

注意回到句子表示,如果你不知道解析树呢

我们在这一系列课堂笔记中观察到的RNNs依赖于这样的初始解析。如果我们使用的是递归神经网络,而这个短语的上下文在它的右边会怎样?如果我们只在最后一个时间步上应用Softmax,那么最后几个字将对输出产生不成比例的大影响,例如,分类。卷积神经网络解决了这个问题,正如之前的讲义所述。

3.参考资料

ShowMeAI系列教程推荐

NLP系列教程文章

斯坦福 CS224n 课程带学详解

showmeai用知识加速每一次技术成长