前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >【论文阅读】Attention is all you need

【论文阅读】Attention is all you need

作者头像
EmoryHuang
发布于 2022-10-31 08:43:57
发布于 2022-10-31 08:43:57
51300
代码可运行
举报
文章被收录于专栏:EmoryHuang's BlogEmoryHuang's Blog
运行总次数:0
代码可运行

【论文阅读】Attention is all you need

Metadata

authors:: Ashish Vaswani, Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N Gomez, Łukasz Kaiser, Illia Polosukhin

container:: Advances in neural information processing systems

year:: 2017

DOI::

rating:: ⭐⭐⭐⭐⭐

share:: false

comment:: 经典不解释


前言

Transformer 是谷歌在 2017 年底发表的论文 Attention Is All You Need 中所提出的 seq2seq 模型,Transformer 的提出也给 NLP 领域带来了极大震动。现如今,不少模型还是以 Transformer 作为特征抽取机制 ,比如 BERT 就是从 Transformer 中衍生出来的预训练语言模型。

Overview

Transformer 完全抛弃了传统的 CNN 和 RNN,整个网络结构完全是由 Attention 机制组成。作者认为 RNN 的固有的按照顺序进行计算的特点,限制了并行计算能力,即 RNN 只能是从左向右或是从右向左依次进行计算

Transformer 和 RNN 的最大区别,就是 RNN 是迭代的、串行的,必须要等当前字处理完,才可以处理下一个字。而 Transformer 模型的训练是并行的,大大增加了计算的效率。

另一方面,作者在编码词向量时引入了 Position coding,即在词向量中加入了单词的位置信息,用来更好地理解语言的顺序。

Transformer 由 Encoder 和 Decoder 两个部分组成,其中 Encoder 负责将输入(自然语言序列)变换为隐藏层特征,Decoder 负责将隐藏层特征还原为自然语言序列。

机器翻译为例,如下图所示,通过将待翻译文本按顺序进行 Encoder 和 Decoder 之后,最终得到翻译文本:

Transformer Encoder

在对模型的结构有了大概了解之后,我们再仔细看看模型的具体的内部特征。

Model Architecture

按照上面的模型架构图我们可以把模型分为两部分,左半边为 Encoder,右半边为 Decoder。需要注意的是,并不是仅仅通过一层的 Encoder 和 Decoder 就得到输出,而是要分别经过N层,在论文中这个数字是

Encoder:Encoder 由

个完全相同的层堆叠而成。每一层都有两个子层,从下到上依次是:Multi-Head AttentionFeed Forward,对每个子层再进行残差连接和标准化。

Decoder:Decoder 同样由

个完全相同的层堆叠而成。每一层都有三个子层,从下到上依次是:Masked Multi-Head Self-AttentionMulti-Head AttentionFeed Forward,同样的对每个子层再进行残差连接和标准化。

接下来我们按照模型结构的顺序逐个进行说明。

Position Encoding

就像之前提到的,Transformer 中抛弃了传统的 CNN 和 RNN,并没有类似迭代的操作,这就意味着 Transformer 本身不具备捕捉顺序序列的能力。为了解决这个问题,论文中在编码词向量时引入了位置编码,即Positional Encoding(PE),将字符的绝对或者相对位置信息注入。

如下图所示,论文在经过 Embedding 之后,又将其与 Position Encoding 直接相加注意:不是拼接而是简单的对应位置直接相加

Positional Encoding 可以通过训练得到,也可以使用某种公式计算得到。论文中使用了 sincos 函数的线性变换来提供给模型位置信息:

其中

表示一句话中单词的位置,

是词向量维度序号,

是词向量维度。

关于 Positional Encoding 的一些问题

在论文中,使用 sincos 函数的线性变换来提供位置信息,但具体为什么这么设计直接看公式还是有些难理解的。

如果让我们来设计一个简单的 Positional Encoding,一个最简单直观的方法就是

,对每个词的位置进行线性的分配,但实际上这个方法并不可行。举个例子,某句话的长度为 10,另一句话的长度为 100,对编码位置作差,对于同样的差值,包含的意义确实完全不同的,即在两句话中间隔的字符数量明显不相同。

简而言之,理想的编码需要满足一下条件:

  • 对于每个位置的词语,它都能提供一个独一无二的编码
  • 词语之间的间隔对于不同长度的句子来说,含义应该是一致的
  • 它的值应该是有界的

我们将公式转换一下形式:

其中

具体来说,一个词的 Positional Encoding 是这样表示的:

我们知道,

是不断变大的,因此

越来越小,因此频率

也越来越小,这也就意味着随着

词向量维度序号的增大,该位置的数字的变化频率是指数级下降的。

下图展示了 Positional Encoding 具体编码过程:

画图代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import numpy as np
import matplotlib.pyplot as plt

