NLP教程(9) - 句法分析与树形递归神经网络
- 作者:韩信子@ShowMeAI
- 教程地址:https://www.showmeai.tech/tutorials/36
- 本文地址:https://www.showmeai.tech/article-detail/255
- 声明:版权所有,转载请联系平台与作者并注明出处
- 收藏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 crowd
和 quietly enters the historical church
。但是有一个名词短语在动词短语中: quietly enters
和 historical church
,等等。这看起来确实很递归。
语言的语法规则是高度递归的。因此,我们使用一个利用了递归结构的模型。使用递归神经网络建模句子的另一个好处是我们现在可以输入任意长度的句子。(see Bengio et al., 2003; Henderson, 2003; Collobert & Weston, 2008)
假设我们的任务是取一个句子,并将其表示为与单词本身语义空间相同的向量。所以像 I went to the mall yesterday
、 We went shopping last week
和 They went to the store
这样的短语,彼此之间的距离都非常近。我们已经看到了训练单字向量的方法,我们是否应该对二元组、三元组等也做同样的事情。这可能非常有效,但这种想法存在两个主要问题。
-
- 单词的组合有无数种可能。存储和训练无限数量的向量将是荒谬的。
-
- 有些单词的组合虽然在语言中完全可以听到,但可能永远不会出现在我们的 训练 / 开发 语料库中,所以我们永远学不会。
我们需要一种方法来取一个句子及其相应的词向量,并推导出嵌入向量应该是什么。现在让我们先问一个非常有争议的问题。我们用来表示所有单词的向量空间,具有足够的表达能力以至于能够表示任意长度的所有句子,这是天真的想法吗?虽然这可能是不直观的,但这些模型的性能表明,这实际上是一件合理的事情。
我们先来讨论一下句子的语义理解和语法理解的区别。语义分析是对句子意义的理解,能够在结构语义空间中把短语表示为一个向量,相似的句子非常近,不相关的句子非常远。语法理解是指我们已经确定了句子的基本语法结构,句子的哪一部分取决于哪一部分,哪些词在修饰哪些词,等等。这种理解的输出通常用解析树表示,如下图所示。
现在,让我们来看看最重要的问题。如果我们想要知道语义的表达方式,是否需要有语法上的理解?有些人可能不同意,但现在我们将用下面的方法来处理这个语义组合任务。首先,我们需要理解单词。然后,我们需要知道单词是如何组合在一起的,然后,最后,我们可以通过利用前面的两个概念得到一个短语或句子的意思。
让我们从我们的第一个基于这个原则的模型开始。假设我们有一个句子,我们知道这个句子的解析树,如上图所示,我们能找出这个句子的编码吗?也许还能从句子中的单词向量中得到一个情感得分?我们观察一个简单的递归神经网络是如何完成这项任务的。
1.1 递归神经网络的单层结构
让我们浏览一下上图中显示的模型。我们首先获取一个句子解析树和句子单词向量,然后开始遍历该树。图中最低的节点是 \(\text{Node}_3\) ,所以我们将 \(L_{29}\) 和 \(L_{430}\) 连接起来形成一个向量 \(\left[\begin{array}{c}{L_{29}} \ {L_{430}}\end{array}\right]\in \mathbb{R}^{2 d}\) ,并将其输入到我们的网络中进行计算:
考虑到 \(W^{(1)} \in \mathbb{R}^{d \times 2 d} \text { and } b^{(1)} \in \mathbb{R}^{d}, h^{(1)} \in \mathbb{R}^{d}\) ,我们现在可以将 \(h^{(1)}\) 看做是 bigram this assignment
的相同单词向量空间的一个点,我们不需要分别学习表示,而是从其构成的单词向量中派生。
我们现在将 \(h^{(1)}\) 投进一个 softmax 层中来获得一个情感类别的分数,情感类别是一个已知的代表一些含义的离散集合。在积极/消极情绪分析的情况下,我们会有5个类,类0表示强烈的消极,类1表示消极,类2表示中性,类3表示积极,最后类4表示强烈的积极。
现在我们对 I
和 love
做同样的处理,生成短语 I love
的向量 \(h^{(1)}\) 。同样,我们计算该短语在情感类上的得分。最后,最有趣的一步,我们需要合并两个短语 I love
和 this assignment
。这里我们连接的是单词短语,而不是单词向量!我们用同样的方法,把两个 \(h^{(1)}\) 连接起来并且计算
现在我们有一个向量在向量空间中表示完整的句子 I love this assignment
。此外,我们可以将这个 \(h^{(1)}\) 通过与前面相同的 softmax 层,并计算整个句子的情绪概率。当然,模型只有在经过训练后才能可靠地做到这一点。
现在让我们后退一步。首先,认为我们可以使用相同的矩阵 \(W\) 将所有单词连接在一起,得到一个非常有表现力的 \(h^{(1)}\) ,然后再次使用相同的矩阵 \(W\) 将所有短语向量连接起来,得到更深层的短语,这样的想法是不是太天真了?我们可以通过下面对递归神经网络的调整来解决它们。
1.2 Syntactically Untied SU-RNN
正如我们在前一节的批评中所讨论的,使用相同的 \(W\) 将名词短语和动词短语组合在一起,将介词短语和另一个词向量组合在一起,从直觉上看似乎是错误的。也许我们是直接将所有这些功能合并到一个太弱的模型中。
我们能做的就是 “从语法上解开” 这些不同任务的权重。我们的意思是,没有理由期望某一类输入的最优 \(W\) 与另一类输入的最优 \(W\) 完全相关。所以我们让这些 \(W\) 不一样,放松这个约束。虽然这确实增加了我们要学习的权重矩阵,但是我们获得的性能提升却不是微不足道的。
正如上图所示,我们注意到我们的模型现在取决于输入的语法类别。注意,我们通过一个非常简单的概率上下文自由语法(PCFG)来确定类别,这个语法或多或少是通过计算Penn Tree Bank上的汇总统计信息来学习的,以学习规则,比如 the
总是一个DT等等。不需要对这部分有更深的理解,只需要知道它非常简单。
这个模型中唯一的其他主要区别是,我们根据语言类别分别初始化了 \(W\) 。这样做的默认做法是对输入的两个单词向量求平均值。缓慢但肯定的是,模型会学会哪个向量更重要,以及向量的任何旋转或缩放都可以提高性能。我们在下图中观察到,经过训练的权重矩阵学习了实际意义!例如,DT-NP 规则,或者说是限定词后跟名词短语 (如 The car
或 A man
) 的例子中,更强调名词词组。(这是显而易见的,因为右边的对角线是红色的,表示更高的权重)。这被称为soft head words 的概念,语言学家们长期以来一直认为这是正确的,然而这个模型仅仅通过观察数据就学会了这一点。很酷!
SU-RNN确实比之前讨论过的模型表现得更好,但也许它的表现力还不够。如果我们考虑修饰词,比如副词 very
,任何与这个单词向量和下面这个单词向量的插值,肯定不是我们所理解的 very
的本质。
作为副词,它的字面意思是 用于强调
。当我们只做线性插值时,我们怎么能得到一个强调其他向量的向量呢?我们如何构造一个向量,它将以这种方式“缩放”任何其他向量?事实是我们不能。我们需要一个词对另一个词的乘法。我们在下面发现了两个这样的组合,它们可以实现这一点。第一个利用单词矩阵,另一个利用二次方程的典型仿射。
1.3 MV-RNN (Matrix-Vector Recursive Neural Networks)
我们现在扩大我们的单词表示,不仅包括一个单词向量,而且还包括一个单词矩阵!所以单词 very
将有一个单词向量 \(v_{v e r y} \in \mathbb{R}^{d}\) ,和单词矩阵 \(V_{v e r y} \in \mathbb{R}^{d \times d}\) 。这让我们不仅能够表达一个单词的意思,还能学习单词 modify 修饰
其他单词的方式。单词矩阵指的就是后者。为了将两个单词 \(a\) 和 \(b\) 输入RNN,我们取它们的单词矩阵 \(A\) 和 \(B\) ,形成输入向量 \(x\),作为向量\(Ab\)和\(Ba\)的组合。在我们的 very
例子中,\(V_{very}\)可以是单位矩阵乘以任意大于 \(1\) 的标量。它可以将任何相邻的词向量乘以这个数!这正是我们所需要的那种表示能力。当新的单词表示开拓了我们的特征空间时,我们可以更好地表达单词彼此修饰的方式。
通过对模型误差的观察,我们发现即使是MV- RNN也不能表达一定的关系。我们观察到三大类错误。
第一,Negated Positives 否定积极。当我们说一些积极的东西,但一个词变成了消极的,模型不能衡量一个词强大到足以翻转整个句子的情绪。上图显示了这样一个例子,将单词 most
转换为 least
应该会翻转整个句子的情绪,但是MV-RNN没有成功地捕捉到这一点。
第二类错误是 Negated Negative 否定的否定形式。我们说某事不坏,或者不枯燥,如上图所示。MV-RNN不能识别出 not
这个词会使情绪从消极变为中性。
我们观察到的最后一类错误是上图中显示的 X but Y连接词
。这里的 X 可能是负的,但如果Y是正的,那么模型对句子的情感输出应该是正的!MV-RNNs正在与之斗争。
因此,我们必须寻找一种更富表现力的组合算法,能够完全捕捉这些类型的高级构成。
1.4 RNTN (Recursive Neural Tensor Network)
我们将在这里讨论的最后一个递归神经网络是迄今为止在我们所总结的三种错误类型中效果最成功的。递归神经张量网络 Recursive Neural Tensor Network 消除了单词矩阵的概念,进一步消除了传统仿射变换的 pre-tanh/sigmoid 的概念。为了组合两个单词向量或短语向量,我们再次将它们连接起来,形成一个向量\(\in \mathbb{R}^{2 d}\),但是我们没有先将其放入仿射函数,然后是一个非线性的,而是先将其放入一个二次方程,然后是一个非线性的,比如:
这里,\(V\) 是一个三阶张量 \(\mathbb{R}^{2 d \times 2 d \times d}\),我们计算 \(x^{T} V[i] x, \forall i \in[1,2, \ldots d]\) 张量的切片输出向量\(\mathbb{R}^{d}\)。然后我们加上\(Wx\),把它变成一个非线性函数。二次方显示了乘法,我们确实可以使得词向量之间进行乘法交互,而不需要维护和学习单词矩阵!
如上图所示,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) 的二元划分,表达如下规则。
子句的二元划分导致一对一或一对多通信。对于句子中的每个元素,树结构中都有一个或多个节点。
- \(\mathrm{S} \rightarrow \mathrm{NP} \quad \mathrm{VP}\)
事实上,解析的过程说明了某些类似的规则。我们从句子符号 S 开始推导规则,依次对短语结构规则进行叠加,最后应用替代规则来使用抽象符号代替实际单词。根据提取规则,可以生成相似的句子。如果规则正确,那么以这种方式产生的任何句子都应该在语法上正确。然而,生成的句子在语法上可能是正确的,但在语义上却是荒谬的,比如下面这个众所周知的例子:
- Colorless green ideas sleep furiously
2.2 成分句法解析树
有趣的是,在自然语言中,这些成分很可能彼此嵌套在一起。因此,这些短语的自然表示形式是树。通常我们使用成分解析树来演示解析过程。基于结构语法的成分解析树可以区分终端节点和非终端节点。树中的非终结符被标记为短语的类型(例如名词短语),终结符是句子中的准确单词。以 John hit the ball
为例,英语句子的句法结构如下图所示。
我们有一个解析树,从表示整个句子的根 \(S\) 开始,到表示句子中的每个单词的每个叶子节点结束。我们使用以下缩写:
- S 代表句子,最高级的结构
- NP 代表名词短语,包括句子的主语和宾语
- VP 代表动词短语,充当谓语
- V 代表动词
- D 代表限定词,例如
the
- N 代表名词
注意:回到句子表示,如果你不知道解析树呢?
我们在这一系列课堂笔记中观察到的RNNs依赖于这样的初始解析。如果我们使用的是递归神经网络,而这个短语的上下文在它的右边会怎样?如果我们只在最后一个时间步上应用Softmax,那么最后几个字将对输出产生不成比例的大影响,例如,分类。卷积神经网络解决了这个问题,正如之前的讲义所述。
3.参考资料
- 本教程的在线阅读版本
- 《斯坦福CS224n深度学习与自然语言处理》课程学习指南
- 《斯坦福CS224n深度学习与自然语言处理》课程大作业解析
- 【双语字幕视频】斯坦福CS224n | 深度学习与自然语言处理(2019·全20讲)
ShowMeAI系列教程推荐
- 大厂技术实现方案系列
- 图解Python编程:从入门到精通系列教程
- 图解数据分析:从入门到精通系列教程
- 图解AI数学基础:从入门到精通系列教程
- 图解大数据技术:从入门到精通系列教程
- 图解机器学习算法:从入门到精通系列教程
- 机器学习实战:手把手教你玩转机器学习系列
- 深度学习教程:吴恩达专项课程 · 全套笔记解读
- 自然语言处理教程:斯坦福CS224n课程 · 课程带学与全套笔记解读
- 深度学习与计算机视觉教程:斯坦福CS231n · 全套笔记解读
NLP系列教程文章
- NLP教程(1)- 词向量、SVD分解与Word2vec
- NLP教程(2)- GloVe及词向量的训练与评估
- NLP教程(3)- 神经网络与反向传播
- NLP教程(4)- 句法分析与依存解析
- NLP教程(5)- 语言模型、RNN、GRU与LSTM
- NLP教程(6)- 神经机器翻译、seq2seq与注意力机制
- NLP教程(7)- 问答系统
- NLP教程(8)- NLP中的卷积神经网络
- NLP教程(9)- 句法分析与树形递归神经网络
斯坦福 CS224n 课程带学详解
- 斯坦福NLP课程 | 第1讲 - NLP介绍与词向量初步
- 斯坦福NLP课程 | 第2讲 - 词向量进阶
- 斯坦福NLP课程 | 第3讲 - 神经网络知识回顾
- 斯坦福NLP课程 | 第4讲 - 神经网络反向传播与计算图
- 斯坦福NLP课程 | 第5讲 - 句法分析与依存解析
- 斯坦福NLP课程 | 第6讲 - 循环神经网络与语言模型
- 斯坦福NLP课程 | 第7讲 - 梯度消失问题与RNN变种
- 斯坦福NLP课程 | 第8讲 - 机器翻译、seq2seq与注意力机制
- 斯坦福NLP课程 | 第9讲 - cs224n课程大项目实用技巧与经验
- 斯坦福NLP课程 | 第10讲 - NLP中的问答系统
- 斯坦福NLP课程 | 第11讲 - NLP中的卷积神经网络
- 斯坦福NLP课程 | 第12讲 - 子词模型
- 斯坦福NLP课程 | 第13讲 - 基于上下文的表征与NLP预训练模型
- 斯坦福NLP课程 | 第14讲 - Transformers自注意力与生成模型
- 斯坦福NLP课程 | 第15讲 - NLP文本生成任务
- 斯坦福NLP课程 | 第16讲 - 指代消解问题与神经网络方法
- 斯坦福NLP课程 | 第17讲 - 多任务学习(以问答系统为例)
- 斯坦福NLP课程 | 第18讲 - 句法分析与树形递归神经网络
- 斯坦福NLP课程 | 第19讲 - AI安全偏见与公平
- 斯坦福NLP课程 | 第20讲 - NLP与深度学习的未来