machine-learning-notes
  • 封面
  • 目录
  • 前言
  • 个人前言
  • 机器学习前言
    • 什么是机器学习和模式识别
    • 机器学习的应用
    • 机器学习的流程
    • 不同的机器学习算法对相同数据预测效果不同
    • 快速入门机器学习
    • 机器学习需要参考哪些书
    • 机器学习的学习路径
    • 深度学习的学习路径
    • 互联网机器学习特定岗位所需技能
  • 机器学习面试
  • 数学基础
  • 微积分
    • 泰勒展开
    • e的直观认识
    • 傅里叶变换
    • 希尔伯特空间
  • 线性代数
    • 范数
    • 矩阵求导
    • 特征值
    • 奇异值分解
  • 概率与信息论
    • 综述概率论基本定义
    • 概率论与贝叶斯先验
    • 正态分布
    • 贝叶斯概率
    • 概率符号说明
    • 共轭先验
    • 信息论
  • 数值计算与优化
    • 最小二乘法
    • 等式约束的拉格朗日乘子法
    • 凸优化
      • 凸集和凸函数
      • 凸优化问题
  • 梯度下降算法
    • 随机梯度下降SGD
    • 动量法Momentum
    • 牛顿动量Nesterov
    • AdaGrad
    • RMSprop
    • Adadelta
    • Adam
    • Nadam
    • AMSGrad
    • AdasMax
  • 概率图模型
    • 概率图模型概论
    • 概率图简介
  • 编程基础
  • linux
    • linux常用命令
    • shell
      • 输入输出重定向
  • python
    • python简介
    • python语法
      • 基础语法
      • 数据结构
      • 过程控制
      • 函数
      • 类和对象
      • 文件操作
      • 正则表达式
    • python库
      • numpy
      • pandas
      • scipy
      • matplotlib
      • scikit-learn
    • python应用
      • 排序算法
  • 数据结构与算法
    • 数据结构
    • 算法思想
      • 排序
        • 堆排序
        • 归并排序
        • 快速排序
      • 递归
    • 剑指offer
      • 链表
      • 二叉树
      • 数组
      • 字符串
      • 栈和队列
      • 递归
      • 动态规划
      • 其他
    • leetcode
    • 编程语言
      • c++
  • Hadoop
    • Hadoop简介
    • MapReduce
  • Hive
  • Spark
  • TensorFlow
    • TensorFlow1.0
      • TensorFlow基础
      • TensorFlow基础概念解析
      • TensorFlow机器学习基础
      • Tensorflow分布式架构
    • TensorFlow2.0
  • PyTorch
  • 机器学习
  • 机器学习概论
  • 特征工程
  • 感知机
  • k近邻
  • 朴素贝叶斯
  • 线性模型
    • 最大熵模型
    • 指数族分布与广义线性模型
    • 线性回归
      • Ridge回归(岭回归)
      • Lasso回归
    • Logistic回归-对数几率回归
  • 决策树
  • 支持向量机
    • 线性可分支持向量机与硬间隔最大化
    • 线性支持向量机与软间隔最大化
    • 非线性支持向量机与核函数
    • 序列最小最优化算法SMO
    • SVM总结
  • 集成学习
    • Bagging
      • 随机森林
    • Boosting
      • AdaBoost
      • GradientBoosting
        • GBDT
        • XGBoost
          • XGBoost理论
          • XGBoost实践
    • Stacking
  • 降维
    • PCA主成分分析
    • 流形学习
  • EM算法
  • HMM隐马尔科夫模型
  • CRF条件随机场
  • 聚类
    • k均值聚类
    • 高斯混合模型
  • 主题模型
    • LDA隐狄利克雷分布
  • 知识点
    • 损失函数
    • 负采样
  • 机器学习算法总结
  • 深度学习
  • 深度学习概论
  • ANN人工神经网络
  • 知识点
    • Batch Normalization
  • CNN卷积神经网络
  • 深度学习优化算法
  • RNN循环神经网络
  • LSTM长短期记忆网络
  • GRU门控循环单元
  • GNN图神经网络
    • GNN图神经网络综述
    • GCN图卷积网络
      • GCN图卷积网络初步理解
      • GCN图卷积网络的numpy简单实现
      • GCN图卷积网络本质理解
      • GCN图卷积网络全面理解
      • SEMI-SUPERVISED CLASSIFICATION WITH GRAPH CONVOLUTIONAL NETWORKS ICLR2017
  • 神经网络架构搜索
    • Weight-Agnostic-Neural-Networks Google2019
  • 强化学习
  • 强化学习概论
  • 马尔科夫决策过程
  • 动态规划
  • 无模型方法一:蒙特卡洛
  • 无模型方法二:时间差分
  • 无模型方法三:多步自举
  • 函数近似和深度网络
  • 策略梯度算法
  • 深度强化学习
  • 基于模型的强化学习
  • 强化学习前景
  • 自然语言处理
  • 自然语言处理概论
  • 自然语言
  • 语言模型和中文分词
  • word2vec
    • word2vec概述
    • word2vec算法原理
    • word2vec源码分析
    • word2vec实践
  • Seq2Seq模型和Attention机制
  • Self-Attention和Transformer
  • 知识图谱
  • 推荐系统
  • 推荐系统概论
  • 基础知识
  • 进阶知识
    • 机器学习
      • Factorization Machines ICDM2010
    • embedding
      • Network Embedding
        • LINE: Large-scale Information Network Embedding
    • 深度学习
      • DeepFM: A Factorization-Machine based Neural Network for CTR Prediction 2017
      • DSSM: Learning Deep Structured Semantic Models for Web Search using Clickthrough Data CIKM2013
    • 图卷积网络
      • Graph Convolutional Neural Networks for Web-Scale Recommender Systems KDD2018
    • 强化学习
      • DRN基于深度强化学习的新闻推荐模型
  • 业界应用
    • YouTube
      • Deep Neural Networks for YouTube Recommendations RecSys2016
    • Alibaba
      • Learning Tree-based Deep Model for Recommender Systems KDD2018
      • Deep Interest Network for Click-Through Rate Prediction KDD2018
      • DSIN:Deep Session Interest Network for Click-Through Rate Prediction IJCAI2019
