Attention is all you need阅读笔记

Attention is all you need阅读笔记

Abstract摘要

Sequence transduction: 序列转录,序列到序列的生成。input一个序列,output一个序列。

​ 例如:机器翻译:输入一句中文,输出一句英文。

序列转录模型是包括一个encoder和一个decoder的RNN或CNN架构,在效果好的序列转录模型的编码器和解码器之间使用了attention机制。论文就是基于Attention机制提出的一个简单的架构,成为Transformer。

Conclusion结论

Transformer模型仅仅使用注意力、做序列转录的模型,把之前在 encoder - decoder 的结构换成了 multi-headed self-attention(多头注意力机制).

Introduction

2017年的时候最常用的时序模型是RNN、LSTM、GRU。有两个主流模型:语言模型,编码器-解码器架构(当输出的结构化信息较多的时)。

讲述了RNN的特点:RNN是从左往右一步步计算,在第t个词时会有一个隐藏状态ht,ht是由h(t-1)和当前词t计算得出的。但由于这是一个时序计算的过程,就难以并行;因为历史信息是一步一步传下去的,所以早期的信息可能会被丢弃。

attention 在 RNN 上的应用: attention用在怎么把 encoder 的信息有效的传给 decoder。

Background

提出了卷积神经网络类型的模型难以对长时序难以建模,由于卷积神经网络每次用了一个小窗口进行卷积,有时候2个像素隔着比较远的时候,就需要用很多层卷积层叠起来才能看到。

但是使用Transformer 的 attention mechanism 每一次看到所有的像素(因为是所有的像素加权求和起来的),一层能够看到整个序列。

卷积可以做多个输出通道一个输出通道可以识别不一样的模式,所以提出了一个multi-head self-attention来模拟CNN的多通道输出效果。

Model Architecture模型架构

在sequence transduction models 比较好的结构是 encoder-decoder架构:

  • encoder 将 (x1, x2, … , xn)(原始输入) 映射成 (z1, z2, …, zn)(机器学习可以理解的向量)
    例如一个句子有 n 个词,xt 是第 t 个词,zt 是第 t 个词的向量表示。
    一次性很可能看全整个句子。例如
    翻译的时候,看到整句英语:Hello World

  • decoder 拿到 encoder 的输出,会生成一个长为 m 的序列(y1, y2, … , ym) n 和 m 可以一样长、可以不一样长。
    例如中英互译:Hello World 你好世界。
    decoder 在解码的时候,只能一个一个的生成。 auto-regressive(自回归),输入又是你的输出。

    ​ 例如给定一个初始 z 向量 (z1, …, zn) 生成 y1,在得到 y1 之后可以生成 y2。在生成 yt 的时候,要把之前的 y1 到 yt-1 都拿到。在翻译的时候,一个词一个词往外蹦。过去时刻的输出会作为你当前时刻的输入,自回归 auto-regressive。

img

上图展示了Transfomer的encode-decode架构的stacked self-attention and position-wise fully-connected layers。

左侧是编码器,右侧是解码器。

image-20230315155656165

这个在transformer中被称为layer

LayerNorm

用LayerNorm和BatchNorm做对比来说说明LayerNorm是什么:

以BatchNorm简单的2维情况,一行是一个x(一个batch),一列是一个feature

image-20230315155721371

BatchNorm:每次把一列(1 个 feature)放在一个 mini-batch 里,均值变成 0,方差变成1的标准化。做法:(该列向量 - (mini-batch) 该列向量的均值)/((mini-batch) 该列向量的方差)

训练时:计算mini-batch列向量均值;

测试时:使用全局列向量的均值、方差。

BatchNorm 还会学 lambdabeta,BatchNorm 可以通过学习将向量 放缩成 任意均值、任意方差 的一个向量。

对于三维数据来说列seq序列长度 n;第 3 维 feature 是每个词额外的向量,d = 512 in transformer

image-20230315155752715

竖着切(对所有数据的每一个词)

每次取一个特征,切一块(蓝色线),拉成一个向量,均值为 0 、方差为 1 的标准化。

image-20230315155817266

BatchNorm 切出来的结果

image-20230315155829540

BatchNorm 计算均值和方差,有效的是阴影部分,其余是0。

image-20230315155838297

Mini-batch 的均值和方差:如果样本长度变化比较大的时候,每次计算小批量的均值和方差,均值和方差的抖动大。

全局的均值和方差:测试时遇到一个特别长的全新样本 (最上方蓝色阴影块),训练时未见过,训练时计算的均值和方差可能不好用。

image-20230315155856997

LayerNorm:在很多地方放是一样的,对每个样本做 Normalization(把每一行变成 均值为 0、方差为 1),不是对每个特征做标准化