def get_angles(pos, i, d_model):
    angle_rates = 1 / np.power(10000, (2 * (i // 2)) / np.float32(d_model))
    return pos * angle_rates


def positional_encoding(position, d_model):
    angle_rads = get_angles(
        np.arange(position)[:, np.newaxis],
        np.arange(d_model)[np.newaxis, :], d_model)
    # apply sin to even indices in the array; 2i
    angle_rads[:, 0::2] = np.sin(angle_rads[:, 0::2])
    # apply cos to odd indices in the array; 2i+1
    angle_rads[:, 1::2] = np.cos(angle_rads[:, 1::2])
    pos_encoding = angle_rads[np.newaxis, ...]
    return pos_encoding

tokens, dimensions = 50, 128
pos_encoding = positional_encoding(tokens, dimensions)

plt.pcolormesh(pos_encoding[0], cmap='viridis')
plt.xlabel('Embedding Dimensions')
plt.ylabel('Token Position')
plt.colorbar()
plt.show()

Self Attention

对于输入句子,我们首先进行 Word Embedding,之后又经过 Positional Encoding 之后,最后我们得到了带有位置信息的词向量,记为

之后就是最关键的 Self Attention 部分,Attention 的核心内容是为输入句子的每个单词学习一个权重,你甚至可以简单的理解为加权求和

具体来说,我们需要为每个词向量

准备三个向量

。将所有词向量的

拼接起来,我们就可以得到一个大矩阵,分别记为查询矩阵

键矩阵

值矩阵

(在模型训练时,这三个矩阵都是需要学习的参数)。

之后根据

计算:

关于这个公式的详细解读你可以参考我的另一篇文章 Self Attention 详解

计算 Attention 的一个例子

(以下图片来自 mathor

每个词向量xtx_txt​,假设我们已经有了

​和查询矩阵

键矩阵

值矩阵

,现在我们来计算具体的输出:

首先是第一步,为了获得第一个字的注意力权重,我们需要用第一个字的查询向量

​ 乘以键矩阵 K

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
            [0, 4, 2]
[1, 0, 2] x [1, 4, 3] = [2, 4, 4]
            [1, 0, 1]

之后还需要将得到的值经过 softmax,使得它们的和为 1

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
softmax([2, 4, 4]) = [0.0, 0.5, 0.5]

有了权重之后,将权重其分别乘以对应字的值向量

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
0.0 * [1, 2, 3] = [0.0, 0.0, 0.0]
0.5 * [2, 8, 0] = [1.0, 4.0, 0.0]
0.5 * [2, 6, 3] = [1.0, 3.0, 1.5]

最后将这些权重化后的值向量求和,得到第一个字的输出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  [0.0, 0.0, 0.0]
+ [1.0, 4.0, 0.0]
+ [1.0, 3.0, 1.5]
-----------------
= [2.0, 7.0, 1.5]

对其它的输入向量也执行相同的操作,即可得到通过 self-attention 后的所有输出

在上面的例子中,你只需要把向量变成矩阵的形式,就可以一次性得到所有输出,这也正是 Attention 公式所包含的具体意义:

Multi-Head Attention

同时,论文又进一步提出了 Multi-Head Attention 的概念。简而言之,就是hhh个 Self Attention 的集成。在 Self Attention 中,我们通过定义一组

来对上下文进行学习,而 Multi-Head Attention 就是通过定于多组

,分别对不同位置的上下文进行学习:

Add & Norm

在 Add & Norm 层中,分为两部分:残差连接标准化。下图展示了具体的细节:

残差连接

残差连接将输出表述为输入和输入的一个非线性变换的线性叠加,通常用于解决多层网络训练的问题:

具体来说在 Transformer 中则是:

标准化

Norm指 Layer Normalization,将隐藏层归一为标准正态分布,以加速收敛。

Feed Forward

Feed Forward 层比较简单,是一个两层的全连接网络,第一层的激活函数是 ReLU,第二层无激活函数:

Transformer Encoder 整体结构

经过上面各个部分的解读,我们基本了解了 Encoder 的主要构成部分,现在简单做个小结:

  1. 生成词向量并进行位置编码

  1. 自注意力机制
  1. 残差连接与标准化
  1. Feed Forward
  1. 残差连接与标准化

  1. 将输出送入 Decoder

Transformer Decoder

Transformer 的 Decoder block 结构,与 Encoder block 相似,但还是存在一些区别:

  • 包含两个 Multi-Head Attention 层。
    • 第一个 Multi-Head Attention 层采用了 Masked 操作。
    • 第二个 Multi-Head Attention 层的

使用 Encoder 的输出,

使用上一个 Decoder block 的输出计算。

  • 最后使用 softmax 计算下一个词的概率。

Masked Multi-Head Attention

Masked Multi-Head Attention 这里的 Masked 简而言之就是对数据进行遮挡,那么为什么要进行这个操作呢?

在进行 decoder 时,模型的输入是包含全部单词的所有信息的,但是对于翻译任务而言,它的流程是顺序进行的,即处理完第

个单词之后,才可以处理第

个单词,这也就意味着在处理第iii个单词的时候,模型是不应该知道第

个单词之后的信息的,否则就是信息泄露了。因此,这里进行 Mask 的作用就是对这部分信息进行遮挡。

Decoder Multi-Head Attention

第二个 Multi-Head Attention 层的结构与前面讲的基本相同,唯一的不同就是

使用 Encoder 的输出,

使用上一个 Decoder block 的输出计算,后续的计算方法与之前描述的一致。

softmax

最后的最后,就是进行 softmax,输出概率最高的单词。

PyTorch 实现

EmoryHuang/nlp-tutorial

总结

整体来说,Transformer 的结构还是非常巧妙的,完全抛弃了 CNN 和 RNN,仅仅使用 Self-Attention 进行特征提取,并且还做到了更好的效果。更可贵的是,各种基于 Transformer 架构的模型仍层出不穷,在各个领域均得到了用武之地。

参考资料

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-06-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Transformer的基本原理
Seq2Seq[1]框架最初是在神经机器翻译(Neural Machine Translation,NMT)领域中提出,用于将一种语言(sequence)翻译成另一种语言(sequence)。其结构如下图所示:
felixzhao
2022/09/26
1.2K0
解析Transformer模型
Google于2017年提出了《Attention is all you need》,抛弃了传统的RNN结构,「设计了一种Attention机制,通过堆叠Encoder-Decoder结构」,得到了一个Transformer模型,在机器翻译任务中「取得了BLEU值的新高」。在后续很多模型也基于Transformer进行改进,也得到了很多表现不错的NLP模型,前段时间,相关工作也引申到了CV中的目标检测,可参考FAIR的DETR模型
BBuf
2020/10/10
1K0
深入理解Transformer及其源码解读
深度学习广泛应用于各个领域。基于transformer的预训练模型(gpt/bertd等)基本已统治NLP深度学习领域,可见transformer的重要性。本文结合《Attention is all you need》与Harvard的代码《Annotated Transformer》深入理解transformer模型。 Harvard的代码在python3.6 torch 1.0.1 上跑不通,本文做了很多修改。修改后的代码地址:Transformer。
用户1432189
2019/10/24
2.3K0
深入理解Transformer及其源码解读
音视频开发之旅(89) - Transformer论文解读和源码解析
Transformer是续MLP RNN CNN后又一个影响深远的模型,  之前CNN RNN基本上都在各自的领域发光发热,  但是Transformer 在很多领域都有着很广泛的应用. eg: chatgpt  llama等语言大模型, sd文生图模型, 以及多模态 llava等. 我们最近探索的视频&图像画质评测以及画质增强很多算法也都是基于Transformer. 所以加强对Transformer学习理解和应用迫在眉睫.
音视频开发之旅
2024/09/07
1230
音视频开发之旅(89) - Transformer论文解读和源码解析
Transformer (Attention is all you need) 详解
在之前的博客中有简单讲到Transformer,这篇博客将会专门详细的一起看看内部的计算与实现。
大鹅
2021/08/26
2.6K1
搞懂 Vision Transformer 原理和代码,看这篇技术综述就够了
本文对Vision Transformer的原理和代码进行了非常全面详细的解读,一切从Self-attention开始、Transformer的实现和代码以及Transformer+Detection:引入视觉领域的首创DETR。
AI算法与图像处理
2021/01/20
7.9K0
搞懂 Vision Transformer 原理和代码,看这篇技术综述就够了
从Seq2seq到Attention模型到Self Attention(二)
系列一介绍了Seq2seq和 Attention model。这篇文章将重点摆在Google於2017年发表论文“Attention is all you need”中提出的 “”The transformer模型。”The transformer”模型中主要的概念有2项:1. Self attention 2. Multi-head,此外,模型更解决了传统attention model中无法平行化的缺点,并带来优异的成效。
量化投资与机器学习微信公众号
2018/10/25
2.4K0
从Seq2seq到Attention模型到Self Attention(二)
保姆级教程:硬核图解Transformer | 留言送书
再比如 OpenAI 的 DALL·E,可以魔法一般地按照自然语言文字描述直接生成对应图片!
磐创AI
2021/01/27
1.1K0
保姆级教程:硬核图解Transformer | 留言送书
Transformer+self-attention超详解(亦个人心得)
链接|https://zhuanlan.zhihu.com/p/432814387
zenRRan
2021/12/09
6K2
Transformer+self-attention超详解(亦个人心得)
无所不能的Embedding6 - 跨入Transformer时代~模型详解&代码实现
上一章我们聊了聊quick-thought通过干掉decoder加快训练, CNN—LSTM用CNN作为Encoder并行计算来提速等方法,这一章看看抛开CNN和RNN,transformer是如何只基于attention对不定长的序列信息进行提取的。虽然Attention is All you need论文本身是针对NMT翻译任务的,但transformer作为后续USE/Bert的重要组件,放在embedding里也没啥问题。以下基于WMT英翻中的任务实现了transfromer,完整的模型代码详见DSXiangLi-Embedding-transformer
风雨中的小七
2021/03/03
9290
无所不能的Embedding6 - 跨入Transformer时代~模型详解&代码实现
图解什么是 Transformer
Transformer 是 Google 团队在 17 年 6 月提出的 NLP 经典之作, 由 Ashish Vaswani 等人在 2017 年发表的论文 Attention Is All You Need 中提出。
杨熹
2019/02/20
2.1K1
图解什么是 Transformer
Transformer图解以及相关的概念解析
transformer是目前NLP甚至是整个深度学习领域不能不提到的框架,同时大部分LLM也是使用其进行训练生成模型,所以transformer几乎是目前每一个机器人开发者或者人工智能开发者不能越过的一个框架。接下来本文将从顶层往下去一步步掀开transformer的面纱。
芯动大师
2024/09/09
1250
Transformer图解以及相关的概念解析
【留言送书】跟我一起从源码学习Transformer!
近几年NLP领域有了突飞猛进的发展,预训练模型功不可没。当前利用预训练模型(pretrain models)在下游任务中进行fine-tune,已经成为了大部分NLP任务的固定范式。Transformer摒弃了RNN的序列结构,完全采用attention和全连接,严格来说不属于预训练模型。但它却是当前几乎所有pretrain models的基本结构,为pretrain models打下了坚实的基础,并逐步发展出了transformer-XL,reformer等优化架构。本文结合论文和源码,对transformer基本结构,进行详细分析。
lujohn3li
2021/01/12
6000
深度学习基础 | 超详细逐步图解 Transformer
读完先修知识中的文章之后,你会发现:RNN由于其顺序结构训练速度常常受到限制,既然Attention模型本身可以看到全局的信息, 那么一个自然的疑问是我们能不能去掉RNN结构,仅仅依赖于Attention模型,这样我们可以使训练并行化,同时拥有全局信息?
NewBeeNLP
2021/11/04
1.8K0
【调研】详解Transformer结构——Attention Is All You Need
        Transformer是一个完全依赖自注意力的面向sequence to sequence任务的NLP模型,由谷歌大脑在17年的论文《Attention is all you need》中首次提出。它抛弃了传统的CNN和RNN神经网络,整个网络结构完全由Attention机制以及前馈神经网络组成,它解决了RNN长期依赖和无法并行化以及CNN缺失全局特征等问题。(尽管LSTM等门机制的结构一定程度上缓解了长期依赖的问题,但是对于特别长期的依赖现象,LSTM依旧无能为力。)
小锋学长生活大爆炸
2022/10/28
1.3K0
10分钟带你深入理解Transformer原理及实现
基于 Transformer《Attention Is All You Need》构建的模型(比如 Bert ),在多个自然语言处理任务上都取得了革命性的效果,目前已取代 RNN 成为默认选项,可见 Transformer 的厉害之处。
小白学视觉
2021/08/05
2.3K0
10分钟带你深入理解Transformer原理及实现
【Pre-Training】Transformer:Attention Is All You Need
今天阅读的来自谷歌大脑的同学于 2017 年发表的论文《Attention Is All You Need》,目前论文被引次数高达 6100 次。
阿泽 Crz
2020/07/21
5200
Transformer各层网络结构详解!面试必备!(附代码实现)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
mantch
2019/09/29
2.6K0
Transformer各层网络结构详解!面试必备!(附代码实现)
[深度学习概念]·谷歌transformer论文解读(转)
这篇博客的主要内容是对谷歌提出的transformer 进行论文解读,包含算法复杂度的分析。对应的论文是 “Attention is all you need", 链接如下 https://arxiv.org/pdf/1706.03762.pdf 。
小宋是呢
2019/06/27
1.8K0
[深度学习概念]·谷歌transformer论文解读(转)
细讲 | Attention Is All You Need
自从Attention机制在提出之后,加入Attention的Seq2Seq模型在各个任务上都有了提升,所以现在的seq2seq模型指的都是结合rnn和attention的模型。传统的基于RNN的Seq2Seq模型难以处理长序列的句子,无法实现并行,并且面临对齐的问题。
zenRRan
2018/12/24
4.4K0
细讲 | Attention Is All You Need
推荐阅读
相关推荐
Transformer的基本原理
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文