Convolutional Sequence to Sequence Learning

论文链接:https://arxiv.org/abs/1705.03122

一、模型框架(A Convolutional Architecture)

1、模型的整体架构图:

2、位置向量(Position Embeddings)

  • 对于源句子:我们令源句子为 我们将其向量化为 其中 是词向量矩阵D中的一行。我们将X中的每个词的绝对位置编码成与词向量相同大小的位置向量: 。我们将XP相加可得到最终输入元素的表示: 其中 。这样encode的最终就是E
  • 对于目标句子:由于在训练期间我们的目标句子是已知的所以我们可以对目标句子 做一样的处理最终得到: ;所以训练期间的decoder的输入就是G。

3、卷积块结构(Convolutional Block Structure)

        编码器和解码器都是由一个卷积快堆叠而成,每个卷积块由一个卷积层和一个非线性变换层组成。

  • 卷积层:
  1. 对于一个核宽(kernel)为k的卷积层,它的每一个输出元素 都包含了其输入序列中的k个元素  )的信息;这相当于给输入词 加上了上下文信息得到 ;由此我们可以类推,如果我们在原始输入序列上堆叠n个卷积层,那么最顶端的卷积层的输出 是综合了 附近n*k词的上下文信息的表示;一般 会比 维度更大(更长),论文中设置 长度是 长度的两倍。
  2. 卷积层的工作过程:我们可以将卷积核参数化为: ;它的输入表示为:  )k个词词向量的拼接,每个词向量的维度为d即 ;它的输入表示为: ,卷积层将 映射为 也可以表示为: 其中
  • 非线性变换层:
  • 论文中选择GLU作为非线性单元,它在卷积的输出上实现了一个简单的门机制。非线性变换层可以用下面公式表示:

  • 它的输入是卷积层的输出Y,将Y拆成两半输入GLU单元,它的输出的维度为d即ViRd 。这样整个卷积块将IiRd 转化为ViRd ,大小和位置都不变但是在Vi 中加入了Ii 周围的上下文信息。

  • 残差连接(residual connections):
  • 为了能构建深度卷积网络,在卷积层的输入和块输出之间添加了残差连接。假设将编码器第l个块的输出表示为 ,则残差连接可以表示为:

  • 卷积块输入的填充
  1. 对于编码器:我们通过补齐每层的输入来确保卷积层的输出能匹配输入的长度;因为我们每次对第i个输入进行卷积块处理时都是以该词为中心向两边开一个大小为k的窗口,将窗口中从向量拼接交给卷积块产生第i个输出。但是对于输入序列两端的位置它们可能无法在输入序列上开辟一个以自己为中心大小为k的窗口,这样就需要对输入序列进行零向量的填充。一般情况是在输入序列两端分别添加k/2个零向量即可。
  2. 对于解码器:解码器比较特殊,因为我们要使每个词都只能卷积自己前面词的信息,即对于输入的第i个位置通过卷积块得到的第i个位置的输出是输入序列中区间[i-k,i]的信息的综合。因为解码中我们每次对第i个输入进行卷积块处理时都是以该词为终点向前开一个大小为k的窗口,将窗口中从向量拼接交给卷积块产生第i个输出。但是对于输入序列靠前端的位置它们可能无法在输入序列上开辟一个以自己为终点大小为k的窗口,这样就需要对输入序列进行零向量的填充。一般情况是在输入序列前端分别添加k-1个零向量即可。

4、多步注意力机制(Multi-step Attention)

        我们为每个解码器层引入单独的注意力机制。假设将解码器第l个块的输出表示为 ,为了计算注意力,我们将当前的解码器状态 与前一个目标词的词向量 相结合:

        对于解码层l,状态i和源元素j的注意力分数 与最后编码器块u的每个输出 之间的点乘积:下面公式是经过softmax层后的

        当前解码层的条件输入 是编码器输出以及输入元素词词向量 的加权和:

        一旦 计算得到,就可以加到对应的解码层的输出 上:

        这样最后得到的 是加入了attention的编码器第i个输出

       最后:我们通过线性层( )对解码器顶层的输出 做线性变换,以计算 的概率分布:

 

二、一些优化技巧:

1、归一化策略(Normalization Strategy)

  • 我们通过细致的权重初始化来保证网络稳定地学习,并通过对部分网络进行缩放来确保网络方差不会发生显著变化。特别地,我们缩放残差块的输出以及注意力分数以保持激活的方差。我们将残差块的输入和输出的总和乘以 将和的方差减半。这假设两个求和都具有相同的方差,这并不一定是对的,但在实践中是有效的
  • 由注意力分数得到的条件输入cilm个向量的加权和,且通过乘以 来抵消方差变化。假设注意力分数是均匀分布,我们乘以m将输入放大到原始大小。一般情况并非如此,但我们发现它在实践中运行良好
  • 对于多重注意的卷积解码器,我们通过所用的注意力机制的数量来缩放编码器层的梯度;我们排除源的词嵌入。我们发现这是为了稳定学习,因为否则编码器会收到太多的梯度

2、初始化(Initialization)

  • 所有的词嵌入都由平均值为0以及标准差为0.1的正太分布进行初始化。
  • 对于输出不直接给GLU的层,我们使用 的正太分布进行初始化,其中nl 是每个神经元的连接数。这确保了正太分布的方差得以保留。
  • 对于有GLU的层,如果GLU输入以均值0分布并且具有足够小的方差,则可以用输入方差的1/4来近似输出方差。因此,我们初始化权重,使得GLU激活的输入具有输入层的方差的4倍。这是通过 的正太分布初始化它们的初始值来实现的。当网络构建时,偏差均匀设置为零。
  • 我们对一些层的输入采用了dropout,以便以概率p来保留输入。这可以看作是与伯努利随机变量一个乘积,而伯努利随机变量以p的概率取值为1/p其他取值为0。dropout的使用会造成方差缩放1/p。我们的目标是通过用较大的权重初始化各个层来恢复输入方差。具体来说,我们对带有GLU的层的输出使用 ,否则使用

 

猜你喜欢

转载自blog.csdn.net/ACM_hades/article/details/85014368