博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
7.5图卷积编码器-解码器
阅读量:3950 次
发布时间:2019-05-24

本文共 5719 字,大约阅读时间需要 19 分钟。

文章目录

1、前言

图卷积编码是让编码器能够访问丰富的语法信息,但让它决定语法的哪些方面对MT(机器翻译)有益,而不是对语法和翻译任务之间的交互执行严格的约束,因为严格的语法限制通常会损害机器翻译。

基于的NMT系统,将源句词表示为编码器中的潜在特征向量,并在生成翻译时使用这些向量。

图卷积编码目标是将源词的语法邻域信息自动合并到这些特征向量中,从而潜在地提高翻译输出的质量。因为向量对应于单词,所以很自然地使用依赖语法。依赖树(见图1)表示单词之间的句法关系:例如,monkey是谓语eat的主语,banana是谓语eat的宾语。

image-20210623192559093

图 1 : 依 赖 树 图1:依赖树 1:
使用GCN生成单词的语法感知特征表征,GCN可以被视为基于节点的k阶邻域(即距离节点最多k跳的节点)计算节点(即实值向量)的潜在特征表征。

2、图卷积神经网络

GCN是一个多层神经网络,它直接在图上运行,将节点的邻域信息编码为实值向量。在每个GCN层中,信息沿着图的边流动;换句话说,每个节点接收来自其所有邻居的消息。当多个GCN层被堆叠时,关于更大邻居的信息就会被集成。例如,在第二层中,一个节点将从它的邻居接收信息,但是这些信息已经包含了来自它们各自的邻居的信息。通过选择GCN层数, 调节了信息传播的距离:在 k k k层中,一个节点接收来自邻居的信息最多有 k k k个跳数。

形式上,考虑一个无向图 G = \mathcal{G}= G= ( V , E ) (\mathcal{V}, \mathcal{E}) (VE),其中 V \mathcal{V} V是一个 n n n节点的集合,而 E \mathcal{E} E是一个边的集合。每个节点都被假定是连接到自己的,即 ∀ v ∈ V : ( v , v ) ∈ E \forall v \in \mathcal{V}:(v, v) \in \mathcal{E} vV:(v,v)E

X ∈ R d × n X \in \mathbb{R}^{d \times n} XRd×n是一个包含所有 n n n节点及其特征的矩阵,其中 d d d是特征向量的维数。 X X X将包含单词嵌入,但通常它可以包含任何类型的特征。对于1层GCN,新的节点表征计算如下:

h v = ρ ( ∑ u ∈ N ( v ) W x u + b ) \mathbf{h}_{v}=\rho\left(\sum_{u \in \mathcal{N}(v)} W \mathbf{x}_{u}+\mathbf{b}\right) hv=ρuN(v)Wxu+b
其中 W ∈ R d × d W \in \mathbb{R}^{d \times d} WRd×d是一个权重矩阵, b ∈ R d \mathbf{b} \in \mathbb{R}^{d} bRd是一个偏置向量。 ρ \rho ρ是一个激活函数,例如ReLU。 N ( v ) \mathcal{N}(v) N(v) v v v的邻居集合,这里我们假设 v v v总是包含它自己。为了允许信息在多个跃点上流动,需要堆叠GCN层。递归计算如下:
h v ( j + 1 ) = ρ ( ∑ u ∈ N ( v ) W ( j ) h u ( j ) + b ( j ) ) \mathbf{h}_{v}^{(j+1)}=\rho\left(\sum_{u \in \mathcal{N}(v)} W^{(j)} \mathbf{h}_{u}^{(j)}+\mathbf{b}^{(j)}\right) hv(j+1)=ρuN(v)W(j)hu(j)+b(j)
其中j索引层,和 h v ( 0 ) = x v \mathbf{h}_{v}^{(0)}=\mathbf{x}_{v} hv(0)=xv

3、语法GCN

方向性

为了处理边的方向性,分别对入边和出边使用权重矩阵。遵循这样的约定:在依赖树中,头指向它们的依赖项,因此,输出边用于 head-to-dependent 的连接,传入边用于dependent-to-head的连接。修改方向性的循环计算,得到:

