transformer系列4---transformer结构计算量统计

transformer计算量

  • 1 术语解释
  • 2 矩阵相乘FLOPs
  • 3 Transformer的FLOPs估计
    • 3.1 MultiHeadAttention
      • 3.1.1 Q,K,V计算
      • 3.1.2 attention计算
      • 3.1.3 MultiHeadAttention输出线性映射
      • 3.1.4 MultiHeadAttention总计算量
    • 3.2 MLP
    • 3.3 projection输出
    • 3.3 计算量累计

1 术语解释

  1. FLOPs(Floating Point Operations):浮点运算次数,用来衡量模型计算复杂度,常用来做神经网络模型速度的间接衡量标准。(但该指标与实际模型速度并不一定正相关)

  2. MACs(Multiply–Accumulate Operations):乘加累积操作数,1个MACs包含一个乘法操作与一个加法操作,大约包含2FLOPs。通常MACs与FLOPs存在一个2倍的关系。

2 矩阵相乘FLOPs

  1. 对于 A 1 × n , B n × 1 A^{1×n},B^{n×1} A1×n,Bn×1两个矩阵相乘,计算AB需要进行n次乘法和n次加法,共计2n次浮点数运算 ,即2n的FLOPs,
  2. 对于 A m × n , B n × p A^{m×n},B^{n×p} Am×n,Bn×p两个矩阵相乘,计算AB需要进行2nmp次浮点数运算。

3 Transformer的FLOPs估计

假设Transformer的输入每个词向量维度d_model(d) ,词表大小为vocab_size(v),输入句子最大长度为src_max_len(s),batchsize为 batch(b),head头数为head(h)。
对于输入部分,将输入句子分词并且词嵌入步骤没有计算量,位置编码也没有计算量,因此,计算量主要集中在MultiHeadAttention、MLP、以及最后的投影计算。

3.1 MultiHeadAttention

3.1.1 Q,K,V计算

  1. 1个矩阵计算量:对于输入I,首先计算 Q = I ∗ W q Q =I * W^{q} Q=IWq K = I ∗ W k K = I * W^{k} K=IWk V = I ∗ W v V = I * W^{v} V=IWv,假设输入I的形状为 [b, s, d],1个矩阵乘法的输入和输出形状为[b, s, d] × [d, d] = [b, s, d],计算量为 2 b s d 2 2bsd^{2} 2bsd2
  2. 3个矩阵计算量: 6 b s d 2 6bsd^{2} 6bsd2

3.1.2 attention计算

  1. Q K T QK^{T} QKT

  矩阵乘法的输入形状[b, h, s, d] × [b, h, s, d],输出形状为 [b, h, s, s],h维度是concat,没有计算量,因此该步骤的计算量为 2 b s 2 d 2bs^{2}d 2bs2d

  1. score*V加权
    输入形状为[b, h, s, s] × [b, h, s, d],输出形状为[b, h, s, d], h维度是concat,没有计算量,因此该步骤的计算量为 2 b s 2 d 2bs^{2}d 2bs2d

3.1.3 MultiHeadAttention输出线性映射

所有head都concat,输入形状为[b, s, d] × [d, d] ( W O ) (W^{O}) (WO),输出形状为[b, s, d],计算量 2 b s d 2 2bsd^{2} 2bsd2

3.1.4 MultiHeadAttention总计算量

MultiHeadAttention总计算量为上面三部分之和, 2 b s 2 d 2bs^{2}d 2bs2d+ 2 b s 2 d 2bs^{2}d 2bs2d+ 2 b s d 2 2bsd^{2} 2bsd2= 4 b s 2 d 4bs^{2}d 4bs2d+ 2 b s d 2 2bsd^{2} 2bsd2

3.2 MLP

MLP内包含2个线性层:

  1. 第一个线性层,矩阵乘法输入形状为[b, s, d] × [d, 4d],输出形状为[b, s, 4d],计算量 8 b s d 2 8bsd^{2} 8bsd2
  2. 第二个线性层,矩阵乘法输入形状为[b, s, 4d] × [4d, d],输出形状为[b, s, d],计算量 8 b s d 2 8bsd^{2} 8bsd2

MLP总计算量为 8 b s d 2 8bsd^{2} 8bsd2+ 8 b s d 2 8bsd^{2} 8bsd2= 16 b s d 2 16bsd^{2} 16bsd2

3.3 projection输出

