目录

  • 一、从传统Seq2Seq说起
  • 二、在Seq2Seq中引入Attention
  • 三、引入Attention后,与传统的Seq2Seq的不同之处
  • 四、Seq2Seq的损失计算和解码过程

Seq2seq,顾名思义,一个序列到另一个序列的转换。它是一种Encoder-Decoder协同训练的端到端网络。传统Seq2seq的Encoder以RNN为基础单元,把输入序列整合为一个content向量;Decoder同样以RNN为基础单元,把content向量拆解为输出序列。显然,content向量决定了Decoder可知的信息量,进而决定了输出序列的质量。由于RNN的时序串行结构,Encoder更关注位于输入序列末尾的元素,使得content向量“遗忘”了位于输入序列前端的元素。反之,如果把RNN的所有隐层输出一同送入Decoder,又显得过于臃肿(计算量大)。如今我们常把Seq2seq和Attention联系在一起,也正是因为Attention帮助Seq2seq解决了上述问题。本文将对此进行讲解。

一、从传统Seq2Seq说起

Seq2seq机器翻译开篇之作 Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation[1] 发表前,机器翻译研究以统计方法为主。这篇文章仿照人在翻译时的思维方式"通读原句子(encode),大脑加工整合(content), 复述新句子(decode)",提出了一种Encoder-Decoder结构,如下图所示。简单来讲,先把任意长度的文本序列编码(encode)为固定长度的向量表示(context),再把固定长度的向量表示解码(decode)回任意长度的文本序列。

Seq2seq结构灵活。我们看到上图中3个content向量(C1==C2==C3)被用作Decoder各个时刻的输入,这里可以稍作改动,如下图,content向量只作为Decoder第一时刻的输入,再随Decoder的RNN依次向后传递。另一个改动的是,content向量取自Encoder各个时刻隐藏单元的拼接(或加和),或者像下图中(参考文献[1]和[2]),只取用Encoder最后一个时刻的隐藏单元。


依照Seq2seq展开图(上图),Decoder各个时刻的输入是

  • 初始时刻<EOS>标记的词向量,以及content向量;
  • 其他时刻:Decoder前一时刻的输出单词的词向量,以及Decoder前一时刻的隐层状态。

注:<EOS>标记被用作通知解码器开始生成文本的信号。也是结束生成文本的信号。
注:反向传播时,Decoder的梯度通过content向量传递给Encoder。
注:反转输入数据的顺序[2]是一种Seq2Seq优化方法,效果提升因具体任务而异,优点是梯度的传播更平滑,学习效率更高。例如“我是猫”和“I am a cat”,单词“我”和“I”有转换关系,反向传播时,梯度需从“I”经过“猫、是”才到达“我”;而反转句子后,“我”和“I”相邻,梯度可以直接传递。

二、在Seq2Seq中引入Attention

Decoder可获得的全部信息存储在这一个小小的content向量中,那么如何增加content向量的信息量呢?

Attention可以在每个时间步关注到Encoder的不同部分,以收集产生Decoder输出词所需的语义细节。Attention权重模拟了人脑注意力的分配机制,为更重要的部分分配较多的注意力。

具体的计算过程是,Seq2seq每解码一个字,就用前一个时刻的Decoder隐层状态,和Encoder所有隐层状态做soft Attention,计算公式如下,得到当前输出和所有输入元素的关联程度,即权重。进而采用加权平均的方式,计算出对当前输出更友好的context向量表示。

这里涉及到三个重要的细节(结合下图进行理解):

  • 加入Attention后,content向量在任意时刻是变化的。那么如何计算第 i 时刻content向量?

    1. 先计算Decoder的RNN隐层状态 Hi−1H_{i-1}Hi−1​ 和Encoder中所有RNN隐层状态 h1,h2,...,hj{h_1, h_2, ..., h_j}h1​,h2​,...,hj​ 的Attention得分;
    2. Attention得分是第 iii 时刻的输出单词 yiy_iyi​ 与所有输入单词 x1,x2,...,xj{x_1, x_2, ..., x_j}x1​,x2​,...,xj​ 的对齐可能性(此处可以联想机器翻译任务中源词与译词一一对应,如下图中,输出“student”时,输入序列中的最后一个词的Attention权重一定是最高的);
    3. 再以Attention得分为权重,对所有 h1,h2,...,hj{h_1, h_2, ..., h_j}h1​,h2​,...,hj​ 加权平均,得到第 iii 时刻的content向量。
  • 加入Attention后,Decoder各个时刻的输入包括

    • 初始时刻<EOS>标记的词向量,以及当前时刻的content向量;
    • 其他时刻:Decoder前一时刻的输出单词的词向量,以及Decoder前一时刻的隐层状态,以及当前时刻的content向量 。
  • 加入Attention后,Decoder各个时刻的输出包括:当前时刻的Decoder隐层状态,以及下一时刻的content向量。

    注:送入FFN+Softmax分类层的是,Decoder隐层状态和content向量的拼接。

