Seq2Seq是一种循环神经网络的变种,包括编码器(Encoder)和解码器(Decoder)两部分组成。Seq2Seq是自然语言处理中的一种重要模型,可以用于机器翻译、对话系统、自动摘要。

首先介绍RNN结构与使用

RNN 基本的模型如上图所示,每个神经元接受的输入包括:前一个神经元的隐藏层状态h(用于记忆)和当前的输入x(当前信息)。神经元得到输入之后,会计算出新的隐藏状态h和输出y,然后在传递到下一个神经元。因为隐藏状态h的存在,所以RNN具有一定的记忆功能。

针对不同任务,通常要对 RNN 模型结构进行少量的调整,根据输入和输出的数量,分为三种比较常见的结构:N vs N、1 vs N、N vs 1。

1.N vs N

上图是RNN 模型的一种 N vs N 结构,包含 N 个输入 x1, x2, ..., xN,和 N 个输出 y1, y2, ..., yN。N vs N 的结构中,输入和输出序列的长度是相等的,通常适合用于以下任务:

  • 词性标注
  • 训练语言模型,使用之前的词预测下一个词等

2.1 vs N

在 1 vs N 结构中,我们只有一个输入 x,和 N 个输出 y1, y2, ..., yN。可以有两种方式使用 1 vs N,第一种只将输入 x 传入第一个 RNN 神经元,第二种是将输入 x 传入所有的 RNN 神经元。1 vs N 结构适合用于以下任务:

  • 图像生成文字,输入 x 就是一张图片,输出就是一段图片的描述文字。
  • 根据音乐类别,生成对应的音乐。
  • 根据小说类别,生成相应的小说。

3 N vs 1

在 N vs 1 结构中,我们有 N 个输入x1,x2, ...,xN,和一个输出y。N vs 1 结构适合用于以下任务:

  • 序列分类任务,一段语音、一段文字的类别,句子的情感分析。

Seq2seq模型:

上面的三种结构对于 RNN 的输入和输出个数都有一定的限制,但实际中很多任务的序列的长度是不固定的,例如机器翻译中,源语言、目标语言的句子长度不一样;对话系统中,问句和答案的句子长度不一样。

Seq2Seq 是一种重要的 RNN 模型,也称为 Encoder-Decoder 模型,可以理解为一种 N×M 的模型。模型包含两个部分:Encoder 用于编码序列的信息,将任意长度的序列信息编码到一个向量 c 里。而 Decoder 是解码器,解码器得到上下文信息向量 c 之后可以将信息解码,并输出为序列。Seq2Seq 模型结构有很多种,下面是几种比较常见的:

编码器 Encoder

这三种 Seq2Seq 模型的主要区别在于 Decoder,他们的 Encoder 都是一样的。下图是 Encoder 部分,Encoder 的 RNN 接受输入 x,最终输出一个编码所有信息的上下文向量 c,中间的神经元没有输出。Decoder 主要传入的是上下文向量 c,然后解码出需要的信息。

从上图可以看到,Encoder 与一般的 RNN 区别不大,只是中间神经元没有输出。其中的上下文向量c可以采用多种方式进行计算。

从公式可以看到,c 可以直接使用最后一个神经元的隐藏状态 hN 表示;也可以在最后一个神经元的隐藏状态上进行某种变换 hN 而得到,q 函数表示某种变换;也可以使用所有神经元的隐藏状态 h1, h2, ..., hN 计算得到。得到上下文向量 c 之后,需要传递到 Decoder。

解码器 Decoder

Decoder 有多种不同的结构,这里主要介绍三种。

第一种 Decoder 结构比较简单,将上下文向量 c 当成是 RNN 的初始隐藏状态,输入到 RNN 中,后续只接受上一个神经元的隐藏层状态 h' 而不接收其他的输入 x。第一种 Decoder 结构的隐藏层及输出的计算公式:

第二种 Decoder 结构有了自己的初始隐藏层状态 h'0,不再把上下文向量 c 当成是 RNN 的初始隐藏状态,而是当成 RNN 每一个神经元的输入。可以看到在 Decoder 的每一个神经元都拥有相同的输入 c,这种 Decoder 的隐藏层及输出计算公式:

第三种 Decoder 结构和第二种类似,但是在输入的部分多了上一个神经元的输出 y'。即每一个神经元的输入包括:上一个神经元的隐藏层向量 h',上一个神经元的输出 y',当前的输入 c (Encoder 编码的上下文向量)。对于第一个神经元的输入 y'0,通常是句子其实标志位的 embedding 向量。第三种 Decoder 的隐藏层及输出计算公式:

Seq2Seq模型使用技巧

1.Teacher Forcing

Teacher Forcing 用于训练阶段,主要针对上面第三种 Decoder 模型来说的,第三种 Decoder 模型神经元的输入包括了上一个神经元的输出 y'。如果上一个神经元的输出是错误的,则下一个神经元的输出也很容易错误,导致错误会一直传递下去。

而 Teacher Forcing 可以在一定程度上缓解上面的问题,在训练 Seq2Seq 模型时,Decoder 的每一个神经元并非一定使用上一个神经元的输出,而是有一定的比例采用正确的序列作为输入。

举例说明,在翻译任务中,给定英文句子翻译为中文。"I have a cat" 翻译成 "我有一只猫",下图是不使用 Teacher Forcing 的 Seq2Seq

如果使用 Teacher Forcing,则神经元直接使用正确的输出作为当前神经元的输入。

  1. Attention

