[论文解读]Attention is all you need

2023-10-31

在这里插入图片描述


最早提出self-attention思想的就是google17年这篇著名的论文了。
  • 动机

传统的rnn难于并行,而最近流行的attention往往会利用rnn。总之为了解决无法并行训练问题,google提出了self-attention,完全摒弃了rnn单元,从而做到并行训练。
在这篇论文之前,facebook AI lab就提出了一种解决这个问题的方法,就是用cnn代替rnn单元来实现并行,具体发表在论文《Convolutional Sequence to Sequence Learning》。google提出用self-attention代替rnn,也是对facebook的一种回应吧。


  • 背景

self-attention被google利用在了机器翻译上,目前比较流行的是attention-based机器翻译模型,基本已经取代encoder-decoder模型。但大多数仍是以rnn为基本单元。google的self-attention就是对传统的机器翻译模型进行改进,摒弃了rnn单元。要想深刻理解self-attention,我们首先先了解一下传统的机器翻译模型。

传统attention-based机器翻译模型代表论文《Neural machine translation by jointly learning to align and translate》,基本网络框图如下:

这里写图片描述
---------------------------------------------------图1-----------------------------------------------

图1就是传统的attention-based MT。它的一些基本公式有:
这里写图片描述
这里写图片描述
这里写图片描述
这种结构google在论文中也有提到过,并被划分成一类attention。


  • 思考

以传统attention-based MT为背景,现在想要把rnn单元去掉,也换成attention。我们来看看google是怎么做的,首先我们需要先了解attention的概念:

  • attention的概念和分类
    google是最先形式化地提出attention地概念的。它把attention的三个重要组件分别称为key,value和query
    直接解释这三个名词可能会很抽象难懂。我们从传统的attention-based MT模型入手。在图1中,query就是解码层的s,key和value都是编码层的输出o。字面意思上来说,query是查询,即:我与你们的相似度是多少?key是键,即query要比较的值,value是值,一个key对应一个value,即query与我的key相似度为a,则我这个值对query的贡献度就为a。那么每个位置解码的时候,query(s)会分别计算与编码层各个位置key的相似度,把相似度做为对应value的权重,最后此位置的attention的输出即为所有位置value的加权输出。即用公式表示为:
    这里写图片描述


    论文也对attention进行了分类,query来自于解码层,key和value来自于编码层时叫vanilla attention(论文中并没有这么说),即最基本的attention。query,key和value都来自编码层的叫self attention

于是,很自然的,把rnn换成self-attention。

  1. 在编码层,输入的word-embedding就是key,value和query,然后做self-attention得到编码层的输出。这一步就模拟了图1中的编码层,输出就可以看成图1中的h。
  2. 然后模拟图1中的解码层,解码层的关键是如何得到s,即用来和编码层做attention的query,我们发现,s与上个位置的真实label y,上个位置的s,和当前位置的attention输出c有关,换句话说,位置i的s利用了所有它之前的真实label y信息,和所有它之前位置的attention的输出c信息。label y信息我们全都是已知的,而之前位置的c信息虽然也可以利用,但是我们不能用,因为那样就又不能并行了(因为当前位置的c信息必须等它之前的c信息都计算出来)。于是我们只能用真实label y来模拟解码层的rnn。前面说过,当前位置s使用了它之前的所有真实label y信息。于是我们可以做一个masked attention,即对真实label y像编码层的x一样做self-attention,但每个位置的y只与它之前的y有关(mask),这样,self-attention之后每个位置的输出综合了当前位置和它之前位置的所有y信息,即可做为s(query)。
  3. 得到编码层的key和value以及解码层的query后,下面就是模仿vanilla attention,利用key和value以及query再做最后一个attention。得到每个位置的输出。

总结起来就是,x做self-attention得到key和value,y做masked self-attention得到query,然后key,value,query做vanilla-attention得到最终输出。


基本框图:
这里写图片描述

  • 相似度的计算
    attention中最重要的一步就是query和key相似度的计算,目前主要的相似度计算方法有以下4种。
    这里写图片描述
    其中Q为query,K为key,V为value。《Neural machine translation by jointly learning to align and translate》这篇论文就使用了perceptron attention。而这篇论文使用的是dot attention,后面会有详细的介绍。


  • 细节