三、引入Attention后,与传统的Seq2Seq的不同之处

总结,加入Attention后与传统的Seq2Seq模型主要有以下三点不同

  • Decoder每个节点都能获得Encoder直接传来的信息,而不是只有第一个节点接收content向量。
  • Decoder并不是直接把Encoder提供的hidden state作为输入,而是采取一种选择机制,把最符合当前位置的hidden state的信息组合起来,具体的步骤如下:
    • 计算每一个hidden state的分数值,确定哪些hidden state与当前节点关系最为密切;
    • 对每个分数值做一个softmax的计算,这能让相关性高的hidden state的分数值更大,相关性低的hidden state的分数值更低。

题外话,Attention与Self-Attention的不同:

  • Attention: Source中各单词与Target各单词的对齐机制
  • Self-Attention: Source自身的各单词之间的依存关系建模机制(e.g.语法特征),它能将Source的任意两个单词的联系通过一个计算步骤直接得出。

四、Seq2Seq的损失计算和解码过程

Seq2Seq的损失计算:产生最优输出序列
seq2Seq 在生成输出序列的时候是一个时刻生成一个字/词,换句话说,在每个时间步解决的是一个分类问题(选择词表中的哪个字)。

用最大似然估计(MLE)来最大化输出序列基于输入序列的条件概率函数,实现时,选用交叉熵(CE)或均方误差(MSE)

