当前位置: 首页 > news >正文

Transformer论文精读

Transformer:Attention is all you need

Abstract:

在主流的序列转录模型(sequence transduction models:给一个序列,生成另一个序列),主要依赖循环或者卷积神经网络,一般是用encoder和decoder的架构。表现最好的模型通常在encoder和decoder之间加入一个注意力机制。

我们提出的一个简单的架构,Transformer,仅仅依赖注意力机制,没有用循环或者卷积神经网络。

在机器翻译任务上表现很好

Introduction:

Background:(相关工作)

1.如何使用卷积神经网络替换掉循环神经网络,这样做可以减少时序计算。但卷积神经网络对比较长的序列难以建模。如果对于跨度很长的序列,需要很多卷积层。但如果使用注意力机制,只用一层就可以。但卷积的好处是可以有多个输出通道,一个通道可以识别不同的模式。所以提出了多头注意力机制。

2.自注意力机制

3.memory network

Model Architecture

img

大多数神经序列转录模型都是一个encoder-decoder架构,这个encoder将一个输入(x1,…,xn)映射为Z=(z1,…,zn)。其中x1是一个词,z1是其对应的向量。编码器的输出(z1,…,zn)会作为解码器的输入。解码器的输出为一个长为m的序列(y1,…,ym)【例如输入10个英文单词,但对应的中文可能只有5个词】

解码器是一个自回归架构,过去时刻的输出又是当前时刻的输入。例如:预测y1,需要输入Z,预测y2,需要输入Z和y1。且输出是一个词一个词。

Encoder

编码器由六个一致的层堆叠形成,每层有两个子层,第一个是多头注意力机制,第二层是一个简单的MLP(positionwise fully connected feed-forward network)。在两个子层间有残差连接。最后是一个layer normalization。每个子层的输出为:LayerNorm(x+Sublayer(x))

在这里插入图片描述

因为残差连接输入和输出的维度要求是一样的,所以这里规定所有层的输出维度为512,包括embedding和两个子层。所以在Encoder中只有两个参数,层数N和维度d。

batch norm(对特征归一化):将一个小批量二维矩阵的数据,每一列转换为均值为0,方差为1的数据。做法是,将该特征列数据:

(每个数据 - 该列均值 / 该列方差)

layer norm(对样本归一化): 将一个小批量二维矩阵的数据,每一行转换为均值为0,方差为1的数据。

layer norm的好处是计算均值和方差较为稳定。因为每个样本的长度这里是不固定的,在batch norm中会很不稳定。

在这里插入图片描述

Decoder

解码器的基本结构和编码器类似,也是6个层堆叠形成,不同的是,每个子层有三部分组成。且每个子层间有残差连接,最后是一个layer normalization。解码器的第一个层是一个mask(掩码),其作用是确保预测t时刻的输出时,输入数据均来自t时刻之前。

Attention

主要是一个注意力函数,其作用是将一个query和一系列key-value对映射为一个output。所有这些query、key、value、output都是向量。output是value的一个加权和,所以output的维度和value是一样的。每个value对应的权重是由其key和query的相似度计算得来。不同注意力机制的权值计算方式不同。

Scaled Dot-Product Attention

1.queries和keys都是维度为 d k d_k dk的向量。values维度为 d v d_v dv

2.用query和所有key做点乘

3.分别除以 d k \sqrt{d_k} dk

4.用softmax转换为概率

实际运算时,会以矩阵的方式执行

在这里插入图片描述

有两种通用的注意力机制,分别是additive attention和dot-product(multiplicative)attention。Dot-product attention和这里的是一致的,除了加入了除以 d k \sqrt{d_k} dk 原因在于,当query和key的向量维度较小时,乘积结果一般不会过大或者过小,因此softmax的结果也不会集中在0或者1附近。但维度较大时,乘积结果过大或者过小,softmax后会靠近1或0,在这些区域,梯度较小。

additive attention的权值计算采用单隐藏层的前馈神经网络。两种机制的复杂度相似,但后者在时间和空间上效率更高。

在这里插入图片描述

Mask:因为注意力机制会看到所有时刻的信息,但在预测时刻t的输出时,只需要t时刻之前的信息。所以mask将 Q K d k \frac{QK}{\sqrt{d_k}} dk QK的t时刻之后的值全部变为一个非常小的负数,这样在Softmax后,这些位置的权值就为0。

