watch: Transf - Nick 09 | Attention Mechanism

注意力核心作用:特征融合。在输入的序列内做特征融合。

bilibili

cnblog

从海量数据中找出重要的部分,设计一种运算让机器自动甄别数据,对于深度学习领域,为模型添加一个模块,只关心输入输出即可

如何在深度学习模型上做注意力?

一张图片的信息分布是不均匀的,人类会给蕴含更多、更重要信息的区域更多的注意力。

参与“注意力”的两个主体:人脑(query),图片(value=key),人脑知道哪些地方重要,它会着重看图片中的那些地方,所以应该给那些区域更高的权重,也就是计算人脑中的“重要度分布”模版与图片的相似度。

query 与 key (=value) 可以做点乘,计算余弦相似度。 一个 query 与 keys 的各个部分做内积得到多个标量,就是各个部分与 query 的相似度,即注意力分数

对这些分数做一次 softmax(),得到各个key 与 query的相似度的概率分布,就是各个部分的权重,有些部分权重趋于0,则它们被舍弃了,只把重点提取出来,把各个部分加权求和,就得到"被注意过后"的图片了,比原始图片多了每部分的重要度。对这个新图片再做卷积,重要的部分会被保留下来。

(如果一张图片以像素级别做注意力,计算量太大,所以可以先用卷积提取一下特征,把尺寸降下来,如果卷积太多次了,与原始图片差异太大了,可以用跳连接补充原始信息)

一般 keys = values,也可以不相等,但二者之间必有某种联系,这样才能依据 query 与 keys 的相似度找出 values 中重要的和不重要的部分。

每一个 query 都与 keys 点积,则会产生 num_query x num_key 的注意力分数矩阵

内积得到各个 key 的注意力分数之后,除以根号下方差dk (标准差),做一个缩放是为了平滑各分数间的差距,如果差额太大,做了e指数,高分数概率会很大,而低分数的概率会很低,然后乘以 value 就是变成很小的值,导致在反向传播时,这些小数值没有足够的梯度(梯度消失),更新不了它对应的权重。或者说如果不除以标准差,各key注意力分数的分布的方差可能很大,大的很大,小的很小,做了softmax后,小数更小。所以除以标准差,让方差为1,削弱差距。(为什么不让方差再小呢?)