zoukankan      html  css  js  c++  java
  • External Attention:外部注意力机制

    External Attention:外部注意力机制

    作者: elfin



    ​ 最近Transformer在CV领域的研究非常热,如ViT、BoTNet、External Attention等。使用Transformer的传统印象就是慢,这种慢还往往是我们不能接受的推理速度。在最近的实验中,基于单张2080TI,使用ResNet-34实现了batch_size为(288),图片大小为(32 imes200),每个epoch的训练用时大约为:5个小时;同样的实验环境下,我实验了Swin Transformer的结构,在stage1实验卷积进行下采样(实现embedding的效果),stage2~stage4使用Swin block,block的数量分别为[2, 8, 2],stage5使用两层卷积进行简单的任务适配。这个结构在训练时,batch_size设置到(42),图片大小修改为(32 imes240),每个epoch的训练用时大约为17个小时。Swin Transformer原作者声称其比卷积网络性能好,速度快,经过实验,实际上CNN的推理速度要比Transformer快,性价比方面Transformer确实是更高一些,但是其庞大的参数量也导致模型不太好训练。经过实验对比,在我的数据集上,Swin Transformer提升了将近7个百分点(epoch较少)。

    ​ 虽然自注意力有那么多优点,但是这推理速度慢,耗资源的特点让我们这些缺硬件的渣渣很难受,然后就在前几天,突然看见清华、谷歌等大佬团队在做(Transformer ightarrow MLP)的操作,当然这里不是指简单返祖现象,以清华的工作为例,它将二次复杂度降到线性复杂度,这个特性有成功吸引到我,所以,下面是清华的External Attention的相关情况。


    Top  ---  Bottom

    1、External Attention

    1.1 自注意力机制

    首先回顾 self-attention机制,常见的自注意力如图所示:

    对于给定的输入特征图(Fin mathbb{R}^{N imes d}),其中(N)是像素个数,(d)是特征维度;自注意力产生了查询矩阵(Qin mathbb{R}^{N imes {d}'}),键矩阵(Kin mathbb{R}^{N imes {d}'}),和值矩阵(Vin mathbb{R}^{N imes d})。则自注意力机制的计算公式为:

    [egin{align} A = left ( alpha _{i,j} ight ) &= softmaxleft ( QK^{T} ight )\ F_{out} &= AV end{align} ]

    简化版的注意力机制如下:

    它的计算公式为:

    [egin{align} A &= softmaxleft (FF^{T} ight )\ F_{out} &= AF end{align} ]

    基于上面的公式不难发现,注意力特征图是计算像素级的相似度,输出是输入的精确特征表示。

    即使公式(3)(4)简化了,但是其计算复杂度仍然是(Oleft ( dN^{2} ight ))。我们注意到随着特征图的增大,计算量的增大往往是我们无法接受的。以我上面的实验为例:

    • (32 imes200)的计算量为:(192 imesleft ( 32 imes200 ight )^{2}=7864320000)
    • (32 imes240)的计算量为:(192 imesleft ( 32 imes240 ight )^{2}=11324620800)

    大约增加了(40\%)的计算量,这还只是一层,当然上面的计算方式有待商榷,但这也说明了计算量的增长是非常迅猛的,而且在高级语义特征图中,通道数会更大,一定程度上几乎会导致在所有层级上计算量都有很大的提升。当然这个增长是呈现指数倍率增长,所以我们需要提升精度的同时,提升速度、优化资源占用。


    Top  ---  Bottom

    1.2 外部注意力机制

    经过实验得知:自注意力机制是一个(N-to-N)的注意力矩阵,可视化像素之间的关系,可以发现这种相关性是比较稀疏的,即很多是冗余信息。因此清华团队提出了一个外部注意力模块。

    它的注意力计算是在输入像素与一个外部记忆单元(Min mathbb{R}^{S imes d})之间:

    [egin{align} A &= Normleft (FM^{T} ight )\ F_{out} &= AM end{align} ]

    注意与自注意力机制不同,上式(5)是第(i)个像素点与(M)(j)行的相似度。这里(M)是一个输入Input的可学习相关性参数,作为训练数据集的全局记忆。(A)是从先验信息得来的注意力特征图,Norm操作和自注意力一样。最终,通过(A)来更新(M)

    另外,我们用两种不同的记忆单元:(M_{k})(M_{v})来增加网络的建模能力。

    最终外部注意力机制的计算公式为:

    [egin{align} A &= Normleft (FM^{T}_{k} ight )\ F_{out} &= AM_{v} end{align} ]

    经过上面的公式,外部注意力机制的复杂度(O(dSN))。这里的(d)(S)是一个超参数,经过实验,作者发现(S)设置为64效果挺好。因此外部注意力机制比自注意力机制更高效,并且它可以直接应用于大尺寸的输入。


    Top  ---  Bottom

    2、思考

    1. 计算量的降低和特征图的大小关系很大,这里的外部注意力机制的(S)设置为64,那么特征图的像素个数低于64时,实际它的计算量就更大。
    2. Swin Transformer是基于窗口进行自注意力计算的,window size作者使用的是7,像素个数(N=49),这也小于(64),所以同等情况下,外部注意力会有更大的计算量。

    Top  ---  Bottom

    完!

    清澈的爱,只为中国
  • 相关阅读:
    什么时候用GET?什么时候用POST?
    Oracle存储过程in、out、in out 模式参数
    oracle的spool功能
    xshell-常用命令
    js Date()日期函数浏览器兼容问题解决方法
    spring-quartz
    spring-quartz普通任务与可传参任务
    MySQL服务安装和可视化工具安装
    PL/SQL Developer 查询的数据有乱码或者where 字段名=字段值 查不出来数据
    Windows下安装Redis服务
  • 原文地址:https://www.cnblogs.com/dan-baishucaizi/p/14760500.html
Copyright © 2011-2022 走看看