输入阶段(家人们,大学生做笔记不易,点个免费的赞赞吧)
1.初始输入 由图可知整个Encoder部分由6个相同的模块按顺序构成,第一个子模块用于接收来自嵌入和位置编码组合后的输入。通常是将输入的原始数据(比如文本中的单词等)转化为向量和位置向量相组合
2.后续输入 从前一个 Encoder 接收相应的输入(inputs)
核心处理阶段
1.多头自注意力层处理
每个 Encoder 子模块在接收到输入后,首先会将其传递到多头自注意力层(Multi-Head Self-Attention layer) 。在这一层中,通过多头自注意力机制(如前面所述,查询、键、值都来自同一个输入序列自身)去计算输入序列不同位置之间的关联关系,生成相应的自注意力输出。
2.前馈层处理
前馈层一般是由全连接网络等构成,对自注意力层输出的特征做进一步的非线性变换,提取更复杂、高层次的特征,然后将其输出向上发送到下一个编码器(如果不是最后一个 Encoder 的话)
3.残差与归一化阶段
Add & Norm : 是指将残差连接(Addition)和归一化(Normalization)结合在一起的操作,使得输入信号能够以残差的形式参与到每一层的输出计算中。对于自注意力层,其输入会与自注意力层的输出进行相加操作。同样,前馈层的输入也会和前馈层的输出进行相加。残差连接(Residual Connection)有助于缓解深度网络训练过程中的梯度消失或梯度爆炸问题,层归一化是对每一层的神经元的输入进行归一化处理。
多头自注意力
Transform模型中,多头注意力机制允许模型在不同的子空间学习到不同的的关系,每个头部都有自己的Q、K、V 最后将所有的头的输出通过一个线形层拼接起来
Q:它代表了正在询问的信息和关心的上下文,在自注意力机制中,每个序列的元素都有一个对应的查询。它试图从其他部分找到相关信息
K:这些是可以查询的条目或者地址,自子注意力机制中,每个序列元素都有一个对应的键
V:对于每一个键都有与之相关联的一个值,它代表实际的内容
缩放点积注意力
self-attention 的输入是序列词向量,此处记为 x。而 x 经过一个线性变换得到 query(Q), x经过第二个线性变换得到 key(K), x经过第三个线性变换得到 value(V)。
也就是说,Q、K、V 都是对输入 x 的线性映射
缩放因子
缩放因子的作用
多头注意力机制(Multi-Head Attention)中确实有一个缩放因子。这个缩放因子出现在计算注意力得分(Attention Scores)的步骤中,具体来说是在计算查询(Query)与键(Key)之间的点积时。作用是避免点积值过大,从而确保数值稳定性,特别是在维度较大的情况下
多头注意力机制
-
自注意力机制(Self-Attention) 首先,注意力机制本身是通过计算查询(Query)和键(Key)之间的相似度来决定哪些信息应该被关注。在自注意力中,查询、键和值(Value)都是同一个输入序列的不同表示。
-
多头的引入 传统的单一注意力机制只能捕捉到一种关系,而多头注意力机制通过并行计算多个注意力头,每个注意力头都有独立的查询、键和值的变换。这样,每个头能够学习到输入中不同方面的信息,比如不同的特征关系。
-
步骤: 分头:将输入的查询、键和值通过不同的线性变换映射成多个不同的子空间。 并行计算:对于每个注意力头,计算查询和键的点积,得到注意力分数,再通过Softmax得到权重,然后计算加权的值。 合并:最后,将所有头的输出拼接在一起,经过一个线性变换得到最终的输出。
子注意力机制
(1)嵌入
首先,模型将输入序列中的每个单词嵌入到一个高维向量表示中。这个嵌入过程允许模型捕捉单词之间的语义相似性。
(2)查询、键和值向量
接下来,模型为序列中的每个单词计算三个向量:查询向量、键向量和值向量。在训练过程中,模型学习这些向量,每个向量都有不同的作用。查询向量表示单词的查询,即模型在序列中寻找的内容。键向量表示单词的键,即序列中其他单词应该注意的内容。值向量表示单词的值,即单词对输出所贡献的信息。
(3)注意力分数
一旦模型计算了每个单词的查询、键和值向量,它就会为序列中的每一对单词计算注意力分数。这通常通过取查询向量和键向量的点积来实现,以评估单词之间的相似性。
(4)SoftMax 归一化
然后,使用 softmax 函数对注意力分数进行归一化,以获得注意力权重。这些权重表示每个单词应该关注序列中其他单词的程度。注意力权重较高的单词被认为对正在执行的任务更为关键。
(5)加权求和
最后,使用注意力权重计算值向量的加权和。这产生了每个序列中单词的自注意力机制输出,捕获了来自其他单词的上下文信息。
残差连接
残差连接是一种常见的深度学习技巧,它通过将子层的输出添加到其输入上来实现。这样可以形成一个短路,允许梯度直接流过网络层,有助于缓解深层网络中的梯度消失问题。
残差连接后:y = f(x) + x
这里,x 是输入,f(x) 是通过变换得到的输出,y 是最终输出。通过这种方式,模型能够保留原始输入的信息,使得网络在训练时更容易优化。
归一化
几乎每个子层都会经过一个归一化操作,然后再将其加在原来的输入上,这个过程被称为残余连接(Residual Connection)
前馈全连接网络
前馈全连接网络(FFN )层实际上就是一个线性变换层,用来完成输入数据到输出数据的维度变换。FFN层是一个顺序结构:包括一个全连接层(FC) + ReLU 激活层 + 第二个全连接层(FC) ,通过在两个 FC 中间添加非线性变换,增加模型的表达能力,使模型能够捕捉到复杂的特征和模式。