Multi-Head Attention
for i in h:先将V、K、Q映射到低维 #每次映射都会学到不一样的方法,在投影后的空间中可以匹配不同模式head_i = attention(V、K、Q)  #将投影后的V、K、Q输入Attention
Concat(head_1,...,head_h) W^O #将每个头的结果concat,并将最后的结果再次投影到低维空间 

Position-wise Feed-Forward Networks

简单说就是一个单隐藏层的MLP,Position-wise指的是,这个MLP是针对每个词来做,每个词上都有一个MLP。

在这里插入图片描述

其中x作为encoder的输出,是一个词的向量,本文中长512,W1会将其映射到2048,W2又映射为512

Embedding and Softmax

embedding模型出现三次,分别在encoder和decoder以及softmax前的Linear层。且这三处模型拥有相同的权值,并且乘了 d m o d e l \sqrt{d_{model}} dmodel ,为了和后面的Positional Encoding在量级上匹配。

因为对于维度较大向量,归一化后,每个位置的值都比较小,而后续需要和Position 向量相加,后者范围在(-1,1),需要保证两者数量级一致。

Positional Encoding

因为输入的是一个序列,但Attention本身是不会涵盖时序信息的,本质是对输入向量的一个加权和,意味着如果将输入词打乱,得到的结果均相同。

这里的做法是,对每个词在句子中的位置,生成一个和Embedding同维度的向量,来表示位置信息。

在这里插入图片描述

最后将embedding和位置向量相加

Why self-attention

在这里插入图片描述

比较的第一列是每层模型的复杂度,第二列是每个操作需要等待前面的多长时间,越小越好,第三列是每个信息从一个数据点走到另一个数据点要多远,越小越好。

自注意力的矩阵相乘的时间复杂度 O ( n 2 d ) O(n^2d) O(n2d)。因为矩阵乘法,所以操作等待时间很短,而且Attention的输出是由输入的加权和组成,所以可以获取来自任意位置的信息。

最后的受限的自注意力,是指query只跟最近的r个邻居算相似度

Training Data and Batching(实验)

在WMT 2014英语-德语数据集,包含450万个句子对。将英语和德语的词根一起作为一个词典,包含37000个token,这样可以在 encoder和decoder中贡献权重。

2.再将三者送入之前

Conclusion

第一个仅仅依赖注意力机制的序列转录模型,用多头注意力(multi-headed self-attention)取代了在encoder-decoder架构中被通常使用的循环层。

相关文章:

  • App UI 风格,引领时尚
  • 无头+单向+非循环链表的实现
  • web学习笔记(六十五)
  • Recognize Anything: A Strong Image Tagging Model(RAM模型使用方法)
  • 各品牌电视安装第三方软件失败的解决方法
  • 理解数仓建模
  • 移动安全赋能化工能源行业智慧转型
  • 软件2_算法功能23
  • 数据库(28)——联合查询
  • Web前端Hack:深入探索、挑战与防范
  • 【C++】深入理解decltype和decltype(auto)
  • MyBatisPlus插件生成代码
  • Web前端 CodeView:深度解析与实用指南
  • .net后端程序发布到nignx上,通过nginx访问
  • 【React】json-server
  • 2019年如何成为全栈工程师?
  • Android单元测试 - 几个重要问题
  • CentOS7 安装JDK
  • express + mock 让前后台并行开发
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • SpiderData 2019年2月25日 DApp数据排行榜
  • ucore操作系统实验笔记 - 重新理解中断
  • vue总结
  • 成为一名优秀的Developer的书单
  • 给新手的新浪微博 SDK 集成教程【一】
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 前端性能优化——回流与重绘
  • 前端性能优化--懒加载和预加载
  • 山寨一个 Promise
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 突破自己的技术思维
  • 微信公众号开发小记——5.python微信红包
  • 微信小程序--------语音识别(前端自己也能玩)
  • 一道闭包题引发的思考
  • 用Canvas画一棵二叉树
  • 运行时添加log4j2的appender
  • 《天龙八部3D》Unity技术方案揭秘
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (52)只出现一次的数字III
  • (LeetCode 49)Anagrams
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (第一天)包装对象、作用域、创建对象
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (接口自动化)Python3操作MySQL数据库
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (小白学Java)Java简介和基本配置
  • .net 按比例显示图片的缩略图
  • .NET 中让 Task 支持带超时的异步等待
  • .Net多线程Threading相关详解
  • .net分布式压力测试工具(Beetle.DT)
  • /etc/apt/sources.list 和 /etc/apt/sources.list.d
  • @Pointcut 使用
  • @RequestMapping-占位符映射
  • []T 还是 []*T, 这是一个问题