对Attention is all you need 的理解

2023-11-07

本文参考的原始论文地址:https://arxiv.org/abs/1706.03762

谷歌昨天在arxiv发了一篇论文名字教Attention Is All You Need,提出了一个只基于attention的结构来处理序列模型相关的问题,比如机器翻译。传统的神经机器翻译大都是利用RNN或者CNN来作为encoder-decoder的模型基础,而谷歌最新的只基于Attention的Transformer模型摒弃了固有的定式,并没有用任何CNN或者RNN的结构。该模型可以高度并行地工作,所以在提升翻译性能的同时训练速度也特别快。

以下是谷歌Transformer的结构示意图。
Transformer结构

模型分为编码器和解码器两个部分,编码器由6个相同的层堆叠在一起,每一层又有两个支层。第一个支层是一个多头的自注意机制,第二个支层是一个简单的全连接前馈网络。在两个支层外面都添加了一个residual的连接,然后进行了layer nomalization的操作。模型所有的支层以及embedding层的输出维度都是 dmodel=512 . 模型的解码器也是堆叠了六个相同的层。不过每层除了编码器中那两个支层,解码器还加入了第三个支层,如图中所示同样也用了residual以及layer normalization。具体的细节后面再讲。

论文是从attention结构开始介绍Transformer的,这里为了方便,从模型的输入开始介绍。

模型输入。
编码器和解码器的输入就是利用学习好的embeddings将tokens(一般应该是词或者字符)转化为 dmodel 维向量。对解码器来说,利用线性变换以及softmax函数将解码的输出转化为一个预测下一个token的概率。

位置编码。
由于模型没有任何循环或者卷积,为了使用序列的顺序信息,需要将tokens的相对以及绝对位置信息注入到模型中去。论文在输入embeddings的基础上加了一个“位置编码”。位置编码和embeddings由同样的维度都是 dmodel 所以两者可以直接相加。有很多位置编码的选择,既有学习到的也有固定不变的。本文中用了正弦和余弦函数进行编码。

PE(pos,2i)=sin(pos/100002i/dmodel)
PE(pos,2i+1)=cos(pos/100002i/dmodel)

这里的pos是位置,i是维度。

下面介绍我对本文最重要的一部分注意力模型的理解。
论文首先给attentioin进行了一个定义。attention函数可以看作将一个query和一系列key-value对映射为一个输出(output)的过程。这里的query,keys,values以及output都是向量。输出是由带权的values加起来得到的,而每个value的权重是根据query和相应的key通过一个函数计算出来的。

scaled 的点乘attention
论文中用的attention是基本的点乘的方式,就是多了一个所谓的scale。输入包括维度为 dk 的queries以及keys,还有维度为 dv 的values。计算query和所有keys的点乘,然后每个都除以 dk (这个操作就是所谓的Scaled)。之后利用一个softmax函数来获取values的权重。
实际操作中,attention函数是在一些列queries上同时进行的,将这些queries并在一起形成一个矩阵 Q 同时keys以及values也并在一起形成了矩阵K 以及 V 。则attention的输出矩阵可以按照下述公式计算:

Attention(Q,K,V)=softmax(QKTdk)V

文中还讨论了点乘和additive attention的区别,additive的attention用了一个单层的前馈网络,理论上二者的复杂度是差不多的,但是实际上点乘更快而且空间上更有效率,因为点乘可以利用高度优化了的矩阵乘法代码来实现。
dk 比较小时,两个机制的效果几乎差不多,而在 dk 比较大的时候,additive的attention效果比没有scale操作的点乘attention效果好。作者怀疑这是因为the dot products growing too large in magnitude to result in useful gradients after applying the softmax function(不知道怎么翻译好),所以作者用了scale这个操作来规模化点乘。
下图为作者scale 点乘attention的结构图。

Scaled 点乘attention

多头的attention (Multi-Head Attention)
这个应该是本文最核心的部分。本文结构中的Attention并不是简简单单将一个点乘的attention应用进去。作者发现先对queries,keys以及values进行 h 次不同的线性映射效果特别好。学习到的线性映射分别映射到dk , dk 以及 dv 维。分别对每一个映射之后的得到的queries,keys以及values进行attention函数的并行操作,生成 dv 维的output值。具体操作细节如以下公式。

MultiHead(Q,K,V)=Concat(head1,...,headh)

where:headi=Attention(QWiQ,KWiK,VWiV)

这里映射的参数矩阵, WiQRdmodeldk , WiKRdmodeldk , WiVRdmodeldv
本文中对并行的attention层(或者成为头)使用了 h=8 的设定。其中每层都设置为 dk=dv=dmodel/h=64 . 由于每个头都减少了维度,所以总的计算代价和在所有维度下单头的attention是差不多的。

把这些attention头的output拼接起来作为最终值,就像下图中multihead attention结构示意图所描述的一样。
多头的attention

