• 作者:韩信子@ShowMeAI
  • 教程地址:https://www.showmeai.tech/tutorials/36
  • 本文地址:https://www.showmeai.tech/article-detail/237
  • 声明:版权所有,转载请联系平台与作者并注明出处
  • 收藏ShowMeAI查看更多精彩内容


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


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


概述

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

内容要点

  • Dependency Grammar
  • Dependency Structure
  • Neural Dependency Parsing
  • 依存解析
  • 依存句法
  • 语法依赖

1.依存语法与依存结构

与编译器中的解析树类似,NLP中的解析树是用于分析句子的句法结构。使用的结构主要有两种类型——短语结构依存结构

短语结构文法使用短语结构语法将词组织成嵌套成分。后面的内容会展开对它做更详细的说明。我们现在关注依存语法。

句子的依存结构展示了单词依赖于另外一个单词 (修饰或者是参数)。词与词之间的二元非对称关系称为依存关系,描述为从head (被修饰的主题) 用箭头指向dependent (修饰语)。一般这些依存关系形成树结构,他们通常用语法关系的名称 (主体,介词宾语,同位语等)。

Bills on ports and immigration were submitted by Senator Brownback, Republican of Kansas. 依存树的例子如下图所示:

有时,在依存树的头部增加一个假的ROOT节点,这样每个单词都依存于唯一一个节点。

1.1 依存分析

依存语法是给定一个输入句子 SSS,分析句子的句法依存结构的任务。依存句法的输出是一棵依存语法树,其中输入句子的单词是通过依存关系的方式连接。

正式一点定义,依存语法问题就是创建一个输入句子的单词 S=w0w1⋯wnS=w_{0}w_{1} \cdots w_{n}S=w0​w1​⋯wn​ (其中 w0w_{0}w0​ 是 ROOT) 到它的依存语法树的映射图 GGG。最近几年提出了很多以依存句法为基础的的变体,包括基于神经网络的方法,我们将会在后面介绍。

确切地说,在依存语法中有两个子问题:

  • 学习:给定用依赖语法图标注的句子的训练集 DDD,创建一个可以用于解析新句子的解析模型 MMM
  • 解析:给定解析模型 MMM 和句子 SSS,根据 MMM 得到 SSS 的最优依存语法图

1.2 基于转移的依存分析

Transition-based 依存语法依赖于定义可能转换的状态机,以创建从输入句到依存句法树的映射。

  • 学习」问题是创建一个可以根据转移历史来预测状态机中的下一个转换的模型。
  • 解析」问题是使用在学习问题中得到的模型对输入句子构建一个最优的转移序列

大多数 Transition-based 系统不会使用正式的语法。

1.3 Greedy Deterministic Transition-Based Parsing

这个系统是由 Nivre 在 2003 年提出,与当时的常用方法截然不同。

这个转换系统是一个状态机,它由状态和这些状态之间的转换组成。该模型导出了从初始状态到几种终端状态之一的一系列转换。

1) 状态

对任意句子 S=w0w1⋯wnS=w_{0}w_{1} \cdots w_{n}S=w0​w1​⋯wn​,一个状态可以描述为一个三元组 c=(σ,β,A)c=(\sigma, \beta,A)c=(σ,β,A):

  • ① 来自 SSS 的单词 wiw_{i}wi​ 的堆 σ\sigmaσ

  • ② 来自 SSS 的单词 wiw_{i}wi​ 的缓冲区 β\betaβ

  • ③ 一组形式为 (wi,r,wj)(w_{i},r,w_{j})(wi​,r,wj​) 的依存弧,其中 wi,wjw_{i},w_{j}wi​,wj​ 是来自 SSS,和 rrr 描述依存关系。

因此,对于任意句子 S=w0w1⋯wnS=w_{0}w_{1} \cdots w_{n}S=w0​w1​⋯wn​:

  • ① 一个形式为 ([w0]σ,[w1,⋯,wn]β,∅)([w_{0}]_{\sigma},[w_{1}, \cdots ,w_{n}]_{\beta},\varnothing)([w0​]σ​,[w1​,⋯,wn​]β​,∅) 的初始状态 c0c_{0}c0​ (现在只有 ROOT 在堆 σ\sigmaσ 中,没有被选择的单词都在缓冲区 β\betaβ 中。

  • ② 一个形式为 (σ,[]β,A)(\sigma,[]_{\beta},A)(σ,[]β​,A) 的终点状态。

2) 转移

