Transformer Block运算量

news2025/1/26 15:46:23

参考: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.coloradmin.cn/o/631981.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android:Handler

参考来源 参考来源 参考来源 参考来源 Handler机制(面试版) Binder/Socket用于进程间通信,而Handler消息机制用于同进程的线程间通信 handler机制是android系统运行的基础,它采用生产者,消费者模式进行设计。其中生产…

基于SSM的青少年编程学习系统设计与实现

摘 要:在智能技术飞速发展的今天,各国都努力争取在人工智能时代的发展中占据优势,青 少年编程教育就显得格外重要。不过,相比一些青少年编程教育发展更先进的国家,我国青少 年编程教育仍处在初级阶段,很多青…

服务器(裸机)如何安装Centos 7系统

1. 下载系统镜像(可以选择自己对应的版本) http://mirrors.aliyun.com/centos/7/isos/x86_64/2. 制作linux系统U盘 下载UltraISO制作工具并安装 再准备一个空U盘(注意:这个操作会将U盘内数据全部删除操作之前请将U盘内文件备份&…

Swift学习笔记(一)基础语法

文章目录 前言开发工具变量与常量变量和常量的定义和使用变量和常量的命名规范注释初识基本数据类型浮点型数据布尔型数据两种特殊的基本数据类型元组可选值类型 为类型取别名模拟面试 字符、字符串与集合类型字符串类型字符串的组合字符类型转义字符 字符串类型中的常用方法集…

Redis的大key

什么是 redis 的大 key redis 的大 key 不是指存储在 redis 中的某个 key 的大小超过一定的阈值,而是该 key 所对应的 value 过大对于 string 类型来说,一般情况下超过 10KB 则认为是大 key;对于set、zset、hash 等类型来说,一般…

K8s in Action 阅读笔记——【13】Securing cluster nodes and the network

K8s in Action 阅读笔记——【13】Securing cluster nodes and the network 13.1 Using the host node’s namespaces in a pod Pod中的容器通常在不同的Linux名称空间下运行,这使得它们的进程与其他容器或节点默认名称空间下运行的进程隔离开来。 例如&#xff…

初学Nginx要掌握哪些概念

文章目录 为什么要使用Nginx?什么是Nginx?Nginx的作用?反向代理负载均衡动静分离 为什么要使用Nginx? 小公司项目刚刚上线的时候,并发量小,用户使用的少,所以在低并发的情况下,一个…

Android 逆向安全行业前景如何?

前言 Android 逆向是指对已经发布的 Android 应用进行分析和研究,通过逆向工程,将 Android 应用中的底层实现原理、业务逻辑、源代码以及恶意行为等等信息进行破解和掌握。逆向工程可以让研究者深入了解 Android 应用的实现细节,从而识别和修…

算法刷题-数组-螺旋矩阵

59.螺旋矩阵 力扣题目链接 给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。 示例: 输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ] 思路 这道题目可以说在面试中出现频率较高的题目&#x…

3.DIY可视化-拖拽设计1天搞定主流小程序-前后分离框架运行

3.DIY可视化-拖拽设计1天搞定主流小程序-前后分离框架运行 前言 话不多说,直接实操。一、导入 diygw-ui-admin项目到vscode 克隆项目 : git clone https://gitee.com/diygw/diygw-ui-admin.git进入项目 桌面 cmd 运行: cd diygw-ui-admin推荐使用yarn 也可参照后面直接使用npm…

react合成事件+底层原理+发展历程

React中的合成事件 合成事件是围绕浏览器原生事件,充当跨浏览器包装器的对象;它们将不同浏览器的行为合并为一个API,这样做是为了确保事件在不同浏览器中显示一致的属性!保证兼容性 合成事件的基本操作 基础语法:在JSX元素上,直…

2023蓝桥杯大学A组C++决赛游记+个人题解

Day0 发烧了一晚上没睡着,感觉鼻子被打火机烧烤一样难受,心情烦躁 早上6点起来吃了个早饭,思考能力完全丧失了,开始看此花亭奇谭 看了六集,准备复习数据结构考试,然后秒睡 一睁眼就是下午2点了 挂了个…

交通 | GAMS快速入门及其在运输问题求解的应用

推文作者​:AmieeXue 第一部分 GAMS编程求解运输问题 GAMS,全称The General Algebraic Modeling System,是一款通用的高级数学建模工具,它支持线性规划、非线性规划、混合整数规划问题、二次约束规划(QCP)…

《面试1v1》List

我是 javapub,一名 Markdown 程序员从👨‍💻,八股文种子选手。 《面试1v1》 连载中… 面试官: 小伙子,听说你对Java集合挺在行的? 候选人: 谢谢夸奖,我对Java集合还在学习中,只能算入门水平。特别是List这…

vue 3 第三十五章:集成 tailwind Css

文章目录 1. tailWind css介绍2. tailWind css基本使用2.1. 步骤一:安装Tailwind CSS2.2. 步骤二:创建配置文件2.3. 步骤三:配置PostCSS2.4. 步骤四:引入样式文件2.5. 步骤五:模板中使用tailWind css 3. 补充3.1. 语法…

【P60】JMeter Jtl 文件的 html 格式输出

文章目录 一、汇总报告(Summary Report)参数说明二、准备工作三、测试计划设计四、Jtl 文件的 html 格式输出 一、汇总报告(Summary Report)参数说明 可以查看事务或者取样器在某个时间范围内执行的汇总结果 使用场景&#xff1…

Shell脚本攻略:Linux防火墙(二)

目录 一、理论 1.SNAT 2.DNAT 3.tcpdump抓包工具 二、实验 1.SNAT实验 2.DNAT实验 3.tcpdump抓包 一、理论 1.SNAT (1)概念 SNAT又称源地址转换。 源地址转换是内网地址向外访问时,发起访问的内网ip地址转换为指定的ip地址 &#…

【软考系统规划与管理师笔记】第6篇 IT服务部署实施

这章基本也是管理概念,考试内容基本以教材为主 1 概述 IT服务部署实施是衔接IT服务规划设计与IT服务运营的中间阶段,负责对服务组 件进行客户化,并在充分满足客户要求的前提下,使用标准化的方法管理人员、资源、 技术和过程&…

【超简单的串口通信的工作原理】

上图是电脑收到来自微控制器经过串口发送的信息, 那么电脑是如何收到这些数据的呢? 任何一种通信都要包括硬件物理接口和软件通信协议。 串口通信物理接口如下图: 微控制器与电脑的通信仅需1根数据线将数据一位一位按顺序发送,称…

matlab的矩阵常用操作方法

matlab中数据的基本格式是矩阵,行向量、列向量和标量都是矩阵的特例。矩阵可以是二维的,也可以是多维的。 (1)查找矩阵中的元素 ①find函数 在matlab中,可以调用find函数在矩阵中查找满足一定条件的元素&#xff0c…