上面已经说了这篇论文的主要思想,当然论文中还是用到了很多其他技术的,在模型上也有细节上的改进。我们从输入到输出来一步步说明。


  • position embedding
    论文采用self-attention的一个缺点就是无法使用word的位置信息。rnn可以使用位置信息,因为当位置变化时(比如互换两个word的位置)rnn的输出就会改变。而self-attention各个位置可以说是相互独立的,输出只是各个位置的信息加权输出,并没有考虑各个位置的位置信息。cnn也有类似位置无关的特点。以往的pe往往采用类似word_embedding式的可以随网络训练的位置参数,google提出了一种固定的pe算法:
    这里写图片描述
    即在偶数位置,此word的pe是sin函数,在奇数位置,word的pe是cos函数。论文说明了此pe和传统的训练得到的pe效果接近。并且因为 sin(α+β)=sinα cosβ+cosα sinβ 以及 cos(α+β)=cosα cosβ−sinα sinβ,位置 p+k 的向量可以用位置 p 的向量的线性变换表示,这也说明此pe不仅可以表示绝对位置,也能表示相对位置。
    最后的embedding为word_embedding+position_embedding。而facebook的论文是拼接两个embedding。


  • multi-head attention
    有了embedding,接下来就是attention了,论文采用了多个attention。首先embedding做h次linear projection,每个linear projection的参数不一样,然后做h次attention,最后把h次attention的结果拼接做为最后的输出。作者表明,多个attention便于模型学习不同子空间位置的特征表示,然后最终组合起来这些特征,而单头attention直接把这些特征平均,就减少了一些特征的表示可能。如图所示:
    这里写图片描述
    公式表示为:
    这里写图片描述


  • Scaled Dot-Product
    这篇论文计算query和key相似度使用了dot-product attention,即query和key进行点乘(内积)来计算相似度。论文中的公式如下:
    这里写图片描述
    示意图为:
    这里写图片描述
    之所以用内积除以维度的开方,论文给出的解释是:假设Q和K都是独立的随机变量,满足均值为0,方差为1,则点乘后结果均值为0,方差为dk。也即方差会随维度dk的增大而增大,而大的方差导致极小的梯度(我认为大方差导致有的输出单元a(a是softmax的一个输出)很小,softmax反向传播梯度就很小(梯度和a有关))。为了避免这种大方差带来的训练问题,论文中用内积除以维度的开方,使之变为均值为0,方差为1。


  • 预测
    训练的时候我们知道全部真实label,但是预测时是不知道的。可以首先设置一个开始符s,然后把其他label的位置设为pad,然后对这个序列y做masked attention,因为其他位置设为了pad,所以attention只会用到第一个开始符s,然后用masked attention的第一个输出做为query和编码层的输出做普通attention,得到第一个预测的label y,然后把预测出的label加入到初始序列y中的相应位置,然后再做masked attention,这时第二个位置就不再是pad,那么attention层就会用到第二个位置的信息,依此循环,最后得到所有的预测label y。其实这样做也是为了模拟传统attention的解码层(当前位置只能用到前面位置的信息)。


  • other
    label Smoothing
    用softmax分类并使用交叉熵函数做为损失函数时,真实标签只有0或1,根据反向求导公式可知,这会难于泛化,并且上层导数容易为0.所以把真实标签smooth,使之为0-1之间的一个数,而不是两个极端。
    layer normlization
    为了加速训练,避免陷入局部最优。
    stack layers
    如Figure 1的网络结构,编码层和解码层都重复了N次,最后把结果拼接。
    restricted self-attention
    为了缓解需要两两计算相似性的计算代价,作者又提出了restricted版本的self-attention,即每个query只需和他临近的r个key计算相似性。类似于卷积中的窗口概念。


  • 网络结构

    如图:
    这里写图片描述

  • 总结

    self-attention层的好处是能够一步到位捕捉到全局的联系,解决了长距离依赖,因为它直接把序列两两比较(代价是计算量变为 O(n2),当然由于是纯矩阵运算,这个计算量相当也不是很严重),而且最重要的是可以进行并行计算。
    相比之下,RNN 需要一步步递推才能捕捉到,并且对于长距离依赖很难捕捉。而 CNN 则需要通过层叠来扩大感受野,这是 Attention 层的明显优势。
    self-attention其实和cnn,rnn一样,也是为了对输入进行编码,为了获得更多的信息。所以应把self-attention也看成网络中的一个层加进去。

  • 参考

  1. 一文读懂self-attention
  2. 自然语言处理中的自注意力机制(Self-attention Mechanism)
  3. attention model–Neural machine translation by jointly learning to align and translate论文解读
  4. Attention is all you need
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[论文解读]Attention is all you need 的相关文章

  • 添加对 CountVectorizer (sklearn) 的词干支持

    我正在尝试使用 sklearn 将词干添加到 NLP 中的管道中 from nltk stem snowball import FrenchStemmer stop stopwords words french stemmer French
  • 如何使用CNN来训练不同大小的输入数据?

    CNN 似乎主要针对固定大小的输入来实现 现在我想用CNN来训练一些不同大小的句子 有哪些常用的方法 以下建议主要与用于计算机视觉任务 特别是识别 的 CNN 相关 但也可能对您的领域有所帮助 我会看看He 等人的 用于视觉识别的深度卷积网
  • 当我在本地运行 CoreNLP 时,为什么“corenlp.run”会产生不同的结果?

    网站corenlp run http corenlp run它应该是 CoreNLP 演示站点 显示的结果与我在本地计算机上运行 CoreNLP 管道时的结果截然不同 网站上确实显示了正确的结果 而本地机版本却没有 我想知道是否有任何接近
  • 创建向量空间

    我有一个问题 我有很多文档 每一行都是由某种模式构建的 当然 我有这一系列的图案 我想创建一些向量空间 然后通过某种规则来向量这个模式 我还不知道这个规则是什么 即使这个模式像我的向量空间的 质心 然后向量当前文档的每一行 再次按照此规则
  • browserify :- 未捕获类型错误:fs.readFileSync 不是函数

    我试图在我的代码中使用natural js 在客户端使用它 我使用browserify 但它给出了一个错误 Uncaught TypeError fs readFileSync is not a function at loadDictio
  • 日期自然语言解析器(.NET)?

    我希望能够让用户使用自然语言 例如 下周五 每个工作日 输入日期 包括重复日期 很像以下的例子http todoist com Help timeInsert http todoist com Help timeInsert I found
  • Python 3 和 NLTK 与 WordNet 2.1 - 这可能吗?

    我将 Python 3 和 NLTK 3 0 0 与 WordNet 3 0 结合使用 我想用该数据 semval2007 https github com alvations pywsd tree master pywsd data se
  • 如何使用 python 中的 spacy 库将句子转换为问题 [请参阅下面的我的代码进行更正]

    我需要使用 python 中的 spacy 将任何句子转换为问题 我下面的代码太长了 我需要做更多的工作才能将任何句子完成为问题格式 现在在这段代码中我根据以下条件制定条件是形式 需要形式 有形式 做形式通过检查过去时和现在时 输入 尼娜拉
  • 如何调整 NLTK 句子标记器

    我正在使用 NLTK 来分析一些经典文本 但我在按句子标记文本时遇到了麻烦 例如 这是我从以下内容中得到的片段莫比迪克 http www gutenberg org cache epub 2701 pg2701 txt import nlt
  • BERT - 池化输出与序列输出的第一个向量不同

    我在 Tensorflow 中使用 BERT 有一个细节我不太明白 根据文档 https tfhub dev google bert uncased L 12 H 768 A 12 1 https tfhub dev google bert
  • 使用我自己的训练示例训练 spaCy 现有的 POS 标记器

    我正在尝试在我自己的词典上训练现有的词性标注器 而不是从头开始 我不想创建一个 空模型 在spaCy的文档中 它说 加载您想要统计的模型 下一步是 使用add label方法将标签映射添加到标记器 但是 当我尝试加载英文小模型并添加标签图时
  • Blenderbot 微调

    我一直在尝试微调 HuggingFace 的对话模型 Blendebot 我已经尝试过官方拥抱脸网站上给出的传统方法 该方法要求我们使用 trainer train 方法来完成此操作 我使用 compile 方法尝试了它 我尝试过使用 Py
  • Spacy 中的自定义句子分割

    I want spaCy使用我提供的句子分割边界而不是它自己的处理 例如 get sentences Bob meets Alice SentBoundary They play together gt Bob meets Alice Th
  • 如何提取数字(以及比较形容词或范围)

    我正在用 Python 开发两个 NLP 项目 它们都有类似的任务提取数值和比较运算符来自句子 如下所示 greater than 10 weight not more than 200lbs height in 5 7 feets fas
  • SpaCy 模型“en_core_web_sm”的词汇量大小

    我尝试在 SpaCy 小模型中查看词汇量 model name en core web sm nlpp spacy load model name len list nlpp vocab strings 只给了我 1185 个单词 我也在同
  • 是否可以使用 Google BERT 来计算两个文本文档之间的相似度?

    是否可以使用 Google BERT 来计算两个文本文档之间的相似度 据我了解 BERT 的输入应该是有限大小的句子 一些作品使用 BERT 来计算句子的相似度 例如 https github com AndriyMulyar semant
  • 如何检测文本是否可读?

    我想知道是否有一种方法可以告诉给定的文本是人类可读的 我所说的人类可读的意思是 它有一些含义 格式就像某人写的文章 或者至少是由软件翻译器生成的供人类阅读的文章 这是背景故事 最近我正在制作一个应用程序 允许用户将短文本上传到数据库 在部署
  • 缩短文本并仅保留重要句子

    德国网站 nandoo net 提供了缩短新闻文章的可能性 如果使用滑块更改百分比值 文本会发生变化并且某些句子会被遗漏 您可以在这里看到它的实际效果 http www nandoo net read article 299925 http
  • 除非 POS 显式,否则 WordNetLemmatizer 不会返回正确的引理 - Python NLTK

    我正在对 Ted 数据集成绩单进行词形还原 我注意到一些奇怪的事情 并非所有单词都被词形还原 要说的是 selected gt select 哪个是对的 然而 involved gt involve and horsing gt horse
  • 管道:多个流消费者

    我编写了一个程序来计算语料库中 NGram 的频率 我已经有一个函数 它消耗一串令牌并生成一个订单的 NGram ngram Monad m gt Int gt Conduit t m t trigrams ngram 3 countFre