logits的计算,将隐藏向量映射为词表大小。矩阵乘法输入形状为[b, s, d] × [d, v],输出形状为[b, s, v],计算量 2 b s d v 2bsdv 2bsdv

3.3 计算量累计

  1. Transformer的encoder,包含1个MultiHeadAttention,1个MLP
  2. Transformer的decoder,包含2个MultiHeadAttention,1个MLP
  3. Transformer的输出为1个projection
    将上面3部分累加,计算量为 4 b s 2 d 4bs^{2}d 4bs2d+ 2 b s d 2 2bsd^{2} 2bsd2+ 16 b s d 2 16bsd^{2} 16bsd2+2*( 4 b s 2 d 4bs^{2}d 4bs2d+ 2 b s d 2 2bsd^{2} 2bsd2)+ 16 b s d 2 16bsd^{2} 16bsd2+ 2 b s d v 2bsdv 2bsdv= 12 b s 2 d 12bs^{2}d 12bs2d+ 36 b s d 2 36bsd^{2} 36bsd2+ 2 b s d v 2bsdv 2bsdv

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/93323.shtml

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

相关文章

SSM - Springboot - MyBatis-Plus 全栈体系(十六)

第三章 MyBatis 三、MyBatis 多表映射 2. 对一映射 2.1 需求说明 根据 ID 查询订单,以及订单关联的用户的信息! 2.2 OrderMapper 接口 public interface OrderMapper {Order selectOrderWithCustomer(Integer orderId); }2.3 OrderMapper.xml 配置…

讲讲项目里的仪表盘编辑器(三)布局组件

布局容器处理 看完前面两章的讲解,我们对仪表盘系统有了一个大概的理解。接着我们讲讲更深入的应用。 上文讲解的编辑器只是局限于平铺的组件集。而在编辑器中,还会有一种组件是布局容器。它允许其他组件拖拽进入在里面形成自己的一套布局。典型的有分页…

在jupyter中更改、增加内核

今天在配置llama2的环境,在学院实验室的服务器上面用jupyter,怎么都不会增加内核。今天说一下怎么把创建好的conda环境增加到jupyter列表中。 例如我有个环境叫做llama2,很简单只要两步。 第一步先激活conda环境。 conda activate llama2第…

Python基础语法(1)

目录 一、常量和表达式 二、变量和类型 2.1 变量是什么 2.2 变量的语法 2.2.1 定义变量 2.2.2 使用变量 2.3 变量的类型 2.3.1 整数 2.3.2 浮点数(小数) 2.3.3 字符串 2.3.4 布尔 2.3.5 其他 2.4 为什么要有这么多类型 2.4.1 类型决定了数据在内存中占据多大空间…

如何进行日期和时间的计算和操作?

C语言日期和时间的计算与操作 日期和时间在计算机编程中是非常重要的概念,它们用于各种应用,包括日历应用、计时器、事件调度等。C语言提供了一些标准库函数来处理日期和时间,使得在程序中进行日期和时间的计算和操作变得相对容易。本文将详…

【STM32 CubeMX】移植u8g2(一次成功)

文章目录 前言一、下载u8g2源文件二、复制和更改文件2.1 复制文件2.2 修改文件u8g2_d_setup文件u8g2_d_memory 三、编写oled.c和oled.h文件3.1 CubeMX配置I2C3.2 编写文件oled.holed.c 四、测试代码main函数测试代码 总结 前言 在本文中,我们将介绍如何在STM32上成…

[C++随想录] 优先级队列

优先级队列 基本使用题目训练 基本使用 priority_queue, 优先级队列, 又叫做双端队列, 头文件也是 <queue> 别看它叫做队列, 其实它是一个 堆 补充一下概念: 大根堆 — — 每一棵树的父节点比它的孩子都大小跟堆 — — 每一棵树的父节点比它的孩子都小 &#x1f447;&…

Golang语法、技巧和窍门

Golang简介 命令式语言静态类型语法标记类似于C&#xff08;但括号较少且没有分号&#xff09;&#xff0c;结构类似Oberon-2编译为本机代码&#xff08;没有JVM&#xff09;没有类&#xff0c;但有带有方法的结构接口没有实现继承。不过有type嵌入。函数是一等公民函数可以返…

设计模式10、外观模式Facade

解释说明&#xff1a;外观模式&#xff08;Facade Pattern&#xff09;又称为门面模式&#xff0c;属于结构型模式 Faade 为子系统中的一组接口提供了一个统一的高层接口&#xff0c;该接口使得子系统更加容易使用 外观&#xff08;Facade)角色&#xff1a;为多个子系统对外提供…

