CV算法之transform中self-attention理解

目前基于transform的很多算法在目前CV领域分类、检测、分割等经典任务中都取得了sota效果,自己其实也尝试了各种基于transform的分类分割算法,但是做算法就是这样,用很容易,真正说理解透彻,就很困难了。

这篇文章就不去具体分析某个算法,而是侧重于transform的核心:
self-attention,自注意力机制到底是什么,怎么计算的。在CV算法当中怎么去更好地理解它。

相信所有尝试了解self-attention的同学们都看到过这个公式:
自注意力机制计算其实就很简单。一个输入矩阵X,学习三个Q、K、V矩阵
计算时根据下列公式计算结果
CV算法之transform中self-attention理解_第1张图片

那么,首先一步一步来:

这个看图做:

CV算法之transform中self-attention理解_第2张图片

第一个:
CV算法之transform中self-attention理解_第3张图片
这个公式本质其实就是输入矩阵和输入矩阵的转置矩阵相乘,中间的QK矩阵是学出来的一组参数,物理意义其实就是计算图像中各个像素点和其他像素的相关性。

第二步:

由于随着QK的维度DK的增加,值也会越来越大,所以下一步需要除以QK的维度DK

第三步:

softmax本质,其实就是归一化,这样计算出来,就是所谓的权重矩阵,

第四步:

与V矩阵相乘,其实就是加权求和得到最终结果,这里V也是学出来的一组参数,QKV输入都是一个输入x。

CV算法之transform中self-attention理解_第4张图片
Multi-Head Attention 包含多个 Self-Attention 层,首先将输入 分别传递到 多个不同的 Self-Attention 中,计算得到 多个输出结果。得到多个输出矩阵之后,Multi-Head Attention 将它们拼接在一起 (Concat),然后传入一个Linear层,得到 Multi-Head Attention 最终的输出 。可以看到 Multi-Head Attention 输出的矩阵 与其输入的矩阵 的维度是一样的。google提出来的多头attention的不同之处在于进行了h次计算而不仅仅算一次,论文中说到这样的好处是可以允许模型在不同的表示子空间里学习到相关的信息。

位置编码:

以上是multi-head self-attention的原理,但是还有一个问题是:现在的self-attention中没有位置的信息,对于NLP来说每个单词的位置影响很大,例如A打了B就和B打了A语义完全不一样

解决的办法:
具体的做法是:给每一个位置规定一个表示位置信息的向量 ,让加在一起之后作为新的向量参与后面的运算过程,但是这个向量是由人工设定的,而不是神经网络学习出来的(ViT通过实验证明了通过2D卷积直接学位置也能达到类似的效果)

你可能感兴趣的:(算法,计算机视觉,深度学习)