Powered by GitBook
On this page
  • Seq2Seq和注意力机制
  • RNN的多种结构
  • Seq2Seq模型
  • Encoder-Decoder结构
  • Encoder-Decoder介绍
  • Encoder-Decoder分析
  • Attention机制
  • Encoder-Decoder结构的局限性
  • Attention机制原理
  • 参考资料

Was this helpful?

Seq2Seq模型和Attention机制

Previousword2vec实践NextSelf-Attention和Transformer

Last updated 5 years ago

Was this helpful?

Seq2Seq和注意力机制

RNN的多种结构

首先从RNN的结构说起,根据输出和输入序列不同数量RNN可以有多种不同的结构,不同结构自然就有不同的引用场合。如下图,

  • one to one结构,仅仅只是简单的给一个输入得到一个输出,此处并未体现序列的特征,例如图像分类场景。

  • one to many结构,给一个输入得到一系列输出,这种结构可用于生产图片描述的场景。

  • many to one结构,给一系列输入得到一个输出,这种结构可用于文本情感分析,对一些列的文本输入进行分类,看是消极还是积极情感。

  • many to many结构,给一些列输入得到一系列输出,这种结构可用于翻译或聊天对话场景,对输入的文本转换成另外一些列文本。

  • 同步many to many结构,它是经典的RNN结构,前一输入的状态会带到下一个状态中,而且每个输入都会对应一个输出,我们最熟悉的就是用于字符预测了,同样也可以用于视频分类,对视频的帧打标签。

Seq2Seq模型

在上图many to many的两种模型中,可以看到第四和第五种是有差异的,经典的RNN结构的输入和输出序列必须要是等长,它的应用场景也比较有限。而第四种它可以是输入和输出序列不等长,这种模型便是Seq2Seq模型,即Sequence to Sequence。

Seq2Seq实现了从一个序列到另外一个序列的转换,比如google曾用Seq2Seq模型加attention模型来实现了翻译功能,类似的还可以实现聊天机器人对话模型。经典的RNN模型固定了输入序列和输出序列的大小,而Seq2Seq模型则突破了该限制。