在状态之间有三种不同类型的转移:

  • ① SHIFTSHIFTSHIFT:移除在缓冲区的第一个单词,然后将其放在堆的顶部 (前提条件:缓冲区不能为空)。

  • ② Left-ArcrLeft\text{-}Arc_{r}Left-Arcr​:向依存弧集合 AAA 中加入一个依存弧 (wj,r,wi)(w_{j},r,w_{i})(wj​,r,wi​),其中 wiw_{i}wi​ 是堆顶的第二个单词, wjw_{j}wj​ 是堆顶部的单词。从栈中移除 wiw_{i}wi​ (前提条件:堆必须包含两个单词以及 wiw_{i}wi​ 不是 ROOT )

  • ③ Right-ArcrRight\text{-}Arc_{r}Right-Arcr​:向依存弧集合 AAA 中加入一个依存弧 (wi,r,wj)(w_{i},r,w_{j})(wi​,r,wj​),其中 wiw_{i}wi​ 是堆顶的第二个单词, wjw_{j}wj​ 是堆顶部的单词。从栈中移除 wjw_{j}wj​ (前提条件:堆必须包含两个单词)

下图给出了这三个转换的更正式的定义:

1.4 神经网络依存解析器

虽然依赖项解析有很多深层模型,这部分特别侧重于贪心,基于转移的神经网络依存语法解析器。与传统的基于特征的判别依存语法解析器相比,神经网络依存语法解析器性能和效果更好。与以前模型的主要区别在于这类模型依赖稠密而不是稀疏的特征表示。

我们将要描述的模型采用上一部分中讲述的标准依存弧转换系统。最终,模型的目标是预测从一些初始状态 ccc 到一个终点状态的转换序列,对模型中的依存语法树进行编码的。

由于模型是贪心的,它基于从当前的状态 c=(σ,β,A)c=(\sigma, \beta, A)c=(σ,β,A) 提取特征,然后尝试一次正确地预测一次转移 T∈{SHIFT,Left-Arcr,Right-Arcr}T\in \{SHIFT, Left\text{-}Arc_{r},Right\text{-}Arc_{r}\}T∈{SHIFT,Left-Arcr​,Right-Arcr​}。回想一下, σ\sigmaσ 是栈,β\betaβ 是缓存, AAA 是对于一个给定的句子的依赖弧的集合。

1) 特征选择

根据该模型所需的复杂性,定义神经网络的输入是灵活的。对给定句子 SSS 的特征包含一些子集:

  • ① SwordS_{word}Sword​:在堆 σ\sigmaσ 的顶部和缓冲区 β\betaβ 的 SSS 中一些单词的词向量 (和它们的依存)。

  • ② StagS_{tag}Stag​:在 SSS 中一些单词的词性标注 ( POS )。词性标注是由一个离散集合组成:P={NN,NNP,NNS,DT,JJ,⋯}\mathcal{P}=\{NN,NNP,NNS,DT,JJ, \cdots \}P={NN,NNP,NNS,DT,JJ,⋯}。

  • ③ SlabelS_{label}Slabel​:在 SSS 中一些单词的依存标签。依存标签是由一个依存关系的离散集合组成:L={amod,tmod,nsubj,csubj,dobj,⋯}\mathcal{L}=\{amod,tmod,nsubj,csubj,dobj, \cdots \}L={amod,tmod,nsubj,csubj,dobj,⋯}。

对每种特征类型,我们都有一个对应的将特征的 one-hot 编码映射到一个 ddd 维的稠密的向量表示的嵌入矩阵。

  • SwordS_{word}Sword​ 的完全嵌入矩阵是 Ew∈Rd×NwE^{w}\in \mathbb{R}^{d\times N_{w}}Ew∈Rd×Nw​,其中 NwN_{w}Nw​ 是字典/词汇表的大小。

  • POS 和依存标签的嵌入矩阵分别为 Et∈Rd×NtE^{t}\in \mathbb{R}^{d\times N_{t}}Et∈Rd×Nt​ 和 El∈Rd×NlE^{l}\in \mathbb{R}^{d\times N_{l}}El∈Rd×Nl​,其中 NtN_{t}Nt​ 和 NlN_{l}Nl​ 分别为不同词性标注和依存标签的个数。

最后,定义从每组特征中选出的元素的数量分别为 nwordn_{word}nword​,ntagn_{tag}ntag​,nlabeln_{label}nlabel​。

2) 特征选择的例子

