前置知识
注意力机制
注意力机制的核心思想来源于人类在感知外部信息时所展现出的选择性注意能力。在面对复杂信息或长序列时,人类不会平均地处理所有信息,而是有选择地关注其中对当前任务更关键的部分。
深度学习中的注意力机制正是对这一现象的模拟,它使得神经网络在处理序列或结构化数据时,能够动态地调整对不同信息部分的关注程度。传统的神经网络在处理序列输入(如句子)时,往往将所有输入编码成一个固定维度的向量。这种方式在短序列上表现尚可,但在面对长序列时,容易导致关键信息的丢失。
注意力机制通过引入可学习的权重,对输入序列中的每一个元素动态赋权,使得模型可以聚焦于与当前预测任务更相关的信息,从而提升表达能力与泛化性能。
公式表达
注意力机制通常有三个向量,Q(查询),K(键),V(值),这里我们的目的就是为了计算Q和K的相似度,然后通过Softmax函数转换为概率分布。
缩放点积注意力
通常采用的是缩放点击注意力,其公式如下

常见的注意力计算方式有三种,最常见的就是上面的缩放点积注意力,还有两种分别是点积注意力和加性注意力。
点击注意力
点击注意力就是没有进行缩放的,这种虽然计算较为简单一些,但会引发一个问题就是可能会引发梯度爆炸和梯度消失的情况,比如QKT=[12,3,1],那么再经过Softmax处理后,e的12次是远超e的3次方和e的,所以概率几乎达到了100%。其公式如下

加性注意力
加性注意力并没有对两个向量进行直接相乘,而是对Q和K进行拼接,然后经过非线性激活函数(tanh)处理再乘上vT,最终进行softmax函数得到概率分布。
需要注意的是这里的v是一个可学习的向量,而非上面QKV中的V(值)。


类型
自注意力
自注意力的Q、K、V均来自同一序列,它常用于图像或句子,挖掘出像素与像素或词与词之间的关系。
示例:苹果是一种酸甜可口的水果,它受很多人喜欢。这句话经过自注意力处理后,就可以得出它是代指苹果。
交叉注意力
Q来自目标序列,K,V来自源序列,实现跨序列交互。
示例:Transfrom解码器生成输出时,一部分输入来自编码端的输出。
多头注意力
这个并不是第三种类型,它只是有多个自注意力头或者交叉注意力头,核心思想是将将Q、K、V投影到多个子空间,并行计算多组注意力,增强模型表达能力,类似于卷积中的多通道。
步骤:
1、将Q、K、V拆分为指定的n个头
2、每个头单独计算注意力,每个头中对应的Wq,Wk,Wv权重也不同
3、拼接所有头的输出,并通过线性层融合。
归一化
层归一化旨在提升训练的稳定性和模型的泛化能力,常见的有两种,一种是BatchNorm,一种是LayerNorm,接下来讲述二者区别。
假设张量的形状为 (batch_size, feature_size),其中 batch_size=32,feature_size=512。
batch_size:表示批次中的样本数量。
feature_size:表示每个样本的特征维度,即每个样本包含 512 个特征。
这里的一行就对应一个样本,一列就对应一种特种维度。
BatchNorm 基于一个批次(batch)内的所有样本,针对特征维度(列)进行归一化,即在每一列(相同特征或嵌入维度上的 batch_size 个样本)上计算均值和方差。
对第j列(特征)计算均值和方差:

LayerNorm 基于每个样本的所有特征,针对样本自身(行内所有特征)进行归一化,即在每一行(一个样本的 embed_size 个特征)上计算均值和方差

| 操作 | 处理维度 | 解释 |
|---|---|---|
| BatchNorm | 对列(特征维度)归一化 | 每个特征在所有样本中的归一化 |
| LayerNorm | 对行(样本内的特征维度)归一化 | 每个样本的所有特征一起归一化 |
如下图所示
这个是BatchNorm,它每次取一个特征,切一块(蓝色线),拉成一个向量,均值为 0 、方差为 1 的标准化。