image-20230315155931000

横着切(对某一批数据的所有词)

image-20230315160029859

LayerNorm 在操作上 和 BatchNorm (二维输入) 的关系

LayerNorm 整个把数据转置一次,放到BatchNorm里面出来的结果,再转置回去,基本上可以得到LayerNorm的结果

LayerNorm 为什么用的多?

答:时序数据中 样本长度可能不一样。

举例分析:4个长度不一样的样本,0 填充到 max_len

image-20230315160114504

LayerNorm 切出来的结果

image-20230315160159317

LayerNorm 每个样本自己算均值和方差,不需要存全局的均值和方差。LayerNorm 更稳定,不管样本长还是短,均值和方差是在每个样本内计算。

LayerNorm 和 BatchNorm 的例子理解:n 本书

BatchNorm:n本书,每本书的第一页拿出来,根据 n 本书的第一页的字数均值做 Norm

LayerNorm:针对某一本书,这本书的每一页拿出来,根据次数每页的字数均值,自己做 Norm

Transformer的block

Multi-Head attention ;

Add & Norm: 残差连接 + Layernorm;

Feed Forward: 前馈神经网络 MLP;

以中译英为例子:

Encoder

上图中的Nx代表着N个 Transformer 的 block 叠在一起。类似于resnet的残差块。

  • Inputs: 中文句子

    • Inputs ---- Input Embedding

      输入一个词经过Embedding(嵌入)层, 例如一个词进来之后表示成一个向量。然后得到的embedding后的向量和 Positional Encoding相加。

在多个transformer block叠加后的的输出作为decode的中间一层的输入,和decode的输入一同作用在其中一个多头注意力上

image-20230315160237512

结构

Encoder中有6个的layer;

每个 layer 有 2 个 sub-layers。

  • 第一个 sub-layer 是 multi-head self-attention
  • 第二个 sub-layer 是 simple, position-wise fully connected feed-forward network, 简称 MLP

每个 sub-layer 的输出做 残差连接(Residual Connections) 和 LayerNorm

公式:LayerNorm( x + Sublayer(x) ),Sublayer(x) 指 self-attention 或者 MLP。

由于Residual Connections 需要输入输出维度一致,如果输入的维度不一致的话就需要做投影。简单起见,固定每一层的输出维度dmodel = 512。

借鉴MLP的减少维度增加channel数的想法,可以做一个简单的设计:只需调 2 个参数 dmodel每层维度有多大和N多少层(要复制N层layer ),影响后续一系列网络的设计,BERT、GPT。

Decoder

  • Outputs(右下角): decoder在做预测的时候是没有输入的。Shifted right 指的是 decoder 在之前时刻的Outputs(右上角),作为此时的输入。一个一个往右移。
  • Transformer的decode比encode多了一个 Masked Multi-Head Attention+Add&Norm模块。

最后经过一个Linear和一个softmax输出结果,这里和标准神经网络是一样的。

结构

decoder 和 encoder 很像,6 个 相同 layer 的堆叠、每个 sub-layer 的 residual connections、layer normalization。

每个 layer 里有 2个 encoder 中的 sub-layers, 不一样的是decoder 有第 3 个 sub-layer,对 encoder 的输出做 multi-head attention。

decoder 是 auto-regressive 自回归。当前时刻的输入集 是 之前一些时刻的输出。做预测时,decoder 不能看到 之后时刻的输出。但是由于attention机制是能每一次都看到完整的输入的,为了避免这个情况,使用了一个遮码机制。

在 decoder 训练的时候,在预测第 t 个时刻的输出的时候,decoder不应该看到 t 时刻以后的输入(这是因为Attention计算的过程需要与所有的k相乘)。它的做法是通过一个带掩码 masked 的注意力机制。保证 训练和预测时 行为一致

image-20230315160258496

Attention

注意力函数是一个将一个query和一些key-value对映射成一个输出的函数,其中所有的query、key、value和output都是一些向量。

具体来说,output 是 value 的一个加权和 --> 输出的维度 == value 的维度。output 中 value 的权重 = 查询 query 和对应的 key 的相似度 or compatibility function。权重等价于 query 和对应的 key 的相似度。

在key-value没有变的情况下,随着 query 的改变,权重的分配就会不一样,导致输出会有不一样,这就是注意力机制。

Scaled Dot-Product Attention

由于不同的注意力函数产生了不同的注意力机制,transformer采用的的是Scaled Dot-Product Attention,这是一个最简单的注意力机制。query 和 key 的长度是等长的,都等于 dk。value 的维度是 dv,输出也是 dv。

因为 query 和 key 可以不等长,不等长是有别的办法算的。