作为一个例子,考虑一下对 SwordS_{word}Sword​,StagS_{tag}Stag​ 和 SlabelS_{label}Slabel​ 的选择:

  • ① SwordS_{word}Sword​:在堆和缓冲区的前三个单词:s1,s2,s3,b1,b2,b3s_{1},s_{2},s_{3},b_{1},b_{2},b_{3}s1​,s2​,s3​,b1​,b2​,b3​。栈顶部两个单词的第一个和第二个的 leftmost / rightmost 的子单词:lc1(si),rc1(si),lc2(si),rc2(si),i=1,2lc_{1}(s_{i}),rc_{1}(s_{i}),lc_{2}(s_{i}),rc_{2}(s_{i}),i=1,2lc1​(si​),rc1​(si​),lc2​(si​),rc2​(si​),i=1,2。栈顶部两个单词的第一个和第二个的 leftmost of leftmost / rightmost of rightmost 的子单词:lc1(lc1(si)),rc1(rc1(si)),i=1,2lc_{1}(lc_{1}(s_{i})),rc_{1}(rc_{1}(s_{i})),i=1,2lc1​(lc1​(si​)),rc1​(rc1​(si​)),i=1,2。SwordS_{word}Sword​ 总共含有 nword=18n_{word}=18nword​=18 个元素。

  • ② StagS_{tag}Stag​:相应的词性标注,则 StagS_{tag}Stag​ 含有 ntag=18n_{tag}=18ntag​=18 个元素。

  • ③ SlabelS_{label}Slabel​:单词的对应的依存标签,不包括堆/缓冲区上的 666 个单词,因此 SlabelS_{label}Slabel​ 含有 nlabel=12n_{label}=12nlabel​=12 个元素。

注意我们使用一个特殊的 NULLNULLNULL 表示不存在的元素:当堆和缓冲区为空或者还没有指定依存关系时。

对一个给定句子例子,我们按照上述的方法选择单词,词性标注和依存标签,从嵌入矩阵 Ew,Et,ElE^{w},E^{t},E^{l}Ew,Et,El 中提取它们对应的稠密的特征的表示,然后将这些向量连接起来作为输入 [xw,xt,xl][x^{w},x^{t},x^{l}][xw,xt,xl]。

在训练阶段,我们反向传播到稠密的向量表示,以及后面各层的参数。

3) 前馈神经网络模型

