Facebook的Fairseq模型详解(Convolutional Sequence to Sequence Learning)
1. 前言
近年来,NLP领域发展迅速,而机器翻译是其中比较成功的一个应用,自从2016年谷歌宣布新一代谷歌翻译系统上线,神经机器翻译(NMT,neural machine translation)就取代了统计机器翻译(SMT,statistical machine translation),在翻译质量上面获得了大幅的提高。目前神经机器翻译模型主要分为三种:
- 一种是以rnn为基础的模型, 一般是LSTM+attention,顺序处理输入信息。
- 一种是以cnn为基础的模型,今天要讲的Fairseq就属于这种
- 一种是完全依靠attention的模型,如谷歌的transformer
2. Fairseq背景
Fairseq 这个翻译模型由Facebook AI实验室在2017年提出,和以往以RNN为基础的翻译模型相比,采用了以cnn为主的模型结构。
RNN的链式结构,能够很好地应用于处理序列信息。但是,RNN也存在着劣势:一个是由于RNN运行时是将序列的信息逐个处理,不能实现并行操作,导致运行速度慢;另一个是传统的RNN并不能很好地处理句子中的结构化信息,或者说更复杂的关系信息。
相比之下,CNN的优势就凸显出来。文章提到用CNN做seq-seq这种翻译任务有3个好处:
- 通过卷积的叠加可以精确地控制上下文的长度,因为卷积之间的叠加可以通过公式直接计算出感受野是多少,从而知道上下文的长度,RNN虽然理论上有长时记忆的功能,但是在实际的训练过程中,间隔较远的时候,很难学到这种词与词之间的联系。
- 卷积可以进行并行计算,而RNN模型是时序的,只有前一帧得出结果才能进行后续的计算。
- 对于输入的一个单词而言,输入CNN网络,所经过的卷积核和非线性计算数量都是固定的,不过对于输入RNN的单词而言,第一个单词要经过n次unit的计算和非线性,但是最后一个单词只经过1次,文章说固定队输入所施加的非线性计算会有助于训练。
3. 模型
模型结构如下图所示:
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,都是模型效果提升的关键。
Facebook的Fairseq模型详解(Convolutional Sequence to Sequence Learning)的更多相关文章
- ASP.NET Core的配置(2):配置模型详解
在上面一章我们以实例演示的方式介绍了几种读取配置的几种方式,其中涉及到三个重要的对象,它们分别是承载结构化配置信息的Configuration,提供原始配置源数据的ConfigurationProvi ...
- ISO七层模型详解
ISO七层模型详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在我刚刚接触运维这个行业的时候,去面试时总是会做一些面试题,笔试题就是看一个运维工程师的专业技能的掌握情况,这个很 ...
- 28、vSocket模型详解及select应用详解
在上片文章已经讲过了TCP协议的基本结构和构成并举例,也粗略的讲过了SOCKET,但是讲解的并不完善,这里详细讲解下关于SOCKET的编程的I/O复用函数. 1.I/O复用:selec函数 在介绍so ...
- 第94天:CSS3 盒模型详解
CSS3盒模型详解 盒模型设定为border-box时 width = border + padding + content 盒模型设定为content-box时 width = content所谓定 ...
- JVM的类加载过程以及双亲委派模型详解
JVM的类加载过程以及双亲委派模型详解 这篇文章主要介绍了JVM的类加载过程以及双亲委派模型详解,类加载器就是根据指定全限定名称将 class 文件加载到 JVM 内存,然后再转化为 class 对象 ...
- 云时代架构阅读笔记六——Java内存模型详解(二)
承接上文:云时代架构阅读笔记五——Java内存模型详解(一) 原子性.可见性.有序性 Java内存模型围绕着并发过程中如何处理原子性.可见性和有序性这三个特征来建立的,来逐个看一下: 1.原子性(At ...
- css 06-CSS盒模型详解
06-CSS盒模型详解 #盒子模型 #前言 盒子模型,英文即box model.无论是div.span.还是a都是盒子. 但是,图片.表单元素一律看作是文本,它们并不是盒子.这个很好理解,比如说,一张 ...
- 图解机器学习 | LightGBM模型详解
作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/34 本文地址:http://www.showmeai.tech/article-det ...
- flink内存模型详解与案例
任务提交时的一些yarn设置(通用客户端模式) 指定并行度 -p 5 \ 指定yarn队列 -Dyarn.appl ...
随机推荐
- 【Servlet】java web 文件下载功能实现
需求:实现一个具有文件下载功能的网页,主要下载压缩包和图片 两种实现方法: 一:通过超链接实现下载 在HTML网页中,通过超链接链接到要下载的文件的地址 <!DOCTYPE html> & ...
- jquery ajax 回调函数的值alert出来[object Object] 解决方法
$("#activity_project").change(function(){ var pro=$("#activity_project").val(); ...
- C#创建文件夹并设置权限
原文地址:https://www.cnblogs.com/top5/archive/2010/04/12/1710141.html /* 需要添加以下命名空间: using System.IO; ...
- IDEA使用笔记(三)——小齿轮的显示和隐藏(Autoscroll from Source)
在玩快捷键的时候,不清楚自己操作了什么,突然间发现——能直接定位到当前可编辑文件的哪个小齿轮,不见了,找了一会也没弄出来,从网上搜索吧!也没看到对应的方法,后来自己耐下心来复盘自己的操作,终于发现了, ...
- 【Algorithm】自顶向下的归并排序
一. 算法描述 自顶向下的归并排序:采用分治法进行自顶向下的程序设计方式,分治法的核心思想就是分解.求解.合并. 先将长度为N的无序序列分割平均分割为两段 然后分别对前半段进行归并排序.后半段进行归并 ...
- 构建基于阿里云OSS文件上传服务
转载请注明来源:http://blog.csdn.net/loongshawn/article/details/50710132 <构建基于阿里云OSS文件上传服务> <构建基于OS ...
- 水晶报表填充.Net Objects数据源
Crystal Reports(水晶报表)是一款商务智能(BI)软件,主要用于设计及产生报表.是业内最专业.功能最强的报表系统. 查看网络资料及课本图书,鲜有介绍通过.NET Objects作为数据源 ...
- vue 关于deep watch / computed 监听不到 vuex state 对象变化的的问题
简而言之,如果vuex state 中是一个对象 {},那么监听就会有问题.先给出解决方案: // 超简易拷贝(如果是深拷贝还多此一举把get/set拷贝进去了,所以用简易拷贝即可) let __VA ...
- springboot 利用configureMessageConverters add FastJsonHttpMessageConverter 实现返回JSON值 null to ""
/** * 文件名:@WebConfiguration.java <br/> * @author tomas <br/> import com.alibaba.fastjson ...
- RabbitMQ 消费端 Client CPU 100%的解决办法
Func<bool> run = () => { try { using (IConnection conn = cf.CreateConnection()) { using (IM ...