目录
2.1.3 Scaled Dot-Product Attention:
3 前馈神经网络(Feed-Forward Network (2-layer MLP)):
1 整体框架:
1.1 主要部分:
多头注意力(Multi-Head Attention);
前馈神经网络(Feed-Forward Network (2-layer MLP))。
1.2 细微部分:
残差连接( Residual connection)(对应导向黄色部分的Add):借鉴于CV领域中著名的ResNet(本质就是将输入和输出直接相加,进而缓解模型过深后所造成的梯度消失问题)
正则化(Layer normalization)(对应黄色部分的Norm):其实就是将输入的一个向量变为一个均值为0,方差为1(标准正态分布)的一个概率分布)(也是为了缓解梯度消失和梯度爆炸的问题)
2 多头注意力(Multi-Head Attention)
2.1 transformer中的自注意力机制:
在讲述多头之前,我们以单个为例,介绍一下transformer中自注意力机制的计算流程和相关改进。
2.1.1 计算流程:
我们以前在RNN中引入的注意力机制的实质其实就是一组query向量按序对一组value向量不断进行动态选择(加权平均)的过程。
而在transformer的encoder端中,它给定的是一个query向量和key-value对的集合,其中q和k的向量维度都是,而v向量的维度则是。在之前我们是用q和v的点积计算注意力分数,而在这里,我们使用q和k的点积计算注意力分数,最后还是得到一个k的列数维度的注意力分数向量,然后通过一个softmax变为一个概率分布,接着对v向量进行矩阵乘法(加权平均)。如下所示:
上面是对于一个q向量,如果我们对于多个q向量(从原来的一行变为多行,也即矩阵Q),对于其中的每一个向量q,都执行上述相同的操作,最后得到一个现隐藏状态输出。
我们可以发现,不同q的计算之间是互不干扰的,也即可以以并行的方式计算。
2.1.2 一个图示例子(方便理解):
2.1.3 Scaled Dot-Product Attention:
按照先前的计算流程(q和k做点乘),我们可以观察到一种现象,随着q和k的维度的增大,最后得到的注意力分数标量的方差也会变大,这个作用到softmax之后可以观察到概率分布会变得更加尖锐(也就是说某个位置可能非常接近1,其余位置非常接近0),这样导致的结果就是梯度会变得越来越小,不利于更新。
因此加入了一个除以的方式来解决上述问题(其实就是将规模进行一个放缩),这也是transformer中实际用到的。
2.1.4 实质:
因为前面我们讲到的Q,K,V分别用三个字母表示,但因为transformer中的attention使用的是一种自注意力机制,我们希望的是每个token能够自主地选择应该关注这句话中的哪些token并进行信息的整合,它们其实都等于文本的表示向量乘上一个变换矩阵得到的。
对于非第一层:文本的表示向量就是前面一层的输出;
对于第一层来说:文本的表示向量就是输入层的词表向量和对应位置编码的一个求和。
2.2 多头注意力机制:
在单头的基础上,为了进一步增强模型的一个表示能力,进而采取多个单头(结构相同参数不同)组成多头注意力机制,注意,每个头的计算方式一致,只是每个头需要乘上一个不同的权重矩阵,也就是对应上图的Linear位置。
然后将每个头的输出在维度层面进行一个拼接(Concat),然后经过一个线性层的整合最后就得到了多头注意力机制的输出
3 前馈神经网络(Feed-Forward Network (2-layer MLP)):
为什么要引入前馈神经网络?
在Transformer的Encoder层中,多头注意力机制用于计算每个位置与其他位置之间的关注程度,产生了一个表示序列中每个位置的向量。
这些向量被送入前馈神经网络(FFN)层,这是一个全连接神经网络。这个前馈神经网络层由两个全连接层组成,通过一个非线性激活函数连接。它的作用是对多头注意力的输出进行进一步的变换和提取特征。
具体而言,前馈神经网络层将每个位置的向量映射到一个更高维度的特征空间。这个映射后的特征向量能够更好地捕捉序列中的上下文信息和语义信息。
通过引入前馈神经网络层,Transformer能够引入更强的非线性能力,从而更好地建模序列中的复杂关系和特征。这有助于提升Transformer在自然语言处理任务中的性能。
4 encoder模块的堆叠:
在Transformer模型中,Encoder层是通过堆叠多个相同的Encoder模块来构建的(对应于图片中的N)。每个Encoder模块都包含了多头自注意力机制和前馈神经网络(FFN)层。
第一个编码器块的输入通常是输入序列的嵌入表示。后续的编码器块则接收前一层编码器块的输出作为输入。
Encoder层的堆叠是为了增加模型的表示能力和捕捉更复杂的序列关系。通过堆叠多个Encoder层,模型可以逐渐提取更高层次的特征表示,从而更好地建模序列中的语义和上下文信息。
具体来说,Encoder层的堆叠可以实现以下优势:
- 层级表示:每个Encoder层可以将前一层的输入进行进一步的变换和抽象,从而得到更丰富的特征表示。通过堆叠多个Encoder层,模型可以逐渐从低层次的特征提取到高层次的语义信息。
- 上下文信息:每个Encoder层都可以利用之前层的输出作为上下文信息,进一步提高特征的表达能力。这样,模型可以在处理当前位置时考虑到整个序列的信息,从而更准确地捕捉到序列中的依赖关系和语义关联。
- 参数共享:通过堆叠相同的Encoder模块,模型可以共享参数,减少参数量,提高模型的效率和训练速度。
总之,通过堆叠多个Encoder层,Transformer模型可以逐层地提取和组合特征信息,捕捉序列中的长距离依赖关系,并建模更复杂的语义和上下文关系。这使得Transformer模型在自然语言处理等序列任务中取得了很好的效果。