这种结构最重要的地方在于输入序列和输出序列的长度是可变的。

举个栗子

在机器翻译:输入(hello) -> 输出 (你好)。输入是1个英文单词,输出为2个汉字。 在对话机器中:我们提(输入)一个问题,机器会自动生成(输出)回答。这里的输入和输出显然是长度没有确定的序列(sequences).

要知道,在以往的很多模型中,我们一般都说输入特征矩阵,每个样本对应矩阵中的某一行。就是说,无论是第一个样本还是最后一个样本,他们都有一样的特征维度。但是对于翻译这种例子,难道我们要让每一句话都有一样的字数吗,那样的话估计五言律诗和七言绝句又能大火一把了,哈哈。但是这不科学呀,所以就有了Seq2Seq这种结构。

Seq2Seq模型有两种常见结构。

(1)简单结构

该结构是最简单的结构,Decoder 的第一个时刻只用到了 Encoder 最后输出的中间状态变量 :

(2)复杂结构

Seq2Seq的应用有:

  • 在英文翻译中,将英文输入到Encoder中,Decoder输出中文。

  • 在图像标注中,将图像特征输入到Encoder中,Decoder输出一段文字对图像的描述。

  • 在 QA 系统中,将提出的问题输入Encoder中,Decoder输出对于问题的回答。

Encoder-Decoder结构

Encoder-Decoder介绍

所谓的Sequence2Sequence任务主要是泛指一些Sequence到Sequence的映射问题,Sequence在这里可以理解为一个字符串序列,当我们在给定一个字符串序列后,希望得到与之对应的另一个字符串序列(如 翻译后的、如语义上对应的)时,这个任务就可以称为Sequence2Sequence了。

在现在的深度学习领域当中,通常的做法是将输入的源Sequence编码到一个中间的context当中,这个context是一个特定长度的编码(可以理解为一个向量),然后再通过这个context还原成一个输出的目标Sequence。

如果用人的思维来看,就是我们先看到源Sequence,将其读一遍,然后在我们大脑当中就记住了这个源Sequence,并且存在大脑的某一个位置上,形成我们自己的记忆(对应Context),然后我们再经过思考,将这个大脑里的东西转变成输出,然后写下来。

那么我们大脑读入的过程叫做Encoder,即将输入的东西变成我们自己的记忆,放在大脑当中,而这个记忆可以叫做Context,然后我们再根据这个Context,转化成答案写下来,这个写的过程叫做Decoder。其实就是编码-存储-解码的过程。

而对应的,大脑怎么读入(Encoder怎么工作)有一个特定的方式,怎么记忆(Context)有一种特定的形式,怎么转变成答案(Decoder怎么工作)又有一种特定的工作方式。

好了,现在我们大体了解了一个工作的流程Encoder-Decoder后,我们来介绍一个深度学习当中,最经典的Encoder-Decoder实现方式,即用RNN来实现。

在RNN Encoder-Decoder的工作当中,我们用一个RNN去模拟大脑的读入动作,用一个特定长度的特征向量去模拟我们的记忆,然后再用另外一个RNN去模拟大脑思考得到答案的动作,将三者组织起来利用就成了一个可以实现Sequence2Sequence工作的“模拟大脑”了。 而我们剩下的工作也就是如何正确的利用RNN去实现,以及如何正确且合理的组织这三个部分了。

获取语义向量C最简单的方式就是直接将最后一个输入的隐状态作为语义向量C。也可以对最后一个隐含状态做一个变换得到语义向量,还可以将输入序列的所有隐含状态做一个变换得到语义变量。

Encoder-Decoder分析

(1)Encoder

给定句子对

(2)Decoder

得到中间语义向量CCC后,使用Decoder进行解码。Decoder根据中间状态向量CCC和已经生成的历史信息y1,y2,...,yi−1y_1, y_2,...,y_{i-1}y1​,y2​,...,yi−1​去生成ttt时刻的单词yiy_iyi​:

yi=g(C,y1,y2,...,yi−1)y_i=g(C,y_1,y_2,...,y_{i-1})yi​=g(C,y1​,y2​,...,yi−1​)

如果直接将CCC输入到Decoder中,则是Seq2Seq模型的第一种模型:

如果将CCC当作Decoder的每一时刻输入,则是Seq2Seq模型的第二种模型:

Attention机制

Encoder-Decoder结构的局限性

(1)Encoder和Decoder的唯一联系只有语义编码CCC

即将整个输入序列的信息编码成一个固定大小的状态向量再解码,相当于将信息”有损压缩”。很明显这样做有两个缺点:

  • 中间语义向量无法完全表达整个输入序列的信息。

  • 随着输入信息长度的增加,由于向量长度固定,先前编码好的信息会被后来的信息覆盖,丢失很多信息。

(2)不同位置的单词的贡献都是一样的

Decoder过程,其输出的产生如下:

y1=g(C,h0′)y2=g(C,y1)y3=g(C,y1,y2)\begin{aligned} &y_1=g(C,h^{'}_0)\\ &y_2=g(C,y_1)\\ &y_3=g(C,y_1,y_2) \end{aligned}​y1​=g(C,h0′​)y2​=g(C,y1​)y3​=g(C,y1​,y2​)​

明显可以发现在生成y1y_1y1​、y2y_2y2​、y3y_3y3​时,语义编码CCC对它们所产生的贡献都是一样的。例如翻译:Cat chase mouse,Encoder-Decoder模型逐字生成:“猫”、“捉”、“老鼠”。在翻译mouse单词时,每一个英语单词对“老鼠”的贡献都是相同的。如果引入了Attention模型,那么mouse对于它的影响应该是最大的。

Attention机制原理

为了解决上面两个问题,于是引入了Attention模型。Attention模型的特点是Decoder不再将整个输入序列编码为固定长度的中间语义向量CCC ,而是根据当前生成的新单词计算新的CiC_iCi​,使得每个时刻输入不同的CCC,这样就解决了单词信息丢失的问题。引入了Attention的Encoder-Decoder模型如下图:

对于刚才提到的那个“猫捉老鼠”的翻译过程变成了如下:

y1=g(C1,h0′)y2=g(C2,y1)y3=g(C3,y1,y2)\begin{aligned} &y_1=g(C_1,h^{'}_0)\\ &y_2=g(C_2,y_1)\\ &y_3=g(C_3,y_1,y_2) \end{aligned}​y1​=g(C1​,h0′​)y2​=g(C2​,y1​)y3​=g(C3​,y1​,y2​)​

整个翻译流程如下:

图中输入是Cat chase mouse,Encoder中隐层h1h_1h1​、h2h_2h2​、h3h_3h3​可看作经过计算Cat、chase、mouse这些词的信息。

使用aija_{ij}aij​表示Encoder中第jjj阶段的hjh_jhj​和解码时第iii阶段的相关性,计算出解码需要的中间语义向量CiC_iCi​。C1C_1C1​和 “猫” 关系最近,相对应的a11a_{11}a11​要比a12a_{12}a12​、a13a_{13}a13​大;而C2C_2C2​和 “捉” 关系最近,相对应的a22a_{22}a22​要比a21a_{21}a21​、a23a_{23}a23​大;同理C3C_3C3​和 “老鼠” 关系最近,相对应的a33a_{33}a33​要比a31a_{31}a31​、a32a_{32}a32​大。

那么参数aija_{ij}aij​是如何得到呢?

Encoder中第jjj个隐层单元hjh_jhj​和Decoder第i−1i-1i−1个隐层单元hi−1′h^{'}_{i-1}hi−1′​经过运算得到aija_{ij}aij​。

例如a1ja_{1j}a1j​的计算过程:

例如a2ja_{2j}a2j​的计算过程:

那具体是怎么运算得到的呢?我们来把上面的过程用公式严谨的表达出来。我们按照原论文的标点符号来进行推导。

语义向量cic_ici​由Encoder的隐向量hih_ihi​加权求和表示:

ci=∑j=1Txαijhjc_i=\sum^{T_x}_{j=1}\alpha_{ij}h_jci​=j=1∑Tx​​αij​hj​

每个隐向量hjh_jhj​对应的权重αij\alpha_{ij}αij​可由下式计算得到:

αij=exp(eij)∑k=1Txexp(eik)\alpha_{ij}=\frac{\text{exp}(e_{ij})}{\sum^{T_x}_{k=1}\text{exp}(e_{ik})}αij​=∑k=1Tx​​exp(eik​)exp(eij​)​

其中,

eij=α(si−1,hj)e_{ij}=\alpha(s_{i-1},h_j)eij​=α(si−1​,hj​)

上式中的si−1s_{i-1}si−1​就是上图中的hi−1′h^{'}_{i-1}hi−1′​。

这个α\alphaα具体怎么算,有不同的方法,论文里是用了神经网络去算,

eij=α(si−1,hj)=vTtanh(Wsi−1+Vhj)e_{ij}=\alpha(s_{i-1},h_j)=v^T\text{tanh}(Ws_{i-1}+Vh_j)eij​=α(si−1​,hj​)=vTtanh(Wsi−1​+Vhj​)

还可以用二次型矩阵来计算:

eij=α(si−1,hj)=si−1Wi−1,jhje_{ij}=\alpha(s_{i-1},h_j)=s_{i-1}W_{i-1,j}h_jeij​=α(si−1​,hj​)=si−1​Wi−1,j​hj​

通过训练,注意力机制可以对关系较大的输入输出的赋以较大权重(两者在转换中对齐的概率更大),对位置信息进行了建模,而因此减少了信息损失,能专注于更重要的信息进行序列预测。

我们可以看到,attention的效果如下图所示,确实是不同单词的注意力是不一样的。

这是Attention Mechanism第一次找到很合适的用武之地。在BERT中,还会用到Attention Mechanism。

参考资料

本文参考了此博客。

对注意力机制的解释参考了此博客。

这两个还没看,但是这是张俊林写的需要好好看看。所以就列在这了。

===

Seq2Seq 模型分析

首先介绍几篇比较重要的 Seq2Seq 相关的论文: [1] Cho et al., 2014 . Learning Phrase Representations using RNN Encoder-Decoder for Statistical Machine Translation [2] Sutskever et al., 2014. Sequence to Sequence Learning with Neural Networks [3] Bahdanau et al., 2014. Neural Machine Translation by Jointly Learning to Align and Translate [4] Jean et. al., 2014. On Using Very Large Target Vocabulary for Neural Machine Translation [5] Vinyals et. al., 2015. A Neural Conversational Model[J]. Computer Science

pdf:

Seq2Seq是2014年Google提出的一个模型。论文中提出的 Seq2Seq 模型可简单理解为由三部分组成:Encoder、Decoder 和连接两者的 State Vector (中间状态向量) C 。

Seq2Seq-strcture1

上图来自谷歌2014年的论文:

Seq2Seq-strcture2

上图来自蒙特利尔大学2014年的论文:

蒙特利尔大学2014年的论文:

Google2015年的论文:

NEURAL MACHINE TRANSLATION BY JOINTLY LEARNING TO ALIGN AND TRANSLATE
Sequence to Sequence Learning with Neural Networks
Sequence to Sequence Learning with Neural Networks
Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation
Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation
Show and Tell: A Neural Image Caption Generator
详解从 Seq2Seq模型、RNN结构、Encoder-Decoder模型 到 Attention模型
从seq2seq到谷歌BERT,浅谈对Attention Mechanism的理解
自然语言处理中的Attention Model:是什么及为什么
以Attention Model为例谈谈两种研究创新模式
Seq2Seq 与attention机制 网易公开课
如何理解Seq2Seq?
完全图解RNN、RNN变体、Seq2Seq、Attention机制
Seq2Seq学习笔记
NLP之Seq2Seq
翻译系统/聊天机器人Seq2Seq模型+attention
真正的完全图解Seq2Seq Attention模型
从seq2seq到谷歌BERT,浅谈对Attention Mechanism的理解
返回顶层目录
返回上层目录
RNN的多种结构
Seq2Seq模型
Encoder-Decoder结构
Encoder-Decoder介绍
Encoder-Decoder分析
Attention机制
Encoder-Decoder结构的局限性
Attention机制原理
paper
RNN-structures
encoder-decoder
deconder-encoder-structure-1
deconder-encoder-structure-2
attention
attention-2
attention-3
attention-4
attention-5
attention-6
attention-7
attention-8
show-and-tell