这个是LayerNorm,它每次取一个样本,在一个样本中取所有特征(图中黄色)。

流程
该论文摒弃了传统的RNN和LSTM,独创了一种只依靠注意力实现的架构,且使得效果很好。

编码器
(1)输入编码和信息编码
首先进行输入,再进行输入时,机器是无法理解我们所输入的语言的,所以需要进行Input Embedding,将文字转换为机器识别的向量,然后进行位置编码。
这里为什么要进行位置编码呢?
这是因为在之前的RNN中,它们是从前往后进行的,是有次序的,想得到Tn的前提是有T1....Tn-1,而Transfrom则不同,它是读取全局,如果打乱顺序拆分所有句子成词,就无法找到其对应先后顺序,因此,我们对位置进行编码,以此获取对应前后关系。
这里具体使用的函数是

通过正弦函数和余弦函数处理,可以使得编码大小是都差不多的,位于0-1之间,而且满足了不同的pos之间有相对关系。
(2)多头注意力
这里一个输入被拆分为了三个,他们也就是上面讲的Q、K、V,同时可以看出,这里使用的就是自注意力。自注意力的QKV来源于Embedding和权重相乘得到,具体如下:

自注意力的具体计算方式是:一个Query会给定n个key和value对,这个query和每个key及value做内积得到n个相似度,然后使用Softmax函数就可以得到n个非负、和为1的权重值。然后把Value和权重值相乘,就得到了Attention输出。
实际中,因为数据较多,所以不会一个一个的计算,通常是使用把它们写成矩阵的形式进行计算。
Q:n*dk
K:m*dk
Q*KT:n*m
其中,dk是K的维度
编码器用的是是多头注意力,其实就是用了多个自注意力头来进行,其计算方式如下:

至于为什么要使用多头注意力,是因为与其做一个单个的注意力函数,不如使用h组不同的投影权重,将输入投影到h个不同的低维子空间,然后再做 h 次的注意力函数,把每一个函数的输出 拼接在一起,然后 再次投影,因为拼接只是将各个维度的值汇总了,但是并没有融合,再次投影就可以将各个维度的进行混合,得到最终的输出。
其中的Add&Norm是指进行残差网络以及进行归一化。
每个子层的输出可以用如下公式来进行描述:

这里为什么要使用LayerNorm而非BatchNorm,是因为Seq这个长度是不固定的,每次的句子有长有短,我们按照BatchNorm的方法,它会对长的和短的进行平均,然后算出均值和方差,而当遇到一个全局的较长的,训练时未曾见过的全新序列,训练时计算的均值和方差可能不好用。

相反来看LayerNorm归一化,他是每次只有一个样本,每次都是对每个样本自己算的均值和方差,不需要存全局的均值和方差

(3)前向反馈神经网络
接下来进行的是前馈神经网络,其实就是MLP,然后再次进行拼接和归一化。

解码器
(1)输出编码和信息编码
Decoder对输出进行编码和信息编码,同之前编码器的输入所处理的流程相同。
(2)掩码多头注意力机制
这里为什么要多掩码二字,这是因为和编码器不同,解码器的输出是一个接一个的,所以它应该看之前的,而不应该关注后面的,举个例子,我们输出Th时,我们只有Th-1的信息,Th是需要我们进行预测的,所以Th...Tn我们是不能让它提前知道的,要对其进行掩码处理。
这个掩码Mask如何实现呢,如果我们直接设置为0的话,经过Softmax后它并不是0(e的0次方是1),所以我们这里设置它为一个很大的负数即可。
(3)多头注意力和前馈网络
同之前的编码器的操作一样,不同的是这里的Q是来自解码器,K,V均来自编码器。
(4)线性层+Softmax
通过线性层转换为一维向量,最后经过Softmax输出概率分布。
常见问题
Transform相关常见问题可以看这篇文章
https://zhuanlan.zhihu.com/p/496012402?utm_medium=social&utm_oi=629375409599549440