Transformer Block运算量

news/2024/10/30 9:32:43/

参考:Swin Transformer论文精读【论文精读】_哔哩哔哩_bilibili

        在看朱毅老师讲解Swin Transformer论文时,里面有一个Transformer Block的计算复杂度的推导计算,感觉清晰明了,这里做一下记录,先说一下结果,一个Transformer Block中的乘法运算次数如下(不包含Layer Norm的运算量):

        备注:上述计算过程不包含Layer Nor和Softmax。

        结合朱毅老师手动推导的过程,画一下Transformer Block各个模块的输入、输出,以及计算过程的计算复杂度,如下:

        一个Transformer Block中的乘法计算主要来自于下面一些部分,假设Transformer Block的输入数据大小是[HW, C1]:

  • Query:对输入序列做一次线性变换(全连接层)得到Query序列
    1. 输入:[HW, C1]
    2. 输出:[HW, C2]
    3. 计算过程:通过一次线性变换得到Query,其实就是使用一个输入维度为C1,输出维度为C2的全连接层,做一次计算的乘法运算量是C1 * C2,总共做HW次
    4. 乘法运算次数:HW * C1 * C2

        备注:C1可以不等于C2

  • Key:对输入序列做一次线性变换(全连接层)得到Key序列
    1. 输入:[HW, C1]
    2. 输出:[HW, C2]
    3. 计算过程:同Query一样,通过一次线性变换得到Key,其实就是使用一个输入维度为C1,输出维度为C2的全连接层,做一次计算的乘法运算量是C1 * C2,总共做HW次
    4. 乘法运算次数:HW * C1 * C2

        备注:C1可以不等于C2

  • Value:对输入序列做一次线性变换(全连接层)得到Value序列
    1. 输入:[HW, C1]
    2. 输出:[HW, C1]
    3. 计算过程:同Query一样,通过一次线性变换得到Value,其实就是使用一个输入维度为C1,输出维度为C1的全连接层,做一次计算的乘法运算量是C1 * C1,总共做HW次
    4. 乘法运算次数:HW * C1 * C1
  • 计算Attention Weight:使用Query序列的每个时序数据与Key序列的每个时序数据做内积,得到大小为[HW, HW]的注意力权重矩阵
    1. 输入:Query -> [HW, C2], Key -> [HW, C2]
    2. 输出:[HW, HW]
    3. 计算过程:将Query序列中每个维度为C2的向量,分别与Key中HW个维度为C2的向量做内积。内积就是对应位置元素相乘,然后求和,所以一次内积的乘法运算次数是C2次。Query中每个向量要与Key中HW个向量做内积,Query中一共有HW个向量
    4. 乘法运算次数:HW * HW * C2
  • 计算Attention Feature Map:使用Query和Key计算得到的Attention Weight,对Value中的序列数据进行加权
    1. 输入:Attention Weight -> [HW, HW],Value -> [HW, C1]
    2. 输出:[HW, C1]
    3. 计算过程:Attention Weight中每行一共HW个权重元素,分别与Value中的HW个向量相乘,一个数值与维度为C1的向量相乘,乘法运算次数是C1,每行乘HW次,一共HW行,然后将得到的HW个维度为C1的向量相加,得到最终大小为[HW, C1]的结果
    4. 乘法运算次数:HW * HW * C1
  • FFN线性变换:对Attention加权得到的特征做一次线性变换(全连接层)
    1. 输入:[HW, C1]
    2. 输出:[HW, C1]
    3. 计算过程:通过一次线性变换得到输出,其实就是使用一个输入维度为C1,输出维度为C1的全连接层,做一次计算的乘法运算量是C1 * C1,总共做HW次
    4. 乘法运算次数:HW * C1 * C1

        所以,一个Transformer Block中总的乘法运算量是:HW * C1 * C2 + HW * C1 * C2 + HW * C1 * C1 + HW * HW * C2 + HW * HW * C1 + HW * C1 * C1

= 2 * HW * C1 * C2 +2 * HW * C1 * C1 + HW * HW * C2 + HW * HW * C1

        为了简单起见,假设C1 = C2 = C,那么总的乘法运算量是:4 * HW * C * C + 2 * HW * HW * C。

问题:

        为什么Query和Key的向量维度要相等,但是可以不等于Value的输出维度,也就是C2可以不等于C1?

回答:

  1. 因为在计算Attention Weight时,使用Query和Key中的向量做内积,所以要保证Query和Key的向量维度要相等。
  2. Query和Key输出的Attention Weight维度是[HW, HW],消除了C2维度,所以C2可以不等于C1,但是可能会影响性能。


http://www.ppmy.cn/news/318531.html

相关文章

黑客篡改APKPure Store应用商店并分发恶意应用程序

根据安全博客“The Hacker News”4月9日发文报道,网络黑客攻击了APKPure应用商店,并利用其分发恶意的Android应用程序。APKPure是除Google Play Store 之外最大的Android应用商店,在被黑客攻击后,攻击者可以将特洛伊木马分发到And…

VOIP:SIP回铃之SDP的作用

SIP主叫铃声 SIP呼叫时主叫断的铃声有2中不同的情况: SIP电话正在本地生成铃声(平台在没有SDP的情况下发送180个铃声)SIP电话播放来自平台的铃声(平台通过SDP发送180个铃声) (1)本地铃声 &am…

西门子1500和300哪个贵_西门子300和S71500价格差多少这俩款 – 手机爱问

2016-04-28 西门子无绳电话价格 西门子无绳电话的价格是多少?最近打算买一款西门子无绳电话,求推荐~ 不知道楼主打算买什么款式的西门子无绳电话,不过西门子无绳电话价格参差不齐,一般价位是300-800之间,西门子无绳电话还是很不错的。我也很喜欢西门子无绳电话,质量…

linux-2.6.22.6 目录结构

├── arch │ ├── alpha │ │ ├── boot │ │ │ └── tools │ │ ├── kernel │ │ ├── lib │ │ ├── math-emu │ │ ├── mm │ │ └── oprofile │ ├── arm │ │ ├── boot │ │ │ ├──…

DD-WRT基础扫盲

不知道各位读者是否听说过DD-WRT?是否自己亲自将 无线路由器刷新成DD-WRT无线设备?相信真正的无线设备爱好者一定对DD-WRT非常熟悉,我们通过给 无线路由器刷新DD-WRT 驱动程序后就可以让自己的设备发挥更多原先没有的功能。笔者将通过多篇文章…

the output of kernel v4.9 build

/linux/linux-xxxx/_build/v2/xxxx.aarch64/root$ tree -L 5 . ├── boot │ └── Image.gz-dtb ├── boot.img ├── etc │ └── licenses.d │ └── linux-xxx.gz ├── Image.gz-dtb ├── include │ ├── asm │ │ ├── auxvec.h │ │ ├── bitsper…

升级linux4.9 故障,Linux Kernel 4.9.4和4.4.43发布,包含重要修复

Linux Kernel 4.9.4和4.4.43发布,包含重要修复 发布时间:2017-01-16 09:15:37来源:红联作者:baihuo Linux Kernel 4.9.4 和 4.4.43 发布了。两个版本都包含了一组相对较大的重要修复。 部分更新内容: 4.4.43: ipv4: Do not allow MAIN to be …

解决手机不能设置DeviceOwner权限提示already provisioned问题

解决两个问题: (1)、 adb 如何设置 deviceOwner (2)、设置DeviceOwner权限提示already provisioned问题 客户那里有Gigaset手机,安装我们的产品需要注入DeviceOwner,但是刚恢复默认出厂的Gig…