在本模型中如何使用attention
本文提出的模型Transformer以三种不同的方式使用了多头attention。
1. 在encoder-decoder的attention层,queries来自于之前的decoder层,而keys和values都来自于encoder的输出。这个类似于很多已经提出的seq-to-seq模型所使用的attention机制。
2. 在encoder含有self-attention层。在一个self-attention层中,所有的keys, values以及queries都来自于同一个地方,本例中即encoder之前一层的的输出。
3. 类似的,decoder中的self-attention层也是一样。不同的是在scaled点乘attention操作中加了一个mask的操作(设置为负无穷),这个操作是保证softmax操作之后不会将非法的values连到attention中(个人理解,比如你这一位置queryattention的values不能有这一位置之后的values的信息,只能有该位置前面的values,本人菜鸟欢迎拍砖)。

之前说模型由堆叠在一起的六个层组成,每层由两个支层,attention层就是其中一个,而attention之后的另一个支层就是一个前馈的网络。公式描述如下。

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

该网络是两个线性变换,中间加了一个ReLU激活函数。每个位置(position)上的线性变换是一样的,但是不同层与层的参数是不一样的。该网络的输入和输出维度都是 dmodel ,不过中间层的维度是2048.

模型的整体框架基本介绍完了,其最重要的创新应该就是Self-Attention的使用级联的多头attention架构。

作者在文中深入讨论了为什么选择使用self attention这一结构。主要从三个方面来谈。第一是每层的总计算复杂性,其次是能并行计算的数量,这点论文用所要求的序列操作的最小值来量化。第三点是针对网络长距离依赖的路径长度。为了提升在长序列上的计算性能,self-attention应该改被限制(restrict)在一个size大小为 r 的邻域内,这样可以将最大路径长度增加到O(n/r) ,至于具体如何去做作者说在未来工作中会研究。

self attention与其他模型性能比较

上图为self attention结构与cnn以及rnn的性能比较,可以看出self attention还是具有优势的。

论文中的东西就说这么多了,下面说我的感想。
自我感觉谷歌这次放大招了,完全抛弃了CNN以及RNN这几年做神经机器翻译的固有思维,仅用了attention来对句子进行编码和解码。从论文后面的附图可以看出该模型已经在很大程度上“理解”了句子的意思。也许过一段时间,各种层叠attention及其变种的模型就会满天飞了,但谷歌无疑开了这样一个好头,就是我们不必对固有的模型抱有很深的执念,尝试各种可能也许会有意想不到的效果。不过话说回来,谁知道这个模型是失败了多少次之后才有的成功呢?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对Attention is all you need 的理解 的相关文章

  • 强大的Source Insight查找操作和代码查看

    系列文章 一 Source Insight 简介 常用设置和常用的快捷键 二 Source Insight 工程操作 三 Source Insight 窗口介绍 四 强大的Source Insight查找操作和代码查看 五 Source I
  • Logcat 的常用命令说明

    个人认为有一下几个常用命令 adb logcat c 清除所有以前的日志 adb logcat d 这个命令是在时间上倒过来用的 就是你先操作 然后敲这个命令 打出来的log就是你刚操作那段时间的log 而且自动退出log模式 adb lo
  • Vue PostCss插件——autoprefixer,自动补全css浏览器前缀

    Autoprefixer是一款基于PostCSS插件 用于解析CSS并使用Can I Use中的值向CSS规则添加供应商前缀 它是 Google 推荐的 并在Twitter和阿里巴巴中使用 可以实现css3代码自动补全 也可以运用到sass

