注意力提示
查询、键和值
(参照下图理解定义)
是否包含自主性提示”将注意力机制与全连接层或汇聚层区别开来。 在注意力机制的背景下,自主性提示被称为查询(query)
给定任何查询,注意力机制通过注意力汇聚(attention pooling) 将选择引导至感官输入(sensory inputs,例如中间特征表示)。
在注意力机制中,这些感官输入被称为值(value) 更通俗的解释,每个值都与一个键(key)配对, 这可以想象为感官输入的非自主提示。
如下图,可以通过设计注意力汇聚的方式, 便于给定的查询(自主性提示)与键(非自主性提示)进行匹配, 这将引导得出最匹配的值(感官输入)。或者说通过注意力汇聚将查询(自主性提示)和键(非自主性提示)结合在一起,实现对值(感官输入)的选择倾向
注意力的可视化
平均汇聚层可以被视为输入的加权平均值, 其中各输入的权重是一样的
实际上,注意力汇聚得到的是加权平均的总和值, 其中权重是在给定的查询和不同的键之间计算得出的。
下图当且仅当查询和键相同时,注意力权重为1,否则为0。
注意力汇聚:Nadaraya-Watson 核回归
查询(自主提示)和键(非自主提示)之间的交互形成了注意力汇聚
非参数注意力汇聚
注意力汇聚(attention pooling)公式:
注意力汇聚是输出\(y_i\)的加权平均。 将查询\(x\)和键\(x_i\)之间的关系建模为 注意力权重(attention weight)\(\alpha(x,x_i)\), 这个权重将被分配给每一个对应值\(y_i\)。 如果一个键\(x_i\)越是接近给定的查询x, 那么分配给这个键对应值\(y_i\)的注意力权重就会越大, 也就“获得了更多的注意力”。
对于任何查询,模型在所有键值对注意力权重都是一个有效的概率分布: 它们是非负的,并且总和为1。
1 | # 生成数据集 |
带参数注意力汇聚
带参数的模型加入可学习的参数后, 曲线在注意力权重较大的区域变得更不平滑。
在带参数的注意力汇聚模型中, 任何一个训练样本的输入都会和除自己以外的所有训练样本的“键-值”对进行计算, 从而得到其对应的预测输出。
1 | class NWKernelRegression(nn.Module): |
注意力评分函数
高斯核指数部分可以视为注意力评分函数(attention scoring function), 简称评分函数(scoring function)
然后把这个函数的输出结果输入到softmax函数中进行运算。 通过上述步骤,将得到与键对应的值的概率分布(即注意力权重)
最后,注意力汇聚的输出就是基于这些注意力权重的值的加权和。
由于注意力权重是概率分布, 因此加权和其本质上是加权平均值。
softmax操作用于输出一个概率分布作为注意力权重
Bahdanau 注意力
自注意力和位置编码
每个查询都会关注所有的键-值对并生成一个注意力输出。 由于查询、键和值来自同一组输入,因此被称为 自注意力(self-attention)
Transformer
Transformer的编码器和解码器是基于自注意力的模块叠加而成的,源(输入)序列和目标(输出)序列的嵌入(embedding)表示将加上位置编码(positional encoding),再分别输入到编码器和解码器中。
编码器
从宏观角度来看,Transformer的编码器是由多个相同的层叠加而成的,每个层都有两个子层(子层表示为sublayer)。第一个子层是多头自注意力(multi-head self-attention)汇聚;第二个子层是基于位置的前馈网络(positionwise feed-forward network)。
具体来说,在计算编码器的自注意力时,查询、键和值都来自前一个编码器层的输出
每个子层都采用了残差连接(residual connection)
在残差连接的加法计算之后,紧接着应用层规范化(layer normalization)
解码器
由多个相同的层叠加而成的,并且层中使用了残差连接和层规范化。
除了编码器中描述的两个子层之外,解码器还在这两个子层之间插入了第三个子层,称为编码器-解码器注意力(encoder-decoder attention)层
在编码器-解码器注意力中,查询来自前一个解码器层的输出,而键和值来自整个编码器的输出。在解码器自注意力中,查询、键和值都来自上一个解码器层的输出。
但是,解码器中的每个位置只能考虑该位置之前的所有位置。这种掩蔽(masked)注意力保留了自回归(auto-regressive)属性,确保预测仅依赖于已生成的输出词元。
基于位置的前馈网络
残差连接和层规范化
编码器
解码器
预训练
越浅的层学到的特征越通用(横竖撇捺),越深的层学到的特征和具体任务的关联性越强(人脸-人脸轮廓、汽车-汽车轮廓)
上述利用网络上现有图片的思想就是预训练的思想,具体做法就是:
- 通过 ImageNet 数据集我们训练出一个模型 A
- 由于上面提到 CNN 的浅层学到的特征通用性特别强,我们可以对模型 A
做出一部分改进得到模型 B(两种方法):
- 冻结:浅层参数使用模型 A 的参数,高层参数随机初始化,浅层参数一直不变,然后利用领导给出的 30 张图片训练参数
- 微调:浅层参数使用模型 A 的参数,高层参数随机初始化,然后利用领导给出的 30 张图片训练参数,但是在这里浅层参数会随着任务的训练不断发生变化
对于一个具有少量数据的任务 A,首先通过一个现有的大量数据搭建一个 CNN 模型 A,由于 CNN的浅层学到的特征通用性特别强,因此在搭建一个 CNN 模型 B,其中模型 B 的浅层参数使用模型 A 的浅层参数,模型 B 的高层参数随机初始化,然后通过冻结或微调的方式利用任务 A 的数据训练模型 B,模型 B 就是对应任务 A 的模型。
预训练的思想:任务 A 对应的模型 A 的参数不再是随机初始化的,而是通过任务 B 进行预先训练得到模型 B,然后利用模型 B 的参数对模型 A 进行初始化,再通过任务 A 的数据对模型 A 进行训练。
注:模型 B 的参数是随机初始化的。