从Encoder-Decoder(Seq2Seq)理解Attention的本质
1. 语言模型
2. Attention Is All You Need(Transformer)算法原理解析
3. ELMo算法原理解析
4. OpenAI GPT算法原理解析
5. BERT算法原理解析
6. 从Encoder-Decoder(Seq2Seq)理解Attention的本质
1. 前言
谷歌在2017年发表了一篇论文名字教Attention Is All You Need,提出了一个只基于attention的结构来处理序列模型相关的问题,比如机器翻译。传统的神经机器翻译大都是利用RNN或者CNN来作为encoder-decoder的模型基础,而谷歌最新的只基于Attention的Transformer模型摒弃了固有的定式,并没有用任何CNN或者RNN的结构。该模型可以高度并行地工作,所以在提升翻译性能的同时训练速度也特别快。
2. Transformer模型结构
Transformer的主体结构图:
2.1 Transformer的编码器解码器
模型分为编码器和解码器两个部分。
- 编码器由6个相同的层堆叠在一起,每一层又有两个支层。第一个支层是一个多头的自注意机制,第二个支层是一个简单的全连接前馈网络。在两个支层外面都添加了一个residual的连接,然后进行了layer nomalization的操作。模型所有的支层以及embedding层的输出维度都是dmodeldmodel。
- 解码器也是堆叠了六个相同的层。不过每层除了编码器中那两个支层,解码器还加入了第三个支层,如图中所示同样也用了residual以及layer normalization。具体的细节后面再讲。
2.2 输入层
编码器和解码器的输入就是利用学习好的embeddings将tokens(一般应该是词或者字符)转化为d维向量。对解码器来说,利用线性变换以及softmax函数将解码的输出转化为一个预测下一个token的概率。
2.3 位置向量
由于模型没有任何循环或者卷积,为了使用序列的顺序信息,需要将tokens的相对以及绝对位置信息注入到模型中去。论文在输入embeddings的基础上加了一个“位置编码”。位置编码和embeddings由同样的维度都是dmodeldmodel所以两者可以直接相加。有很多位置编码的选择,既有学习到的也有固定不变的。
2.4 Attention模型
2.4.1 Scaled attention
论文中用的attention是基本的点乘的方式,就是多了一个所谓的scale。输入包括维度为dkdk的queries以及keys,还有维度为dvdv的values。计算query和所有keys的点乘,然后每个都除以dk−−√dk(这个操作就是所谓的Scaled)。之后利用一个softmax函数来获取values的权重。
实际操作中,attention函数是在一些列queries上同时进行的,将这些queries并在一起形成一个矩阵QQ同时keys以及values也并在一起形成了矩阵KK以及VV。则attention的输出矩阵可以按照下述公式计算:
2.4.2 Multi-Head Attention
本文结构中的Attention并不是简简单单将一个点乘的attention应用进去。作者发现先对queries,keys以及values进行hh次不同的线性映射效果特别好。学习到的线性映射分别映射到dkdk,dkdk以及dvdv维。分别对每一个映射之后的得到的queries,keys以及values进行attention函数的并行操作,生成dvdv维的output值。具体结构和公式如下。
2.4.3 模型中的attention
Transformer以三种不同的方式使用了多头attention。
- 在encoder-decoder的attention层,queries来自于之前的decoder层,而keys和values都来自于encoder的输出。这个类似于很多已经提出的seq2seq模型所使用的attention机制。
- 在encoder含有self-attention层。在一个self-attention层中,所有的keys,values以及queries都来自于同一个地方,本例中即encoder之前一层的的输出。
- 类似的,decoder中的self-attention层也是一样。不同的是在scaled点乘attention操作中加了一个mask的操作,这个操作是保证softmax操作之后不会将非法的values连到attention中。
2.4.4 Feed Foreword
每层由两个支层,attention层就是其中一个,而attention之后的另一个支层就是一个前馈的网络。公式描述如下。
3. 总结
模型的整体框架基本介绍完了,其最重要的创新应该就是Self-Attention和Multi-Head Attention的架构。在摒弃传统CNN和RNN的情况下,还能提高表现,降低训练时间。Transformer用于机器翻译任务,表现极好,可并行化,并且大大减少训练时间。并且也给我们开拓了一个思路,在处理问题时可以增加一种结构的选择。
从Encoder-Decoder(Seq2Seq)理解Attention的本质的更多相关文章
- 6. 从Encoder-Decoder(Seq2Seq)理解Attention的本质
1. 语言模型 2. Attention Is All You Need(Transformer)算法原理解析 3. ELMo算法原理解析 4. OpenAI GPT算法原理解析 5. BERT算法原 ...
- seq2seq和attention应用到文档自动摘要
一.摘要种类 抽取式摘要 直接从原文中抽取一些句子组成摘要.本质上就是个排序问题,给每个句子打分,将高分句子摘出来,再做一些去冗余(方法是MMR)等.这种方式应用最广泛,因为比较简单.经典方法有Lex ...
- 完全图解RNN、RNN变体、Seq2Seq、Attention机制
完全图解RNN.RNN变体.Seq2Seq.Attention机制 本文主要是利用图片的形式,详细地介绍了经典的RNN.RNN几个重要变体,以及Seq2Seq模型.Attention机制.希望这篇文章 ...
- 从Seq2seq到Attention模型到Self Attention
Seq2seq Seq2seq全名是Sequence-to-sequence,也就是从序列到序列的过程,是近年当红的模型之一.Seq2seq被广泛应用在机器翻译.聊天机器人甚至是图像生成文字等情境. ...
- 深入理解Attention机制
要了解深度学习中的注意力模型,就不得不先谈Encoder-Decoder框架,因为目前大多数注意力模型附着在Encoder-Decoder框架下,当然,其实注意力模型可以看作一种通用的思想,本身并不依 ...
- Atitit 深入理解软件的本质 attilax总结 软件三原则"三次原则"是DRY原则和YAGNI原则的折
Atitit 深入理解软件的本质 attilax总结 软件三原则"三次原则"是DRY原则和YAGNI原则的折 1.1.1. 软件的本质:抽象 1 1.2. 软件开发的过程就是不断 ...
- 自定义Encoder/Decoder进行对象传递
转载:http://blog.csdn.net/top_code/article/details/50901623 在上一篇文章中,我们使用Netty4本身自带的ObjectDecoder,Objec ...
- 比sun.misc.Encoder()/Decoder()的base64更高效的mxBase64算法
package com.mxgraph.online; import java.util.Arrays; /** A very fast and memory efficient class to e ...
- Netty自定义Encoder/Decoder进行对象传递
转载:http://blog.csdn.net/top_code/article/details/50901623 在上一篇文章中,我们使用Netty4本身自带的ObjectDecoder,Objec ...
- RNN、LSTM、Seq2Seq、Attention、Teacher forcing、Skip thought模型总结
RNN RNN的发源: 单层的神经网络(只有一个细胞,f(wx+b),只有输入,没有输出和hidden state) 多个神经细胞(增加细胞个数和hidden state,hidden是f(wx+b) ...
随机推荐
- 巧用Fiddler开启运营商定制版路由器被阉割的功能,免去刷公版固件的风险
前言: 三大运营商都有自己的定制版路由器,一般会在自家营销活动中作为赠品送给用户 正巧我家里就有两台电信定制版的华为路由器,都是这两年双十一在某宝上买宽带时送的 两台路由器型号分别是TC7001和TC ...
- 基于 VScode 搭建 Matlab 运行环境
插件 Matlab:代码高亮.语法检查.用户片段 matlab-formatter:代码格式化 Matlab Interactive Terminal:集成终端 配置 Matlab "fil ...
- Spring Native打包本地镜像,无需通过Graal的maven插件buildtools
简介 在文章<GraalVM和Spring Native尝鲜,一步步让Springboot启动飞起来,66ms完成启动>中,我们介绍了如何使用Spring Native和buildtool ...
- Unity_UIWidgets - 按钮组件IconButton
Unity_UIWidgets - 按钮组件IconButton 按钮组件IconButton IconButton 结尾 QQ 今日无推荐 按钮组件IconButton 既然上周给大家介绍了ICON ...
- 【学习笔记】QT从入门到实战完整版(Lambda)(2)
Lambda Lambda 表达式很有意思,相信很多人初次见到 Lambda 表达式都会不能理解有什么用,我也一样,看了视频教程之后,突然意识到,Lambda 真的是太好用了,它可以在某些情况下可以很 ...
- 快速实现一个简单阉割版的HashMap
简单实现一个底层数据结构为数组 + 链表的HashMap,不考虑链表长度超过8个时变为红黑树的情况. 1.示例图 2.分析需求 put数据时: key值hash后的索引处没有元素,需要创建链表头节点, ...
- 从零开始,打造属于你的 ChatGPT 机器人!
大家好!我是韩老师. 不得不说,最近 OpenAI/ChatGPT 真的是太火了. 前几天,微软宣布推出全新的 Bing 和 Edge,集成了 OpenAI/ChatGPT 相关的技术,带动股价大涨: ...
- 重学SpringBoot. step6 SpringBoot高级技巧
SpringBoot高级技术 博客地址: step6 SpringBoot高级技巧 异步线程池 书上讲的是什么像异步操作那样,然后不需要等待. 问题是,不需要等待,但数据在生成的时候的时间并不能省. ...
- Linux xsync命令脚本
功能:在主机上分发文件到其他机器 在主机machine136上进行如下操作(master) 1.安装 rsync yum install -y rsync 2.bin下创建 xsync 转自:(82条 ...
- .NET Core MongoDB的简单使用
一.创建测试库.测试表.添加测试数据 使用之前文章提到的MongoDB Compass用法分别添加数据库[myDb]和集合(表)[userinfos]信息, 参考链接为:MongoDB Compass ...