h v ( j + 1 ) = ρ ( ∑ u ∈ N ( v ) W dir ⁡ ( u , v ) ( j ) h u ( j ) + b dir ⁡ ( u , v ) ( j ) ) \mathbf{h}_{v}^{(j+1)}=\rho\left(\sum_{u \in \mathcal{N}(v)} W_{\operatorname{dir}(u, v)}^{(j)} \mathbf{h}_{u}^{(j)}+\mathbf{b}_{\operatorname{dir}(u, v)}^{(j)}\right) hv(j+1)=ρuN(v)Wdir(u,v)(j)hu(j)+bdir(u,v)(j)
其中 dir ⁡ ( u , v ) \operatorname{dir}(u, v) dir(u,v)选择与 u u u v v v之间的边的方向性相关的权值矩阵(即 W I N W_{\mathrm{IN}} WIN u u u -to- v , W OUT  v, W_{\text {OUT }} v,WOUT  v v v -to- u u u W LOOP  W_{\text {LOOP }} WLOOP  v v v -to- v v v )。注意,自循环是单独建模的,因此现在有三倍于非定向GCN的参数。

标签

考虑到上述方向性的修改,使GCN对标签敏感是很简单的。不再为每个方向使用单独的矩阵,现在为每个方向和标签组合定义单独的矩阵:

h v ( j + 1 ) = ρ ( ∑ u ∈ N ( v ) W lab ⁡ ( u , v ) ( j ) h u ( j ) + b lab ⁡ ( u , v ) ( j ) ) \mathbf{h}_{v}^{(j+1)}=\rho\left(\sum_{u \in \mathcal{N}(v)} W_{\operatorname{lab}(u, v)}^{(j)} \mathbf{h}_{u}^{(j)}+\mathbf{b}_{\operatorname{lab}(u, v)}^{(j)}\right) hv(j+1)=ρuN(v)Wlab(u,v)(j)hu(j)+blab(u,v)(j)
将一条边的方向性直接合并到它的标签中。

重要的是,为了防止过度参数化,只有偏置项是特定于标签的,换句话说: W lab ⁡ ( u , v ) = W dir ⁡ ( u , v ) W_{\operatorname{lab}(u, v)}=W_{\operatorname{dir}(u, v)} Wlab(u,v)=Wdir(u,v)

生成的语法GCN如图2所示(显示在CNN之上,将在后面的小节中解释)。

逐边门

句法GCN还包括门,可以降低单个边的贡献。它们还允许模型处理嘈杂的预测结构,即忽略潜在的错误的语法边缘。对于每条边,一个标量门的计算方法如下:

g u , v ( j ) = σ ( h u ( j ) ⋅ w ^ dir ⁡ ( u , v ) ( j ) + b ^ lab ⁡ ( u , v ) ( j ) ) g_{u, v}^{(j)}=\sigma\left(\mathbf{h}_{u}^{(j)} \cdot \hat{\mathbf{w}}_{\operatorname{dir}(u, v)}^{(j)}+\hat{b}_{\operatorname{lab}(u, v)}^{(j)}\right) gu,v(j)=σ(hu(j)w^dir(u,v)(j)+b^lab(u,v)(j))
其中 σ \sigma σ是logistic sigmoid函数,而 w ^ dir ⁡ ( u , v ) ( j ) ∈ R d \hat{\mathbf{w}}_{\operatorname{dir}(u, v)}^{(j)} \in \mathbb{R}^{d} w^dir(u,v)(j)Rd b ^ lab ⁡ ( u , v ) ( j ) ∈ R \hat{b}_{\operatorname{lab}(u, v)}^{(j)} \in \mathbb{R} b^lab(u,v)(j)R 是门的学习参数。计算就变成:
h v ( j + 1 ) = ρ ( ∑ u ∈ N ( v ) g u , v ( j ) ( W dir ⁡ ( u , v ) ( j ) h u ( j ) + b lab ⁡ ( u , v ) ( j ) ) ) \mathbf{h}_{v}^{(j+1)}=\rho\left(\sum_{u \in \mathcal{N}(v)} g_{u, v}^{(j)}\left(W_{\operatorname{dir}(u, v)}^{(j)} \mathbf{h}_{u}^{(j)}+\mathbf{b}_{\operatorname{lab}(u, v)}^{(j)}\right)\right) hv(j+1)=ρuN(v)gu,v(j)(Wdir(u,v)(j)hu(j)+blab(u,v)(j))

image-20210623184343964

图 2 : 一 种 基 于 卷 积 编 码 器 的 两 层 语 法 G C N 。 循 环 连 接 用 点 划 线 描 述 , 语 法 连 接 用 实 线 ( 依 赖 到 头 ) 和 点 线 ( 头 到 依 赖 ) 边 描 述 。 图2:一种基于卷积编码器的两层语法GCN。循环连接用点划线描述,语法连接用实线(依赖到头 )和点线(头到依赖)边描述。 2GCN线线()线()

4、图卷积编码器

