[NLP]Transformer模型解析
简介[2]
Attention Is All You Need是2017年google提出来的一篇论文,论文里提出了一个新的模型,叫Transformer,这个结构广泛应用于NLP各大领域,是目前比较流行的模型。该模型没有选择大热的RNN/LSTM/GRU的结构,而是只使用attention layer和全连接层就达到了较好的效果,同时解决了RNN/LSTM/GRU中的long dependency problem,以及传统RNN训练并行度以及计算复杂度高的问题。缺点是输入固定长度的序列,需要对原始文本进行裁剪和填充,导致不能学习到序列中更长距离的依赖关系。
Transformer总体结构[1]
Transformer采用Encoder-Decoder架构。
上图就是论文中提出的Transformer结构。其中左半部分是encoder右半部分是decoder.
Encoder层中有6个一模一样的层结构,每个层结构包含了两个子层,第一个子层是多头注意力层(Multi-Head Attention,橙色部分),第二个子层是前馈连接层(Feed Forward,浅蓝色部分)。除此之外,还有一个残差连接,直接将input embedding传给第一个Add & Norm层(黄色部分)以及 第一个Add & Norm层传给第二个Add & Norm层(即图中的粉色-黄色1,黄色1-黄色2部分运用了残差连接)。该层的重点-注意力层会在下文中进行解释。
Decoder层中也有6个一模一样的层结构,但是比Endoer层稍微复杂一点,它有三个子层结构,第一个子层结构是遮掩多头注意力层(Masked Multi-Head Attention,橙色部分),第二个子层是多头注意力结构(Multi-Head Attenion,橙色部分),第三个子层是前馈连接层(Feed Forward,浅蓝色部分)。
注1:这一部分的残差连接是粉色-黄色1,黄色1-黄色2,黄色2-黄色3三个部分
注2:该层的重点是第二个子层,即多头注意力层,它的输入包括两个部分,第一个部分是第一个子层的输出,第二个部分是Encoder层的输出(这是与encoder层的区别之一),这样则将encoder层和decoder层串联起来,以进行词与词之间的信息交换,这里信息交换是通过共享权重WQ,WV,WK得到的。
注3:第一个子层中的mask,它的作用就是防止在训练的时候使用未来的输出的单词。比如训练时,第一个单词是不能参考第二个单词的生成结果的,此时就会将第二个单词及其之后的单词都mask掉。总体来讲,mask的作用就是用来保证预测位置i的信息只能基于比i小的输出。因此,encoder层可以并行计算,一次全部encoding出来,但是decoder层却一定要像rnn一样一个一个解出来,因为要用上一个位置的输入当做attention的query.
Self-Attention[2]
self-Attention是Transformer用来找到并重点关注与当前单词相关的词语的一种方法。如下述例子:
The animal didn’t cross the street because it was too tired.
这里的it究竟是指animal还是street,对于算法来说是不容易判断的,但是self-attention是能够把it和animal联系起来的,达到消歧的目的。
这里描述self-attention的具体过程如下图所示:
从上图可以看出,attention机制中主要涉及三个向量Q(Query),K(Key),V(Value),这三个向量的计算过程如下图所示:
上图中,WQ,WV,WK是三个随机初始化的矩阵,每个特征词的向量计算公式如下所示:
Queries: q1 = x1 · WQ q2 = x2 · WQ
Keys: k1 = x1 · WK k2 = x2 · WK
Values: v1 = x1 · WV v2 = x2 · WV
Score: s1 = q1 · k1=112 s2 = q2 · k2 = 96
Divide by 8: d1 = s1 / 8 = 14 d2 = s2 / 8 = 12
Softmax: sm1 = e14/ (e14 + e12) = 0.88 sm2 = e12 / (e14 + e12) = 0.12
Softmax * value: v1 = sm1 * v1 v2 = sm2 * v2
注1:score表示关注单词的相关程度.
注2:这种通过 query 和 key 的相似性程度来确定 value 的权重分布的方法被称为scaled dot-product attention。
Multi-Headed Attention
多头注意力机制是指有多组Q,K,V矩阵,一组Q,K,V矩阵代表一次注意力机制的运算,transformer使用了8组,所以最终得到了8个矩阵,将这8个矩阵拼接起来后再乘以一个参数矩阵WO,即可得出最终的多注意力层的输出。全部过程如下图所示:
左图表示使用多组Q,K,V矩阵,右图表示8组Q,K,V矩阵计算会得出8个矩阵,最终我们还需将8个矩阵经过计算后输出为1个矩阵,才能作为最终多注意力层的输出。如下图所示,其中WO是随机初始化的参数矩阵。
Positional Encoding
在图figure 1中,还有一个向量positional encoding,它是为了解释输入序列中单词顺序而存在的,维度和embedding的维度一致。这个向量决定了当前词的位置,或者说是在一个句子中不同的词之间的距离。论文中的计算方法如下:
PE(pos,2 * i) = sin(pos / 100002i/dmodel)
PE(pos,2 * i + 1) = cos(pos / 100002i/dmodel)
其中pos指当前词在句子中的位置,i是指向量中每个值的index,从公式中可以看出,句子中偶数位置的词用正弦编码,奇数位置的词用余弦编码。最后把positional encoding的值与embedding的值相加作为输入传进transformer结构中,如下图所示:
Layer normalization
在transformer中,每一个子层(自注意力层,全连接层)后都会有一个Layer normalization层,如下图所示:
Normalize层的目的就是对输入数据进行归一化,将其转化成均值为0方差为1的数据。LN是在每一个样本上都计算均值和方差,如下图所示:
LN的公式如下:
LN(xi) = α * (xi - μL / √(σ2L + ε)) + β
以上是encoder层的全部内容,最后再展示一下将两个encoder叠加在一起的内部图:
其他细节
1、Transformer中包含两种mask:padding mask 在所有的scaled dot-product attention 里面都需要用到,而sequence mask 只有在decoder的self-attention里面用到。
Padding Mask是为了解决填充0的无意义的位置而存在的,具体的说,因为要对输入序列进行对齐,当输入序列较短时,需要在输入序列后填充0,但是这些填充的数据没什么意义,attention机制不应该把注意力放在这些位置上,因此我们需要做一些统一的处理。具体的做法是把这些位置的值加上一个非常大的负数,这样经过softmax处理的话,这些位置的值就会接近0。
参考资料:
[1] https://www.jianshu.com/p/ef41302edeef?utm_source=oschina-app
[2] https://blog.csdn.net/u012526436/article/details/86295971
[3] https://zhuanlan.zhihu.com/p/47282410
[4] https://zhuanlan.zhihu.com/p/44121378
[NLP]Transformer模型解析的更多相关文章
- NLP与深度学习(四)Transformer模型
1. Transformer模型 在Attention机制被提出后的第3年,2017年又有一篇影响力巨大的论文由Google提出,它就是著名的Attention Is All You Need[1]. ...
- 史上最详尽的NLP预处理模型汇总
文章发布于公号[数智物语] (ID:decision_engine),关注公号不错过每一篇干货. 转自 | 磐创AI(公众号ID:xunixs) 作者 | AI小昕 编者按:近年来,自然语言处理(NL ...
- 详解Transformer模型(Atention is all you need)
1 概述 在介绍Transformer模型之前,先来回顾Encoder-Decoder中的Attention.其实质上就是Encoder中隐层输出的加权和,公式如下: 将Attention机制从Enc ...
- transformer模型解读
最近在关注谷歌发布关于BERT模型,它是以Transformer的双向编码器表示.顺便回顾了<Attention is all you need>这篇文章主要讲解Transformer编码 ...
- Transformer模型---decoder
一.结构 1.编码器 Transformer模型---encoder - nxf_rabbit75 - 博客园 2.解码器 (1)第一个子层也是一个多头自注意力multi-head self-atte ...
- Transformer模型总结
Transformer改进了RNN最被人诟病的训练慢的缺点,利用self-attention机制实现快速并行. 它是由编码组件.解码组件和它们之间的连接组成. 编码组件部分由一堆编码器(6个 enco ...
- Transformer模型详解
2013年----word Embedding 2017年----Transformer 2018年----ELMo.Transformer-decoder.GPT-1.BERT 2019年----T ...
- RealFormer: 残差式 Attention 层的Transformer 模型
原创作者 | 疯狂的Max 01 背景及动机 Transformer是目前NLP预训练模型的基础模型框架,对Transformer模型结构的改进是当前NLP领域主流的研究方向. Transformer ...
- 【python量化】将Transformer模型用于股票价格预测
本篇文章主要教大家如何搭建一个基于Transformer的简单预测模型,并将其用于股票价格预测当中.原代码在文末进行获取.小熊猫的python第二世界 1.Transformer模型 Transfor ...
随机推荐
- 测试用例与PUCCH
- 简单的登录验证小程序_python
一.要求 输入用户名密码,验证成功之后显示欢迎信息,输错三次后锁定. 程序: #!/usr/bin/env python# _*_ coding:utf-8 _*_#Author:chenxz #将黑 ...
- H3C RIP配置
一.RIP简介 RIP(Routing Information Protocol,路由信息协议)是一种较为简单的内部网关协议(Interior Gateway Protocol,IGP),主要用于规模 ...
- nginx 无法启动:bind() to 0.0.0.0:443 failed
bind to 0.0.0.0:443 failed.其实就是443端口被其它程序占用,要结束占用443端口导致nginx不能启动的应用. CMD: 1.查看所有程序使用的端口 netstat -ao ...
- javaScript(Date与Math的API)
目录 Math Math的两个属性值 E PI abs(); ceil(); floor(); round(); max(); min (); pow(); random sin(); cos(); ...
- DE1_MSEL
基础的一般实验:01001(现在用的)或10010 马上换linux,做个记录: sd卡启动linux系统时,启动开关0至4位拨至00000
- python之路模块补充
=======================================json序列化========================================= ============ ...
- js中迭代方法
基础遍历数组: for() for( in ) for(var i = 0;i<arr.length;i++){ ...
- 《NVM-Express-1_4-2019.06.10-Ratified》学习笔记(8.21)-- Host Operation with Asymmetric Namespace Access Reporting
8.21 使用ANA报告的主机操作 8.21.1 主机ANA普通操作 主机通过在Identify Controller数据结构中CMIC域的第3位来判断是否支持ANA.NSID或标识(参考第7.10章 ...
- linux 创建svn版本库,并在svn上配置checkstyle做代码风格检查
一.创建SVN版本库 1.安装svn服务器 yum install subversion 2.查看版本 svnserve --version 3.建立SVN版本库目录(即你的SVN服务器里面的文件存放 ...