Sql注入(手工注入思路、绕过、防御)

一、Sql注入思路 1、判断注入点 在GET参数、POST参数、以及HTTP头部等&#xff0c;包括Cookie、Referer、XFF(X-Forwarded-for)、UA等地方尝试插入代码、符号或语句&#xff0c;尝试是否存在数据库参数读取行为&#xff0c;以及能否对其参数产生影响&#xff0c;如产生影响则…

thymeleaf学习

学习链接 th:fragment fragment的引用 th:insert:保留自己的主标签&#xff0c;保留th:fragment的主标签。 th:replace:不要自己的主标签&#xff0c;保留th:fragment的主标签。 th:include:保留自己的主标签&#xff0c;不要th:fragment的主标签。&#xff08;官方3.0后不推荐…

信创办公–基于WPS的EXCEL最佳实践系列 (数据整理复制粘贴)

信创办公–基于WPS的EXCEL最佳实践系列 &#xff08;数据整理复制粘贴&#xff09; 目录 应用背景操作步骤1、数据查找与替换2、复制或粘贴数据3、使用自动填充工具4、将数据拆分到多列5、应用数字格式 应用背景 数据的整理复制粘贴等在日常的工作中经常使用。本章内容主要学习…

第9章 Mybatis

9.1 谈谈你对Mybatis的理解 难度:★★ 重点:★★ 白话解析 说清楚Mybatis是什么,它的工作流程,然后再对比一下Hibernate就好了。 1、Mybatis是什么:它一个半自动ORM框架,它底层把JDBC那套加载驱动、创建连接、创建statement等重复性的硬编码全部给你封装好了,程序员只…

设计模式 - 享元模式

目录 一. 前言 二. 实现 一. 前言 享元模式&#xff08;Flyweight Pattern&#xff09;是一种结构型设计模式&#xff0c;它主要解决的问题是创建大量相似对象时的内存开销问题。该模式通过共享具有相同状态的对象来减少内存使用量。 享元模式的思想是&#xff1a;当需要创建…

嵌入式Linux应用开发-基础知识-第十九章驱动程序基石③

嵌入式Linux应用开发-基础知识-第十九章驱动程序基石③ 第十九章 驱动程序基石③19.5 定时器19.5.1 内核函数19.5.2 定时器时间单位19.5.3 使用定时器处理按键抖动19.5.4 现场编程、上机19.5.5 深入研究&#xff1a;定时器的内部机制19.5.6 深入研究&#xff1a;找到系统滴答 1…

SpringCloud(一)Eureka、Nacos、Feign、Gateway

文章目录 概述微服务技术对比 Eureka服务远程调用服务提供者和消费者Eureka注册中心搭建注册中心服务注册服务发现Ribbon负载均衡负载均衡策略饥饿加载 NacosNacos与Eureka对比Nacos服务注册Nacos服务分集群存储NacosRule负载均衡服务实例权重设置环境隔离 Nacos配置管理配置热…

ESP32设备驱动-OLED-SSD1306(I2C)显示屏驱动

OLED-SSD1306(I2C)显示屏驱动 1、OLED介绍 OLED显示屏是指有机电激发光二极管(OrganicLight-EmittingDiode,OLED)由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异之特性,被认为是下一…

C++面试题准备

文章目录 一、线程1.什么是进程&#xff0c;线程&#xff0c;彼此有什么区别?2.多进程、多线程的优缺点3.什么时候用进程&#xff0c;什么时候用线程4.多进程、多线程同步&#xff08;通讯&#xff09;的方法5.父进程、子进程的关系以及区别6.什么是进程上下文、中断上下文7.一…

短期风速预测|LSTM|ELM|批处理(matlab代码)

目录 1 主要内容 LSTM-长短时记忆 ELM-极限学习机 2 部分代码 3 程序结果 4 程序链接 1 主要内容 该程序是预测类的基础性代码&#xff0c;程序对河北某地区的气象数据进行详细统计&#xff0c;程序最终得到pm2.5的预测结果&#xff0c;通过更改数据很容易得到风速预测结…

Java 中的参数传递方式

Java 中的参数传递方式通常被称为“值传递”&#xff0c;这意味着在方法调用时&#xff0c;实际上传递给方法的是变量的副本&#xff0c;而不是变量本身。尽管这被广泛称为“值传递”&#xff0c;但需要注意的是&#xff0c;这并不意味着 Java 不支持引用传递。事实上&#xff…