在 Seq2Seq 模型,Encoder 总是将源句子的所有信息编码到一个固定长度的上下文向量 c 中,然后在 Decoder 解码的过程中向量 c 都是不变的。这存在着不少缺陷:

  • 对于比较长的句子,很难用一个定长的向量 c 完全表示其意义。
  • RNN 存在长序列梯度消失的问题,只使用最后一个神经元得到的向量 c 效果不理想。
  • 与人类的注意力方式不同,即人类在阅读文章的时候,会把注意力放在当前的句子上。

2.beam search

beam search 方法不用于训练的过程,而是用在测试的。在每一个神经元中,我们都选取当前输出概率值最大的 top k 个输出传递到下一个神经元。下一个神经元分别用这 k 个输出,计算出 L 个单词的概率 (L 为词汇表大小),然后在 kL 个结果中得到 top k 个最大的输出,重复这一步骤。

Seq2Seq 总结

Seq2Seq 模型允许我们使用长度不同的输入和输出序列,适用范围相当广,可用于机器翻译,对话系统,阅读理解等场景。

Seq2Seq 模型使用时可以利用 Teacher Forcing,Attention,beam search 等方法优化。

推荐一篇博主写的也非常详细

(3条消息) 编解码(seq2seq)+注意机制(attention) 详细讲解_Mr_Meng__NLP的博客-CSDN博客

Seq2Seq,Seq2Seq模型使用技巧相关推荐

  1. Tensorflow 自动文摘: 基于Seq2Seq+Attention模型的Textsum模型

    Github下载完整代码 https://github.com/rockingdingo/deepnlp/tree/master/deepnlp/textsum 简介 这篇文章中我们将基于Tensor ...

  2. 电气论文实现:通过电力光伏负荷预测讲解seq2seq翻译模型

    通过电力光伏预测讲解seq2seq翻译模型 本文主要讲解seq2seq模型,而不是光伏预测.通过一个光伏预测算例简单感受下seq2seq模型.有代码.主要文字和代码共9页.     专栏解锁,是解锁后 ...

  3. 自然语言生成任务,如文本摘要和图像标题的生成。seq2seq的模型原理

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/Irving_zhang/article/details/78889364 </div>& ...

  4. Seq2Seq Attention模型

    首先强调一下图文来源,真正的完全图解Seq2Seq Attention模型.本人目前用到此模型,发现该知乎作者的文章写得通俗易懂,于是整理作为自己的笔记.如果小伙伴对模型中各种隐层状态感到不解,请看我 ...

  5. pytorch做seq2seq注意力模型的翻译

    以下是对pytorch 1.0版本 的seq2seq+注意力模型做法语--英语翻译的理解(这个代码在pytorch0.4上也可以正常跑): 1 #-*- coding: utf-8 -*- 2 &qu ...

  6. Seq2Seq Attention模型详解

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

  7. 【数据竞赛】Kaggle GM秘技:树模型初始化技巧

    作者:  尘沙樱落 树模型初始化技巧 大家都知道神经网络训练的提升分数的技巧之一就是: 依据验证集合的效果,来调整learning rate的大小,从而获得更好的效果; 但我们在训练树模型的时候却往往 ...

  8. sketchup 图片转模型_SketchUp插件:位图转模型使用技巧

    有什么方法可以不建模 直接生成真实好看的地形呢 这里强烈安利这款神器 位图转模型 ▼ 位图转模型 位图转模型 高程着色 坡度着色 插件介绍 位图转模型 SUAPP编号186 作者:thomthom 该 ...

  9. 【Python机器学习及实践】进阶篇:模型实用技巧(特征提升)

    Python机器学习及实践--进阶篇:模型实用技巧(特征提升) 所谓特征抽取,就是逐条将原始数据转化为特征向量的形式,这个过程同时涉及对数据特征的量化表示:而特征筛选则进一步,在高维度.已量化的特征向 ...

最新文章

  1. centos7通过yum安装nginx
  2. 五种网络管理技巧优化网络办公环境
  3. C++中数字与字符串之间的转换 scanf string总结(复习必读)
  4. (十)nodejs循序渐进-高性能游戏服务器框架pomelo之介绍和安装篇
  5. java 反射解读理解
  6. 海量数据挖掘MMDS week2: 频繁项集挖掘 Apriori算法的改进:基于hash的方法
  7. 计蒜客 第一场 搜狗输入法
  8. 图解CSS3 读书笔记——边框
  9. vue2 - 基于Export2Excel.js导出Excel案例(js-xlsx插件二次封装使用)
  10. MyCAT  In Action中文版
  11. 大一寒假训练:集训内容考试(二)【未完待续】
  12. 快速列出字母+数字的全部组合
  13. JavaScript基础之一JavaScript的邂逅
  14. 涂鸦智能平台——mcu+nbiot
  15. java实验及答案_JAVA实验4-1答案
  16. 树莓派+温度传感器实现室内温度监控
  17. MySQL的DQL语言:2、条件查询
  18. encodeURI,encodeURIComponent有什么区别?
  19. 利用WIN10自带ACG播放器完成.flv视频文件转码为mp4文件
  20. 服务器温度检测软件_技术条件||铁路客车故障轨旁图像检测系统技术要求

热门文章

  1. 《SpringCloud》笔记二:项目导入
  2. redux之reducer 为什么必须是纯函数?
  3. 叶黄素酯的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  4. android 线控操作
  5. logistic回归和softmax回归
  6. php 求子串,字符串的连接与求子串,目测只有高手可以帮我解答了
  7. Linux中根目录/和home的区别
  8. Android--intent-filter 过滤规则的匹配 (Activity通过Uri传递参数)
  9. 分享111个HTML体育竞技模板,总有一款适合您
  10. 如何把谷歌浏览器的书签导入safari浏览器