注意力的具体计算是:对每一个 query 和 key 做内积,然后把它作为相似度。两个向量做内积:如果这两个向量的 norm 是一样维度的话,那么内积的值越大,它的余弦值越大,这两个向量的相似度就越高。如果你的内积的值为 0 ,这两个向量正交了,没有相似度。

image-20230315160314473使用softmax:一个 query 给 n 个 key - value pair ,这个 query 会跟每个key做内积,会产生 n 个相似度值。传入 softmax 得到 n 个非负、求和为 1 的权重值。把 softmax 得到的权重值 与 value 矩阵 V 相乘 得到 attention 输出。

实际计算:不会一个 query 一个 query 的计算,因为运算比较慢。把多个 query 写成 一个矩阵,并行化运算。

Q:n * dk

K: m * dk

Q * K T:(n * dk) * (m * dk)T = (n * m)

Scaled Dot-Product Attention 和 别的注意力机制的区别

2 种常见的注意力机制:加性的注意力机制(它可以处理你的 query 和 key 不等长的情况,点积 dot-product 的注意力机制 (本文采用 scaled,除sqrt(dk) ),所以你可以看到它的名字它叫做 scale 的。

选用 dot-product原因:两种注意力机制其实都差不多, 点乘实现 简单、高效,两次矩阵乘法计算。

scale dot-product原因除sqrt(dk) :防止softmax函数的梯度消失。dk不是很大的时候,除不除都ok。dk比较大时(2 个向量的长度比较长的时候),点积的值会比较大,or会比较小。

当值比较大的时候,相对的差距会变大,导致最大值 softmax会更加靠近于1,剩下那些值就会更加靠近于0。值就会更加向两端靠拢,算梯度的时候,梯度比较小。

image-20230315160333684

softmax会让大的数据更大,小的更小

因为 softmax 最后的结果是希望 softmax 的预测值,置信的地方尽量靠近,不置信的地方尽量靠近零,以保证收敛差不多了。这时候梯度就会变得比较小,那就会跑不动。

对于decoder中的mask部分,其实就是一个很小的数和1组成的矩阵,把QK结果乘上这个矩阵,这样就可以让t时刻之前的数据保持原样,而t时刻之后的数据就会变得非常非常小,再经过softmax后就会让t时刻后的数据变成0

Multi-head attention

与其做一个单个的注意力函数,不如说把整个 query、key、value 整个投影到 1个低维,投影 h 次。然后再做 h 次的注意力函数,把每一个函数的输出 拼接在一起,然后再投影一次,会得到最终的输出。

image-20230315160350709

输入是Value、key、query,进入一个线形层,线形层把 value、key、query 投影到比较低的维度。然后再做一个Scaled dot product。执行 h 次会得到 h 个输出,再把 h 个 输出向量全部合并 concat 在一起,最后做一次线性的投影 Linear,回到multi-head attention。

为什么要做多头注意力机制呢?一个 dot product 的注意力里面,没有什么可以学的参数。具体函数就是内积,为了识别不一样的模式,希望有不一样的计算相似度的办法。

这样就实现了类似CNN中的多个输出通道的效果。

image-20230315153926935

Multi-head 的输入还是Q,K,V,但是输出是 不同的头的输出的 concat 起来,再投影到一个低纬度 WO里面。

每一个头 headi 是把 Q,K,V 通过 可以学习的 Wq, Wk, Wv 投影到 dv 上,再通过注意力函数,得到headi

论文采用 8 个 heads。因为有残差连接的存在使得输入和输出的维度至少是一样的。投影维度 dv = dmodel / h = 512 / 8 = 64,每个 head 得到 64 维度,concat,再投影回 dmodel

Transformer是如何运动attention机制的
  • Encoder中,若句子长度是n,则encoder 的输入是一个n个长为d的向量。假设batchsize大小设成1了,每一个输入词对应的是一个长为d的向量。
    image-20230315155050581
    每一个代表一个词每个词是d维的向量

    • 有三个输入,它分别表示的是key、value 和 query
      image-20230315160441705而这里表示的意思是说,输入的结果既 key 也作为 value 也作为 query,所以叫做自注意力机制key、value 和 query 其实就是一个东西,就是自己本身。
      输入了 n 个 query,每个 query 会得到一个输出,那么会有 n 个输出。输出的是 value 加权和(权重是 query 和 key 的相似度),且输入维度 = 输出维度。

    • image-20230315161826095

      绿色线代表权重,和自己的相似度最大、权重线最粗。假设和最右侧向量 相似度比较高,权重也会高一些、绿色线会粗一些。不考虑 multi-head 和 有投影的情况:

      输出是 输入的加权和,其权重来自 每个向量与其它向量的相似度。

    • multi-head 和 有投影的情况:学习 h 个不一样的距离空间,使得输出变化。

  • decoder中, 第一个输入部分和encoder是一样的,复制成三份

    • 不一样的地方是多了一个masked部分

    • image-20230315162559603
      masked 体现在,看不到 t 时刻以后的输入,黄圈内的绿色权重为 0

    • image-20230315162713866
      这里不再是自注意力了key - value 来自 encoder 的输出,query 是来自 decoder 里 masked multi-head attention 的输出(上一时刻的编码器的输出来预测下一时刻的输出,所以作为query)**。

    • 图中红色方块:encoder 的输出 value 和 key,encoder 最后一层的输出: n 个 长为 d 的向量。

    • image-20230315165401476

      图中红色方块:encoder 的输出 value 和 key 。encoder 最后一层的输出: n 个 长为 d 的向量。

      图中绿色方块:decoder 的 masked multi-head attention + Add & Norm 的输出是 m 个 长为 d 的向量。

      图中蓝色方块:decoder 的输出,根据 query 算输出: value 的加权和 (权重 取决于 红色方块 和 绿色方块 的相似度)

      第 3 个 attention 层,根据 query 去有效的提取encoder层输出。

      • 翻译Hello World --> 你好世界
        计算 “好” 的时候,“好”作为query ,会跟 “hello” 向量更相近一点,给 “hello” 向量一个比较大的权重。
        但是 “world” 跟后面的词相关, “world” 跟 当前的query (“好” )相关度没那么高。
        在算 “好” 的时候,我会给“hello” 向量一个比较大的权重。
        在算 query “世” 的时候,会给第二个 “world” 向量,一个比较大的权重。
        根据解码器的输入的不一样,会根据当前的 query 向量,去在编码器的输出里面去挑我(当前 query)感兴趣的东西。
        attention:query 注意到 当前的 query 感兴趣的东西,对当前的 query的不感兴趣的内容,可以忽略掉。 --> attention 作用:在 encoder 和 decoder 之间传递信息。

Position-wise Feed-Forward Networks

本质上就是一个MLP,但是他令MLP对每一个词作一次,且用的是同一个MLP

image-20230315172203275

本质就是FFN = Linear ( ReLU ( Linear ) )

单隐藏层的 MLP,中间 W1 扩维到4倍 2048,最后 W2 投影回到 512 维度大小,便于残差连接。

image-20230315173607995

举个例子:

最简单情况:没有残差连接、没有 layernorm、 attention 单头、没有投影。

  • attention 对输入做一个加权和,加权和 进入 point-wise MLP。(画了多个红色方块 MLP, 是一个权重相同的 MLP),point-wise MLP 对 每个输入的点做计算,得到transformer块的输出。

Attention作用:把整个序列里面的信息抓取出来,做一次汇聚,上图中红色填充块,已经就有了序列中感兴趣的东西

历史信息,因为这个地方序列信息已经被汇聚完成,所以 MLP 是可以分开做的,也就整这个 transformer 是如何抽取序列信息,然后把这些信息加工成最后想要的语义空间向量的过程。

Embeddings and Softmax

embedding:将输入的一个词语 token 映射成 为一个长为 d 的向量。学习到的长为 d 的向量 来表示整个词语 token。

假设本文d = 512,

编码器、解码器、最后 softmax 之前的 3 个 embedding 共享权重。原因是训练更简单

Note:权重 * sqrt(dmodel = 512) ,学 embedding 的时候,会把每一个向量的 L2 Norm 学的比较小。比如学成1,不论维度多大,最后的值都会是1。

维度大的化,学到的一些权重值就会变小,但之后还需要加上 positional encoding(不会随着维度的增加而变化)。

multiply weights by sqrt(dmodel) 使得 embedding 和 positional encosing 的范围差不多,可以做加法。

Positional Encoding

由于Transformer用的是attention机制,因为attention的output 是 value 的 加权和(权重是 query 和 key 之间的距离,和 序列信息 无关),所以attention是没有时序信息的,也就是说根本看不出key - value 对在序列哪些地方,一句话把顺序任意打乱之后,attention 出来,结果都是一样的。这明显不对。

所以为了解决这个问题就引入了positional encoding(可以是输入词的序号0、1、2、3)来作为时序信息。

利用周期不一样的 sin 和 cos 函数计算位置数字信息的值,并且任何一个值可以用一个长为 512 的向量来表示。输入进来进入 embedding 层之后,那么对每个词都会拿到那个向量长为 512 的一个向量。positional encodding (这个词在句子中的位置),返回一个长为 512 的向量,表示这个位置,然后把 embeding 和 positional encodding 加起来就行了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值