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的输出矩阵可以按照下述公式计算:

Attention(Q,K,V)=softmax(QKTdk−−√)VAttention(Q,K,V)=softmax(QKTdk)V

2.4.2 Multi-Head Attention

本文结构中的Attention并不是简简单单将一个点乘的attention应用进去。作者发现先对queries,keys以及values进行hh次不同的线性映射效果特别好。学习到的线性映射分别映射到dkdk,dkdk以及dvdv维。分别对每一个映射之后的得到的queries,keys以及values进行attention函数的并行操作,生成dvdv维的output值。具体结构和公式如下。

MultiHead(Q,K,V)=Concat(head1,...,headh)MultiHead(Q,K,V)=Concat(head1,...,headh)
where:headi=Attention(QWiQ,KWiK,VWiV)where:headi=Attention(QWiQ,KWiK,VWiV)

2.4.3 模型中的attention

Transformer以三种不同的方式使用了多头attention。

  1. 在encoder-decoder的attention层,queries来自于之前的decoder层,而keys和values都来自于encoder的输出。这个类似于很多已经提出的seq2seq模型所使用的attention机制。
  2. 在encoder含有self-attention层。在一个self-attention层中,所有的keys,values以及queries都来自于同一个地方,本例中即encoder之前一层的的输出。
  3. 类似的,decoder中的self-attention层也是一样。不同的是在scaled点乘attention操作中加了一个mask的操作,这个操作是保证softmax操作之后不会将非法的values连到attention中。

2.4.4 Feed Foreword

每层由两个支层,attention层就是其中一个,而attention之后的另一个支层就是一个前馈的网络。公式描述如下。

FFN(x)=max(0,xW1+b1)W2+b2FFN(x)=max(0,xW1+b1)W2+b2

3. 总结

模型的整体框架基本介绍完了,其最重要的创新应该就是Self-Attention和Multi-Head Attention的架构。在摒弃传统CNN和RNN的情况下,还能提高表现,降低训练时间。Transformer用于机器翻译任务,表现极好,可并行化,并且大大减少训练时间。并且也给我们开拓了一个思路,在处理问题时可以增加一种结构的选择。

最新文章

  1. [Modern OpenGL系列(四)]在OpenGL中使用Shader
  2. 局域网象棋游戏(C++实现,使用Socket,界面使用Win32,CodeBlocks+GCC编译)
  3. AngularJS的JSONP服务
  4. Nodejs 及 NPM 的安装
  5. Lazarus开发平台编译后的可执行程序的减肥方法
  6. PMP-合同类型
  7. 20141128--JavaScript HTML DOM
  8. JAVA JDK1.5-1.9新特性
  9. IAR:Error [Li005]:no definition for"***" 问题之连接
  10. 微软职位内部推荐-Sr SDE-MOD-Beijing
  11. java1200例-文字的探照灯效果
  12. javaScript手记(01)
  13. MySQL查看数据库安装路径
  14. 堆排序(heap sort)
  15. 《数据库MySQL》
  16. rsyslog+loganalyzer配置
  17. python - class类(归一化设计)
  18. Centos7安装teamviewer 32/64位
  19. spring ContentNegotiationManagerFactoryBean 内容协商
  20. Android View坐标系详解(getTop()、getX、getTranslationX...)

热门文章

  1. 2、Navicat安装提示报错
  2. Django(2) - Django模板
  3. 使用IntelliJ IDEA打开一个项目步骤
  4. C#开发的线程池和管理器 - 开源研究系列文章
  5. 防微杜渐,未雨绸缪,百度网盘(百度云盘)接口API自动化备份上传以及开源发布,基于Golang1.18
  6. Springboot+Dplayer+RabbitMQ实现视频弹幕延时入库
  7. 设置多个系统---vue-el-admin
  8. ORM哪家强?java,c#,php,python,go 逐一对比, 网友直呼:全面客观
  9. C# 处理实体类赋值(获取嵌套类型,支持list 自定义类型)
  10. Nacos配置中心 (介绍与配置)