• Facebook的Fairseq模型详解(Convolutional Sequence to Sequence Learning)


    1. 前言

    近年来,NLP领域发展迅速,而机器翻译是其中比较成功的一个应用,自从2016年谷歌宣布新一代谷歌翻译系统上线,神经机器翻译(NMT,neural machine translation)就取代了统计机器翻译(SMT,statistical machine translation),在翻译质量上面获得了大幅的提高。目前神经机器翻译模型主要分为三种:

    1. 一种是以rnn为基础的模型, 一般是LSTM+attention,顺序处理输入信息。
    2. 一种是以cnn为基础的模型,今天要讲的Fairseq就属于这种
    3. 一种是完全依靠attention的模型,如谷歌的transformer

    2. Fairseq背景

    Fairseq 这个翻译模型由Facebook AI实验室在2017年提出,和以往以RNN为基础的翻译模型相比,采用了以cnn为主的模型结构。

    RNN的链式结构,能够很好地应用于处理序列信息。但是,RNN也存在着劣势:一个是由于RNN运行时是将序列的信息逐个处理,不能实现并行操作,导致运行速度慢;另一个是传统的RNN并不能很好地处理句子中的结构化信息,或者说更复杂的关系信息。

    相比之下,CNN的优势就凸显出来。文章提到用CNN做seq-seq这种翻译任务有3个好处:

    1. 通过卷积的叠加可以精确地控制上下文的长度,因为卷积之间的叠加可以通过公式直接计算出感受野是多少,从而知道上下文的长度,RNN虽然理论上有长时记忆的功能,但是在实际的训练过程中,间隔较远的时候,很难学到这种词与词之间的联系。
    2. 卷积可以进行并行计算,而RNN模型是时序的,只有前一帧得出结果才能进行后续的计算。
    3. 对于输入的一个单词而言,输入CNN网络,所经过的卷积核和非线性计算数量都是固定的,不过对于输入RNN的单词而言,第一个单词要经过n次unit的计算和非线性,但是最后一个单词只经过1次,文章说固定队输入所施加的非线性计算会有助于训练。

    3. 模型

    模型结构如下图所示:

    image

    image

    3.1 Position Embedding

    输入除了词向量之外,还加入了位置信息,最后的输入向量为词向量加上位置向量。

    词向量:(w=(w_1,w_2,...w_n))

    位置向量:(p=(p_1,p_2,...p_n))

    最终输入的向量:(e=(w_1+p_1,w_2+p_2,...w_n+p_n))

    3.2 Convolutional Block Structure

    encoder 和 decoder 都是由l层卷积层构成,encoder输出为(z^l),decoder输出为(h^l)。由于卷积网络是层级结构,通过层级叠加能够得到远距离的两个词之间的关系信息。

    这里把一次“卷积计算+非线性计算”看作一个单元Convolutional Block,这个单元在一个卷积层内是共享的。

    • 卷积计算:卷积核的大小为(W^{kd*2d}),其中(d)为词向量长度,(k)为卷积窗口大小,每次卷积生成两列(d)维向量
    • 非线性计算:非线性部分采用的是门控结构 gated linear units(GLU)。
    • encoder的残差连接:把当前层的输入与输出相加,残差的和输入到下一层conv_block网络中。

    [h_i^l=v(W^l[h_{i-frac{k}{2}}^{l-1},...,h_{i+frac{k}{2}}^{l-1}]+b^l_w)+h_i^{l-1} ]

    • decoder的残差连接:首先把当前层的输出和encoder的输出做attention计算,结果记为(c_i), 再将当前层的输出和(c_i)相加, 再将结果和当前层的输入相加,最后的残差的和输入到下一层conv_block网络中。

    [h_i^l=[v(W^l[h_{i-frac{k}{2}}^{l-1},...,h_{i+frac{k}{2}}^{l-1}]+b^l_w)+c_i]+h_i^{l-1} ]

    • 输出:decoder的最后一层卷积层的最后一个单元输出经过softmax得到下一个目标词的概率。

    [p = softmax(Wh^L+b) ]

    3.3 Multi-step Attention

    原理与传统的attention相似,attention权重由decoder的当前输出(h_i)和encoder的的所有输出(z_i)共同决定,利用该权重对encoder的输出进行加权,得到了表示输入句子信息的向量(c_i)(c_i)(h_i)相加组成新的(h_i)。计算公式如下:

    [d^l_i=W^l_dh^l_i+b_d^l+g_i ]

    [a^l_{ij}=frac{exp(d_i^lz_j^u)}{sum_{j=1}^mexp(d_i^lz_j^u)} ]

    [c^l_{i}=sum_{j=1}^ma_{ij}^l(z_j^u+e_j) ]

    这里(a_{ij}^l)是权重信息,采用了向量点积的方式再进行softmax操作,这里向量点积可以通过矩阵计算,实现并行计算。

    最终得到(c_i)(h_i)相加组成新的(h_i)。如此,在每一个卷积层都会进行 attention 的操作,得到的结果输入到下一层卷积层,这就是多跳注意机制multi-hop attention。这样做的好处是使得模型在得到下一个主意时,能够考虑到之前的已经注意过的词。

    4. 总结

    将CNN成功应用于seq2seq任务中,发挥了CNN并行计算和层级结构的优势。CNN的并行计算明显提高了运行速度,同时CNN的层级结构方便模型发现句子中的结构信息。

    同时模型中的一些细节处理,比如非线性部分采用的是门控结构 gated linear units(GLM),多跳注意机制multi-hop attention,都是模型效果提升的关键。

  • 相关阅读:
    七、基础数据类型补充
    JavaScript DOM 鼠标拖拽
    JavaScript JSON 与 AJAX
    JavaScript DOM 事件模型
    JavaScript DOM 样式操作
    JavaScript DOM 常用尺寸
    JavaScript 日期与计时器
    JavaScript DOM 基础
    JavaScript 数组
    JavaScript 对象拷贝
  • 原文地址:https://www.cnblogs.com/huangyc/p/10152296.html
Copyright © 2020-2023  润新知