在这项工作中,着重于利用结构信息的源端,即编码器。假设,使用包含语法的编码器将导致单词的更多信息表示,并且当解码器使用这些表征作为上下文向量时,将导致翻译质量的提高。因此,使用seq2seq的解码器,并保持模型的这一部分不变。正如现在的常见做法,在解码器中不使用maxout层,但除此之外,不会偏离最初的定义。在所有模型中,使用gru 。

模型在编码器部分有所不同,在编码器部分,利用GCN的能力来诱导具有语法意识的表征。现在定义了一系列越来越复杂的编码器

BoW + GCN

首先通过词袋编码器(带有位置嵌入)来表示单词,再喂给一个GCN。换句话说,输入 h ( 0 ) h^{(0)} h(0)是一个词的嵌入和它在句子中的位置之和。由于原来的BoW编码器仅以非常粗糙的方式(通过位置嵌入)捕获线性排序信息,GCN提供的结构信息应该是非常有益的。

词袋编码器:

BoW ⁡ ( x 1 : T x , t ) = x t + p t \operatorname{BoW}\left(\mathbf{x}_{1: T_{x}}, t\right)=\mathbf{x}_{t}+\mathbf{p}_{t} BoW(x1:Tx,t)=xt+pt
其中 x t \mathrm{x}_{t} xt是单词嵌入, p t \mathbf{p}_{t} pt是第 t \mathrm{t} t 位置。

卷积+ GCN

使用卷积神经网络来学习单词表示。cnn的速度很快,根据定义,它只使用有限的上下文窗口。使用GCN来丰富单层CNN表示。

图2显示了这个模型。请注意,虽然图中显示的CNN窗口大小为3,但在的实验中,将使用更大的窗口大小为5。

形式上,给定一个输入序列 x 1 : T x \mathbf{x}_{1: T_{x}} x1:Tx,定义一个CNN如下:

C N N ( x 1 : T x , t ) = f ( x t − ⌊ w / 2 ⌋ , . . , x t , . . , x t + ⌊ w / 2 ⌋ ) \mathrm{CNN}\left(\mathrm{x}_{1: T_{x}}, t\right)=f\left(\mathrm{x}_{t-\lfloor w / 2\rfloor}, . ., \mathrm{x}_{t}, . ., \mathrm{x}_{t+\lfloor w / 2\rfloor}\right) CNN(x1:Tx,t)=f(xtw/2,..,xt,..,xt+w/2)
其中 f f f是一个非线性函数,通常是一个线性变换后的ReLU,而 w w w是窗口的大小。

BiRNN + GCN

第三个也是最强大的模型中,使用了BiGRU。在这个模型中,首先使用BiGRU对源语句进行编码,然后使用生成的隐藏状态作为GCN的输入。

与仅仅依赖序列顺序不同,GCN将允许编码器沿依赖关系边缘在输入句子的部分传送,连接那些本来可能相隔很远的单词。然而,该模型可能不仅受益于这种传送能力;此外,单词之间的关系(即依赖关系类型)的性质可能是有用的,GCN利用了这一信息。

这对于GCN来说是最具挑战性的设置,因为rnn已经被证明能够在没有明确监督的情况下捕获至少某种程度的语法信息,因此很难通过合并树库语法来改进它们。

但使用多个GCN层在语义角色标注方面的会有改进。假设第一层是最具影响力的一层,它捕获了大部分的语法上下文,而额外的层仅对表示进行了适当的修改。为了便于优化,当使用多个层时,在GCN层之间添加残余连接。

参考

Graph-to-Sequence Learning using Gated Graph Neural Networks

转载地址:http://ddyzi.baihongyu.com/

你可能感兴趣的文章
Linux内核中的platform机制
查看>>
寄存器编址
查看>>
在Ubuntu上搭建ssh和samba服务器
查看>>
Linux设备模型 学习总结682057749
查看>>
Udev 内核机制(kobject_uevent) 性能优化
查看>>
Android 事件处理
查看>>
Android事件处理分析+Android事件处理 +Android输入事件流程
查看>>
Linux C :遍历输出指定目录下的所有文件
查看>>
c++ 标准模板库 List
查看>>
Android键盘系统相关代码分析(1)
查看>>
Android键盘系统
查看>>
关于构造IOCTL命令的学习心得
查看>>
Android Keyboard/Touch Panel分析
查看>>
Linux Kernel and Android休眠与唤醒
查看>>
Android Framework 分析
查看>>
inotify -- Linux 2.6 内核中的文件系统变化通知机制
查看>>
C++和JNI的数据转换
查看>>
poll()函数的使用
查看>>
I/O多路复用详解(二)
查看>>
深入理解硬盘的Linux分区
查看>>