随机推荐

  • 实例:vmem_disk驱动-->vmem_disk驱动模块的加载与卸载(2)

    支持 制造请求 请求队列 static void setup device struct vmem disk dev dev int which memset dev 0 sizeof struct vmem disk dev dev gt
  • 达蒙DM数据库使用经验

    DM表 字段注释 注 dm数据库无法在建表的同时为字段名添加注释 为表添加注释 comment on table 库名 表名 is 表注释 为表字段添加注释 comment on column 库名 表名 列名 is 列注释 DM查询错误
  • 如何搭建一个CRM系统

    搭建一个客户关系管理系统 CRM 需要以下几个步骤 定义需求 明确您对 CRM 系统的要求 以便确定它应该具有哪些功能和特性 选择技术 根据您的需求 选择合适的技术平台 例如使用自主开发 购买现成软件或使用云 CRM 服务 数据收集 收集所
  • QT中如何在主窗口中添加子窗口

    1 方法 原理其实很简单 和在窗口上动态 代码的形式 添加控件的方法一样 但需要设置一下子窗口的属性 在子窗口构造函数中添加代码 setWindowFlags Qt FramelessWindowHint 作用 隐藏子窗口的标题栏和边框 如
  • 统计各专业学生人数

    题目描述 学生表 专业表 SELECT dept name ifnull z studen cou 0 AS 人数 FROM SELECT dept id COUNT AS cou FROM z studen GROUP BY dept i
  • 一种设置python函数执行超时时间

    问题来源 写该文章的缘由是因为最近回答CSDN用户一个关于函数超时的问题 当时用户提问 最近想用python实现如下的一个功能 即设置函数的超时时间 当超过这个时间后函数退回到父函数而不会引发异常或导致整个程序结束 当时用户还贴出了另一篇文
  • Python 朴素贝叶斯(Naive Bayes)分类

    Na ve Bayes 分类的核心是计算条件概率P y x 其中y为类别 x为特征向量 其意义是在x样本出现时 它被划分为y类的可能性 概率 通过计算不同分类下的概率 进而把样本划分到概率最大的一类 根据条件概率的计算公式可以得到 P y
  • oracle_11 linux客户端安装说明以及如何添加sqlldr命令

    1 安装文件准备 oracle instantclient11 2 basic 11 2 0 2 0 x86 64 rpm oracle instantclient11 2 devel 11 2 0 2 0 x86 64 rpm oracl
  • Th4.2:类模板的概念、类模板的定义和使用之详述

    本小节回顾的知识点分别是类模板的概念 类模板的定义和使用 今天总结的知识分为以下4个点 1 概述 2 类模板定义 3 类模板的成员函数 4 非类型模板参数 1 概述 类模板 就是包含待指定数据类型的类 这个待指定的数据类型就是类模板的模板参
  • Centos7安装Python3的方法(亲测高效)

    Centos7下安装Python3的方法 由于centos7原本就安装了Python2 而且这个Python2不能被删除 因为有很多系统命令 比如yum都要用到 root VM 105 217 centos Python 3 6 2 pyt
  • css布局中关于 块状元素和行内元素的区分

    这两天在准备实习的面试和笔试 准备复习一下这些基础的概念 避免自己处于一种仅脑袋理解嘴巴不能表述出来的状态 块状元素和行内元素的概念是在css页面布局这个地方出现 主要是将html标签按照一定的特性分成2类 块状元素和行内元素 内联元素 首
  • 循环双向链表

    循环双向链表 1 简介 单链表 总是从头到尾找结点 难道就不可以正反遍历都可以吗 当然可以 只不过需要加点东西而已 有了 next 指针 这就使得我们要查找下 结点的时同复杂度为 1 可是如果我们要查找的是上一结点的话 那最坏的时间复杂度就
  • Linux:死锁与解决方法

    死锁 死锁 指在一组进程中的各个进程均占有不会释放的资源 但因互相申请被其他进程所站用不会释放的资源而处于的一种永久等待状态 死锁现象 现象1 如果执行流加锁完毕后 不进行解锁则会造成死锁 上篇所述 现象2 线程A获取了1锁 线程B获取了2
  • [Qt5.12.3] 使用Chart模块中warning: ‘setAxisX‘ is deprecated, warning: ‘setAxisY‘ is deprecated的解决办法

    文章目录 问题描述 解决方案 后记 问题描述 在使用QtCharts模块绘图的过程中 X轴需要显示DateTime 不能使用默认的createDefaultAxes 遂使用了setAxisX setAxisY方法 但一直报方法被弃用 虽暂时
  • Latex: 参考文献双栏对齐

    参考 How to level columns in bibliography Latex 参考文献双栏对齐 需要实现的效果 方法1 在开头引用balance usepackage balance 在文末 参考文献前 加上 balance
  • Stream使用技巧(1)------数据处理技巧

    Stream使用技巧 1 数据处理技巧 一 背景 作为java8新特性之一的Stream API为开发者带来了极大的便利 它可以对我们需要操作的集合进行非常复杂的操作 以活的我们想要的结果 本文不会告诉你什么是Stream 毕竟网上花里胡哨
  • 双口ram 简介及Verilog实现

    简介 RAM Random Access Memory 随机存储器 是一种用来暂时存储中间数据的存储器 掉电易失 按照类型可以分为单口ram 双口ram 其中双口ram又有简单 伪 的ram 真双端口ram 在异步FIFO的内部就是一个双端
  • Networdx小案例学习

    文章目录 图的类型 无向图小案例 有向图的小案例 参考资料 图的类型 无向图小案例 import networkx as nx import matplotlib pyplot as plt G nx DiGraph 0 1 1 2 2 3
  • couldn‘t find package required on the “npm“ registry

    切换npm源就行 nrm use taobao
  • 对Attention is all you need 的理解

    本文参考的原始论文地址 https arxiv org abs 1706 03762 谷歌昨天在arxiv发了一篇论文名字教Attention Is All You Need 提出了一个只基于attention的结构来处理序列模型相关的问题