(关于前馈神经网络的内容也可以参考ShowMeAI的对吴恩达老师课程的总结文章深度学习教程 | 神经网络基础,深度学习教程 | 浅层神经网络和深度学习教程 | 深层神经网络

这个神经网络包含一个输入层 [xw,xt,xl][x^{w},x^{t},x^{l}][xw,xt,xl],一个隐藏层,以及具有交叉熵损失函数的最终 softmax 层。

我们可以在隐藏层中定义单个权值矩阵,与 [xw,xt,xl][x^{w},x^{t},x^{l}][xw,xt,xl] 进行运算,我们可以使用三个权值矩阵 [W1w,W1t,W1l][W^{w}_{1},W^{t}_{1},W^{l}_{1}][W1w​,W1t​,W1l​],每个矩阵对应着相应的输入类型,如下图所示。

然后我们应用一个非线性函数并使用一个额外的仿射层 [W2][W_{2}][W2​],使得对于可能的转移次数 (输出维度) ,有相同数量的 softmax 概率。

  • Softmax layer: p=softmax⁡(W2h)p=\operatorname{softmax}\left(W_{2} h\right)p=softmax(W2​h)
  • Hidden layer: h=(W1wxw+W1txt+W1lxl+b1)3h=\left(W_{1}^{w} x^{w}+W_{1}^{t} x^{t}+W_{1}^{l} x^{l}+b_{1}\right)^{3}h=(W1w​xw+W1t​xt+W1l​xl+b1​)3
  • Input layer:[xw,xt,xl]\left[x^{w}, x^{t}, x^{l}\right][xw,xt,xl]

注意在上图中,使用的非线性函数是 f(x)=x3f(x)=x^{3}f(x)=x3。

有关 greedy transition-based 神经网络依存语法解析器的更完整的解释,请参考论文:[A Fast and Accurate Dependency Parser using Neural Networks](https://cs.stanford.edu/~danqi/papers/emnlp2014.pdf)。

2.参考资料

  • 《ShowMeAI 深度学习与自然语言处理教程》的PDF在线阅读版本 - note4
  • 《斯坦福CS224n深度学习与自然语言处理》课程学习指南
  • 《斯坦福CS224n深度学习与自然语言处理》课程大作业解析
  • 双语字幕视频】斯坦福CS224n | 深度学习与自然语言处理(2019·全20讲)

ShowMeAI 深度学习与自然语言处理教程(完整版)

ShowMeAI 斯坦福NLP名课 CS224n带学详解(20讲·完整版)

ShowMeAI系列教程精选推荐

深度学习与自然语言处理教程(4) - 句法分析与依存解析(NLP通关指南·完结)相关推荐

  1. 深度学习与自然语言处理教程(9) - 句法分析与树形递归神经网络(NLP通关指南·完结)

    作者:韩信子@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/36 本文地址:https://www.showmeai.tech/article-d ...

  2. 深度学习与自然语言处理教程(8) - NLP中的卷积神经网络(NLP通关指南·完结)

    作者:韩信子@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/36 本文地址:https://www.showmeai.tech/article-d ...

  3. 深度学习与自然语言处理教程(5) - 语言模型、RNN、GRU与LSTM(NLP通关指南·完结)

    作者:韩信子@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/36 本文地址:https://www.showmeai.tech/article-d ...

  4. 深度学习与自然语言处理教程(3) - 神经网络与反向传播(NLP通关指南·完结)

    作者:韩信子@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/36 本文地址:https://www.showmeai.tech/article-d ...

  5. 深度学习与自然语言处理教程(7) - 问答系统(NLP通关指南·完结)

    作者:韩信子@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/36 本文地址:https://www.showmeai.tech/article-d ...

  6. 深度学习与自然语言处理教程(6) - 神经机器翻译、seq2seq与注意力机制(NLP通关指南·完结)

    作者:韩信子@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/36 本文地址:https://www.showmeai.tech/article-d ...

  7. 深度学习与自然语言处理教程(1) - 词向量、SVD分解与Word2Vec(NLP通关指南·完结)

    作者:韩信子@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/36 本文地址:https://www.showmeai.tech/article-d ...

  8. 深度学习与自然语言处理教程(2) - GloVe及词向量的训练与评估(NLP通关指南·完结)

    作者:韩信子@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/36 本文地址:https://www.showmeai.tech/article-d ...

  9. 斯坦福NLP名课带学详解 | CS224n 第20讲 - NLP与深度学习的未来(NLP通关指南·完结)

    作者:韩信子@ShowMeAI,路遥@ShowMeAI,奇异果@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/36 本文地址:https://ww ...

最新文章

  1. 计算机应用基础任务化教程知识点,计算机应用基础任务化教程教学大纲资料.doc...
  2. 【直播】今晚言有三阿里云直播、赠书+书籍解读+案例剖析
  3. SAP系统配置常用命令大全
  4. python实现排序算法_数据结构之(3)python实现排序算法
  5. Fiori as a Service - FaaS - Creation of inline task option is not available
  6. 祝融号火星车亮相,每小时仅移动40米,为何比乌龟还慢?
  7. python可变对象与不可变对象_python 可变对象与不可变对象
  8. (128)System Verilog下降沿检测实例
  9. 安装Python-2.5.2,并修改默认python版本
  10. Java支付宝app wap支付接入
  11. java gps解析_GPS经纬度可以用来Java解析
  12. Android中TextView中文字体粗体的设置方法
  13. 计算机矩阵入门(eigen)0XC000041D
  14. 分类算法-决策树、随机森林
  15. Java中抽象类的概述及其详解(什么是抽象类?为什么要使用抽象类?抽象类的特点?)
  16. “区块链”将彻底改变人类社会文明,颠覆世界最强大的企业
  17. CSS source
  18. MST56XXB 60V,150mA,2.1uA,高PSRR,高压低压差线性稳压器
  19. 【雷达通信】基于matlab大规模MIMO三维信道【含Matlab源码 2105期】
  20. java开源线程池_线程池 - Java 并发性和多线程 - UDN开源文档

热门文章

  1. 矩阵内积、外积(克罗内克积)和Hadamard积
  2. 【JAVA】(vip)蓝桥杯试题 基础练习 阶乘计算 BASIC-30 JAVA
  3. Keras_examples
  4. 用JS写一个《俄罗斯方块》小游戏
  5. git/github入门
  6. input只能输入数字0-9(不含小数点)
  7. Xorg Drivers
  8. Codeforces 1144 D
  9. ORA-01652: 无法通过 128 (在表空间 LTE_PM_TEMP 中) 扩展 temp 段
  10. 手把手教你逆向分析 Android 程序 1