随机推荐

  • Unity 2D和3D射线检测

    2D射线检测 Canvas事件点击检测 返回光线投射结果 public List
  • Android 7.0 之后抓包 unknown 和证书无效的解决方案(无需改代码)

    背景 使用抓包软件 以 Charles 为例 抓取APP的 https 请求时 Android和Charles都正确安装了证书却出现抓包失败 报错 Client SSL handshake failed An unknown issue o
  • codeforces 1080 C. Masha and two friends

    题意 n m矩形 被人泼一次白漆 又被泼一次黑漆 问结果白黑数量 首先 xy交换一下 矩形变成左上 右下表示法 记录结果白记为num1 黑num2 泼之前黑白数量很好确定 矩形内黑白数量也很好确定 先减去2个矩形内黑白数量 记录矩形面积白a
  • js push(),pop(),unshift(),shift()的用法小结

    js中push pop unshift shift 的用法小结 1 push pop 和unshift shift 这两组同为对数组的操作 并且会改变数组的本身的长度及内容 不同的是 push pop 是从数组的尾部进行增减 unshift
  • python均值插补法填补缺失值_使用python+sklearn实现处理缺失值

    由于各种原因 许多真实世界中的数据集都包含缺失值 这些值通常被编码为空格 NaNs或其他占位符 然而 这些数据集与scikit learn估计器 estimators 不兼容 scikit learn估计器 estimators 假设数组中
  • 《计算机视觉技术与应用》-----第五章 边缘和轮廓

    系列文章目录 计算机视觉技术与应用 第二章 图像处理基础 计算机视觉技术与应用 第三章 图形用户界面 计算机视觉技术与应用 第四章 图像变换 计算机视觉技术与应用 第五章 边缘和轮廓 计算机视觉技术与应用 第六章 边缘和轮廓 计算机视觉技术
  • Python标准库之——time模块

    前言 继上一篇学完Python 我决定熬夜整理这篇总结 本篇总结一下Python中常用的time标准库用法 通过Demo程序来加深理解 目录 time模块 Demo实例 常用参数 struct time结构 format字符串 time模块
  • 《图说区块链》读书笔记

    数据层 描述区块链技术的物理形式 例如时间戳 哈希函数 网络层 实现区块链网络中节点的信息交换 共识层 让分散的节点针对区块数据的有效性达成共识 例如工作量证明 权益证明 股份授权 激励层 提供一定的激励机制 鼓励节点参与区块两的安全验证工
  • Kafka Eagle 安装与部署详解

    Kafka Eagle 安装与部署详解 在大数据领域中 Kafka 是一种高性能 分布式的消息队列系统 被广泛应用于实时数据流处理和日志收集等场景 而 Kafka Eagle 则是一款用于监控和管理 Kafka 集群的开源工具 它提供了丰富
  • transforms.Compose()类详解:串联多个transform操作

    torchvision是pytorch的一个图形库 它服务于PyTorch深度学习框架的 主要用来构建计算机视觉模型 torchvision transforms主要是用于常见的一些图形变换 以下是torchvision的构成 torchv
  • 如何做好App性能测试

    如何做好App性能测试 App性能测试和网站性能测试不一样 它分成客户端性能测试和服务器性能测试 下面我们详细来说明 1 客户端性能测试 一个App做的好不好 不仅仅只反应在功能上 被测的app在中低端机上的性能表现也很重要 比如 一个很好
  • JAVA安装与配置教程

    一 下载jdk 下载链接 https pan baidu com s 1Z6SJRcHCsMRMzV 3ole0dg 提取码 h42f 二 安装java 1 下一步 2 点击 更改 选择安装路径 建议在Java文件夹里创建两个文件夹 分别命
  • 计算机网络笔记(五):传输层

    文章目录 前言 多路复用和多路分用 UDP User Datagram Protocol RFC 768 可靠数据传输原理 流水线机制与滑动窗口协议 Go Back N GBN 协议 Selective Repeat SR 协议 TCP 协
  • 【js】删除数组中指定元素

    删除数组中指定的元素 export const removeArr function arr val let index arr indexOf val if index gt 1 arr splice index 1 return arr
  • varying是vs和Ps之间的shader传递变量

    正如uniform是shader和应用程序之间传递的变量 varying是shader之间传递的变量 比如 vs的输出 也就是Ps的输入
  • 简单理解css中的垂直居中和水平居中,即vertical-align和text-align属性

    前言 在很多情况下 我们要使用到内容的居中 这里的居中包括了垂直居中和水平居中 下面来浅谈一下 对于水平居中的属性text align和垂直居中属性vertical align的理解 1 text align 如果要实现水平居中 比如我们要
  • STM32菜鸟成长记录---系统滴答定时器(systick)应用

    1 systick介绍 Systick就是一个定时器而已 只是它放在了NVIC中 主要的目的是为了给操作系统提供一个硬件上的中断 号称滴答中断 滴答中断 这里来简单地解释一下 操作系统进行运转的时候 也会有 心跳 它会根据 心跳 的节拍来工
  • java线程间如何通信

    Java线程之间可以通过以下方式进行通信 使用 wait 和 notify 方法 这需要使用同步代码块或同步方法 在同步代码块或同步方法中 线程可以调用 wait 方法阻塞 并在其他线程调用 notify 方法后恢复执行 使用 CountD
  • Altium Designer之图片logo导入笔记

    图片logo导入分为两种 丝印类型 露铜 1 在PCB页面 文件 运行脚本 弹出运行条目对话框 浏览 选择 PRJSCR文件 点击运行脚本 确定 弹出对话框 图1 1 选择导入文件 图1 2 导入对话框 2 点击加载 选择 bmp格式图片
  • [论文解读]Attention is all you need

    论文地址 http papers nips cc paper 7181 attention is all you need pdf 发表会议 NIPS2017 文章目录 动机 背景 思考 细节 网络结构 总结 参考 最早提出self att