Transformer理解:Attention Is All You Need论文阅读理解笔记

当前transformer在NLP问题处理上可谓是无比巨大,而它在21年又应用在了CV领域,并且取得很不错的成绩,我的研究方向就是CV方向,所以了解并熟悉transformer框架是必不可少的。以下是跟着一名up的视频的阅读笔记。


 关键结构:


用一个简单的例子来搞懂transformer:(以编码器为例)

输入:我爱你  ------------->  翻译 output:i love you 

 而模型只能处理数字形式的数据,不能将“我爱你”直接输入到模型之中。现在使用的方法都是‘模型词汇表’依照表格将字符转化为相应的索引,本文transformer用了一个庞大的模型词汇表拥有上万个索引,下面给出的词汇表只是一个例子并不是真正的词汇表:

 1、嵌入层Embedding

下面将数字序列[102,309,205]送入到嵌入层Embedding,这一步的目的是将索引转换为高维的数字向量(一般512维),赋予其多层的含义,能够让计算机学习到词语的深层意义。

注: 理解向量是如何表示任意的字、词、符号的含义是至关重要的!

那么现在就得到了3*512的矩阵来表示“我爱你”:

 2、位置编码Positional Encoding

由于字词出现的顺序决定了语义,比如:“我爱你”和“你爱我”是完全两种意思,但是只是交换了字的顺序,那么让计算机识别字词顺序就变得很重要了。本文提出了一种位置编码方式:(正余弦变种)

 举例说明这个公式的使用方法:

 以“我”来举例计算:


 而本文的模型只是将嵌入层位置编码简单的相加:使得新的矩阵既包含词的语义信息又包含了词的位置信息,这种方法确实让人眼前一亮。

3、多头注意力机制 Multi-Head Attention

这种设计,即将矩阵从n*512变换成8*n*64的矩阵,是多头注意力机制(Mutil-Head Attention)的核心。进行这种转换的原因有几个:(n为输入词的个数,以下都是这个表达)

1)信息分解:将512维的向量分解成8个64维的向量允许模型将注意力集中在输入的不同"方面”上。每个头可以学习到序列不同部分的不同表示,这种多角度的理解可以帮助模型更准确地捕获语义信息。
2)并行处理:多个头可以并行工作,这样可以同时处理多种信息流,增加处理的速度和效率。
3)模型复杂性:通过增加处理头的数量,我们可以在不显著增加单个注意力头复杂性的情况下,增加整个模型的复杂性和表达能力。每个头关注不同的信息,组合起来就能形成一个全面的信息视角。
4)捕获长距离依赖:在自然语言中,词与词之间可能存在跨越长距离的关系。多头注意力通过分别关注句子的不同部分,帮助模型更好地捕捉这些远距高的依赖。


总之,通过多头注意力,Transformer能够在不同层次上理解数据,每个头都提供了序列的个独特视角,最终的输出是这些视角的综合,这有助于提高模型对序列处理的精度和灵活性。


下面来介绍一下其中的Scaled Dot-Product Attention部分:

MatMul 

矩阵中的每个元素对应序列中的一个词(查询Q)与另一个词(键K)的相互作用得分。最后得到一个相互作用得分的矩阵(n*n):

Scale:(归一化)

这一步骤的主要目的是为了控制内积 (dot products) 的大小,使其不会变得过大。当我们计算获取注意力分数时,这些数值可能会变得非常大,尤其是在维度dk较大时。较大的点积值在经过softmax函数后,可能会导致梯度非常小,这会使得训练过程中的梯度传播变得困难,即所谓的梯度消失问题。通过将点积缩放除以根号下的dk,可以使得这些值的量级保持在一个较为适中的范围内,从而有助于避免梯度消失问题,使模型的训练更加稳定。

Mask(opt.)掩码

这种掩码操作是Transformef解码器设计的一个关键特性,它确保了模型能够以一种符合生成任务逻辑的方式学习和生成文本,保持了生成过程的自回归特性。

解释在按顺序输入“我”-“爱”-“你”时,当输入第一个字“我”时是没有后面的信息的,那么就要保证“我”与“爱”“你”的相互得分是一个负无穷的量,保持该有的逻辑方式。

 SoftMax(激活函数)

得到概率分布矩阵。

 V矩阵作用

Softmax函数的输出与值(V) 矩阵相乘的过程是多头注意力机制中的关键步骤,这一步骤产生了对于每个词的最终注意力加权表示。在这个过程中,每个词的表示不再仅仅是基于它自己的嵌入,而是融合了句子中其他词的信息,这种融合是通过 Softmax输出的权重来控制的。

意义: 

1. 信息整合:Softmax的输出提供了一个概率分布,表明在考虑当前词的上下文时,句子中其他词的相对重要性。将这个分布用于加权值 (V)矩阵,意味着我们在构建每个词的表示时,是根据句子中所有词的信息以及它们对当前词的相对重要性进行加权的。
2. 上下文感知的词表示:通过这种方式,每个词的最终表示都融合了整个句子的上下文信息,这使得模型能够更好地理解和处理语言中的复杂依赖关系,如同义词、多义词以及语境中的微妙差异。
3.增强语义理解:这个过程加强了模型对每个词语义的理解。比如。在“我爱你”这句话中,通过注意力机制,词"爱"的表示能够结合“我”和“你”的信息,反映出不同于孤立使用时的语义。

 Concat(多头拼接)

1)当所有头的注意力计算完成后,模型将这些头的输出拼接(Concatenate)起来,得到矩阵:3*512。
2)拼接后的矩阵接下来会通过一个线性层 (Linear layer),这个层的作用是对这些不同注意力头的信息进行融合和变换,以便更好地在模型的后续部分中使用这些信息,得到矩阵:3*512。

4、残差连接(ADD)和层归一化(Norm)

残差连接 (Add)就是简单地将多头注意力机制的输出与它的输入相加 3*512 +3*512 =3*512
1.一个3*512 是 进入multi-head attention之前的 矩阵
2.一个3*512是 进入multi-head attention之后的矩阵
这种直接相加的操作有助于解决深层网络中的梯度消失问题,使得深层网络的训练变得更加稳定和高效。
残差连接之后的下一步是层归一化。层归一化会对每一个序列在特征維度上进行归一化处理,确保数据在流经网络的各个层时保持稳定。这一步骤是通过计算输入的均值和方差,然后使用这些统计量来归一化输入,使得输出的均值接近0,方差接近1。这样做可以加快训练过程,并且提高模型的泛化能力。

5、前馈神经网络FeedForward

增加一些线性变化

FFN(2) = max(0, xW1 + b1) W2 + b2
x : 3*512  以及 W1 : 512*2048         xW1的操作是矩阵乘法 ,得到3*2048
b1是维度为2048的向量                    xW1 + b1得到:3*2048
max(0, xW1 + b1)也叫激活函数,作用是,负数都归于零
W2: 2048*512
max(0,xW1 + b1)W2 得到3*512
b2是维度为512的向量 
max(0, xW1 + b1)W2+b2 得到 3*512,最终的输出是3*512 

再以解码器为例过一遍整个流程

由于解码器需要一个起始符号来表示解码,所以会比解码器多了一个通道。具体流程如图所示。

 

最后输出层

假设我们的模型的词汇表大小为V=10000,解码器的最后一层输出维度为4*512。那么:
线性层的权重矩阵维度为512*10000
线性层的输出:4*10000
经过Softmax层后,4*10000每一行被转换为概率分布,其中每行的所有元素和大1,每个元素代表对应词汇的生成概率。

以上就完全介绍完transformer的各个模块与对应原理了,若有歧义欢迎一起讨论。

  • 48
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值