log⁡P(y1,…,yT′∣x1,…,xT)=−∑t′=1T′log⁡P(yt′∣y1,…,yt′−1,c)\log\mathbb{P}(y_1, \ldots, y_{T'} \mid x_1, \ldots, x_T) = -\sum_{t'=1}^{T'} \log \mathbb{P}(y_{t'} \mid y_1, \ldots, y_{t'-1}, \boldsymbol{c})logP(y1​,…,yT′​∣x1​,…,xT​)=−t′=1∑T′​logP(yt′​∣y1​,…,yt′−1​,c)

Beam search:调整最优输出序列的搜索空间
我们得到了每个时间步的输出字,而不是完整的输出序列。那么如何做呢?

最简单的是贪心法,即每个时刻,只取条件概率最高的1个词,加入候选输出句子中。贪心法的缺点是,得到了局部最优解,不一定是全局最优。

最复杂的是穷举搜索,把每一种可能的输出序列罗列出来,再选择最优解top-1。穷举搜索的缺点是复杂度非常高。

Beam search束搜索是最常见的解码方式。不同于穷举搜索,束搜索把搜索空间∣V∣L|V|^{L}∣V∣L降低到kLk^LkL。|V|是词典大小,L是输出句子长度,k是束大小。具体地,每个时刻,只保存概率最高的k个候选输出句子,其余的就删掉。k不能太小,否则检索空间太小,无法保证最优解。以8~12为佳。束搜索并不知道什么时候停下来,所以一般来说要定义一个最长的输出序列长度,或者遇到<eos>就停止检索。

注:注意处理长序列beam search得分过高的情况。例如,为结果值除以词数 T,更常见的是除以 TαT^\alphaTα。


  • Reference:

    • [1] Cho K , Merrienboer B V , Gulcehre C , et al. Learning Phrase Representations using RNN Encoder-Decoder for Statistical Machine Translation[J]. Computer Science, 2014.
    • [2] Ilya Sutskever, Oriol Vinyals, and Quoc V Le. Sequence to sequence learning with neural networks. In Advances in Neural Information Processing Systems, pages 3104–3112, 2014.
    • [3] Dzmitry Bahdanau, Kyunghyun Cho, and Yoshua Bengio. Neural machine translation by jointly learning to align and translate. In ICLR 2015, arXiv preprint arXiv:1409.0473, 2014.
    • 《深度学习》P287-289
    • 《深度学习进阶 自然语言处理》P274-374
    • 《百面机器学习》P247-255
    • https://github.com/google/seq2seq
    • https://github.com/farizrahman4u/seq2seq
    • 真正的完全图解Seq2Seq Attention模型
    • 深度学习中的注意力模型
    • Seq2Seq (Encoder-Decoder) and Attention Mechanism

Seq2Seq Attention模型详解相关推荐

  1. seq2seq模型详解

    在李纪为博士的毕业论文中提到,基于生成的闲聊机器人中,seq2seq是一种很常见的技术.例如,在法语-英语翻译中,预测的当前英语单词不仅取决于所有前面的已翻译的英语单词,还取决于原始的法语输入;另一个 ...

  2. Transformer 初识:模型结构+attention原理详解

    Transformer 初识:模型结构+原理详解 参考资源 前言 1.整体结构 1.1 输入: 1.2 Encoder 和 Decoder的结构 1.3 Layer normalization Bat ...

  3. Transformer 模型详解

    Transformer 是 Google 的团队在 2017 年提出的一种 NLP 经典模型,现在比较火热的 Bert 也是基于 Transformer.Transformer 模型使用了 Self- ...

  4. Transformer模型详解(图解最完整版)

    前言 Transformer由论文<Attention is All You Need>提出,现在是谷歌云TPU推荐的参考模型.论文相关的Tensorflow的代码可以从GitHub获取, ...

  5. Attention原理详解

    Attention原理详解 Attention模型 对齐 模型介绍 Attention整体流程 Step1 计算Encoder的隐藏状态和Decoder的隐藏状态 Step2 获取每个编码器隐藏状态对 ...

  6. tensorflow中的seq2seq的代码详解

    seq2seq模型详解中我们给出了seq2seq模型的介绍,这篇文章介绍tensorflow中seq 2seq的代码,方便日后工作中的调用.本文介绍的代码是版本1.2.1的代码,在1.0版本后,ten ...

  7. Attention机制详解

    一.Attention 原理 在Encoder-Decoder结构中,Encoder把所有的输入序列都编码成一个统一的语义特征c再解码,因此, c中必须包含原始序列中的所有信息,它的长度就成了限制模型 ...

  8. NLP中BERT模型详解

    标题NLP中BERT模型详解 谷歌发表的论文为: Attention Is ALL You Need 论文地址:[添加链接描述](https://arxiv.org/pdf/1706.03762.pd ...

  9. 【深度学习】RoBERTa模型详解和实践

    RoBERTa模型详解和实践 Robustly optimized BERT approach. 内容介绍: RoBERTa改进思路和原文详解 bert4keras工具使用 基于RoBERTa的202 ...

最新文章

  1. Ubuntu 11.04上搭建Android开发环境
  2. win7-64bit 下oracle11g plsql 的正确安装
  3. 解决在IDEA 的Maven下 出现 Cannot access in offline mode 问题
  4. JSP — 小项目【实现登录界面】
  5. 使用MonkeyTest对Android客户端进展压力测试
  6. 【自动化__GUI自动化】__java__模拟功能操作__鼠标
  7. Allegro 使用技巧
  8. 2015计算机软考试题及答案,2015年计算机软考网络工程师练习试题及答案
  9. laravel 图片流_基于laravel,一个下载远程图片到本地, 返回 MD5的方法
  10. 深度强化学习之A3C网络—理论及代码(小车上山)
  11. 智能计算机与应用是核心期刊吗,人工智能的核心期刊都有哪些
  12. hdu6070 Dirt Ratio
  13. 电子计算机管理人事资料的准则,{转帖}关于中国的一些人事制度,职称评定
  14. Java学习笔记(三):流程控制
  15. 百度地图API批量地址转坐标(支持Excel上传,附案例)
  16. 帧计算机术语,请解释一个计算机名词:“帧”,请分别解释“帧”的名称/用途/分类,...
  17. DNF中伤害类型综合计算方式以及相关Excel文档
  18. 把微笑留给伤害你最深的人
  19. 嵌入式c c++开发笔记(opencv两图像叠加)
  20. Android 中颜色透明度值

热门文章

  1. RTA OS系列介绍04-Alarm
  2. 【ES系列】ELASTICSEARCH中的REFRESH和FLUSH
  3. 将毫秒换算成天、时、分、秒
  4. Jira项目管理配置指南(二)—— 工作流配置
  5. java抽象类的子类必须_JAVA——抽象类
  6. VMware中的虚拟机如何配置上网(Linux系统为例)
  7. 安卓 控件的AttributeSet
  8. 小鼠成纤维细胞NIH-3T3培养说明书
  9. 京东虐恋联想,本不钟情何必秀恩爱?
  10. android日志管理最佳策略,【日志框架与全局日志管理】1. 日志框架的简介与选型...