1.Encoder

(1)input_embeding

Input假设是一个维度为vocab的向量,

通过Input_embeding部分变成 vocab*d_model的矩阵:即

(vocab*1)@(1*d_model)=vocab*d_model次乘法。

再乘上d_model ** 0.5 所以 Input_embeding的FLOPs = vocab*d_model*2

(2)Positional Encoding

采用公式

构建position encoding,即每个位置是5个运算,并最后将position encoding与input_embeding相加,所以每个位置进行6个运算。

所以:position encoding的FLOPs是   vocab * d_model  * 6

(3)sublayer1

LayerNorm的输入是(vocab*d_model)

首先会对每个词向量算均值:

vocab * (d_model - 1 )次加法 + vocab次乘法 = vocab * d_model次运算

再算方差:(d_model + d_model + d_model - 1 +2) * vocab = vocab * (3d_model + 1)次运算

所以总共有:FLOPs = vocab * (4d_model + 1)次运算。

self_attention:

1.映射

Q,K,V的维度都是vocab * d_model

W^{Q},W^{K}的维度是 d_model * dk

W^{V}的维度是d_model * dv

论文里面设定的是dk  = dv ,所以统一采用dk

所以映射产生的FLOPs = (2d_model-1)*vocab*3dk

2.过Attention函数

FLOPs = (2dk - 1) * vocab * vocab + vocab*vocab + 2vocab*vocab + vocab * (vocab -1)+(2vocab - 1)*vocab *dv = vocab * vocab *(4dk + 3 )- vocab - vocab*dk

3.因为有h个头,所以总FLOPs = h * (((2d_model-1)*vocab*3dk + vocab * vocab *(4dk + 3 )- vocab - vocab*dk)

4.最后再过一个线性层FLOPs = (2d_model - 1) * vocab * d_model

综上sublayer1的FLOPs = h * (((2d_model-1)*vocab*3dk + vocab * vocab *(4dk + 3 )- vocab - vocab*dk)+(2d_model - 1) * vocab * d_model +  vocab * (4d_model + 1)

=4 * vocab *d_model + h * (6*d_model*vocab*d_k - 4*v*d_k + 4*d_k*vocab*vocab + 3*vocab*vocab - vocab) +2 * vocab * d_model *d_model - vocab * d_model + vocab

(4)sublayer2

相加FLOPs = vocab * d_model

由前可知:Layernorm的FLOPs = vocab * (4d_model + 1)

feed_forward层根据代码

可知:

FLOPs = (2d_model-1)* vocab * d_ff + vocab * d_ff + (2 * d_ff -1) * vocab * d_ model

= vocab * d_model(4d_ff - 1)

所以:sublayer2的FLOPs = vocab * d_model + vocab * (4d_model + 1)+ vocab * d_model(4d_ff - 1)

综上:EncoderLayer的FLOPs =  vocab*d_model*2 +  vocab * d_model  * 6 + h * (((2d_model-1)*vocab*3dk + vocab * vocab *(4dk + 3 )- vocab - vocab*dk)+(2d_model - 1) * vocab * d_model +  vocab * (4d_model + 1)+ vocab * d_model + vocab * (4d_model + 1)+ vocab * d_model(4d_ff - 1)

=16* vocab *d_model + h * (6*d_model*vocab*d_k - 4*v*d_k + 4*d_k*vocab*vocab + 3*vocab*vocab - vocab) +2 * vocab * d_model *d_model - vocab * d_model + 2 * vocab + 4 * vocab * d_model *d_ff

所以Encoder的FLOPs = 6 * (16* vocab *d_model + h * (6*d_model*vocab*d_k - 4*v*d_k + 4*d_k*vocab*vocab + 3*vocab*vocab - vocab) +2 * vocab * d_model *d_model - vocab * d_model + 2 * vocab + 4 * vocab * d_model *d_ff)

(5)LayerNorm

最后还有一层LayerNorm  FLOPs = vocab * (4d_model + 1)

6 * (16* vocab *d_model + h * (6*d_model*vocab*d_k - 4*v*d_k + 4*d_k*vocab*vocab + 3*vocab*vocab - vocab) +2 * vocab * d_model *d_model - vocab * d_model + 2 * vocab + 4 * vocab * d_model *d_ff) + 4 * vocab *d_model +vocab

2.Decoder

decoder部分和encoder部分的FLOPs计算基本一致,直接给出FLOPs计算结果。

tips:Multi_Attention那里有从Encoder处来的memory输入。

(1)

output假设是一个 d_out, 通过embeding变成d_out * d_model的矩阵

Input_embeding的FLOPs = d_out*d_model*2

position encoding的FLOPs是   d_out * d_model  * 6

加法 FLOPs d_out*d_model

总共FLOPs = 9 * d_out*d_model

(2)sublayer1

h * (((2d_model-1)*d_out*3dk + d_out * d_out *(4dk + 3 )- d_out - d_out*dk)+(2d_model - 1) * d_out * d_model +  d_out * (4d_model + 1)

(3)sublayer2

加法的FLOPs = d_out * d_model

LayerNorm FLOPs = vocab * (4d_model + 1)

Multihead_Attention

1.映射

Q的维度是d_out * d_model

K,V的维度都是vocab * d_model

W^{Q},W^{K}的维度是 d_model * dk

W^{V}的维度是d_model * dv

论文里面设定的是dk  = dv ,所以统一采用dk

所以映射产生的FLOPs = (2d_model-1)*vocab*2dk + (2d_model - 1) * d_out * dk

2.过Attention函数

FLOPs =(2dk -1)*d_out * vocab + d_out * vocab +2*d_out*vocab + d_out * (vocab -1 ) +

(2vocab -1) * d_out * dk

3.因为有h个头,所以总FLOPs = h * ((2d_model-1)*vocab*2dk + (2d_model - 1) * d_out * dk + (2dk -1)*d_out * vocab + d_out * vocab +2*d_out*vocab + d_out * (vocab -1 ) +

(2vocab -1) * d_out * dk)

4.最后再过一个线性层FLOPs = (2d_model - 1) * d_out * d_model

所以sublayer2的FLOPs = d_out * d_model + vocab * (4d_model + 1)+ h * ((2d_model-1)*vocab*2dk + (2d_model - 1) * d_out * dk + (2dk -1)*d_out * vocab + d_out * vocab +2*d_out*vocab + d_out * (vocab -1 ) +(2vocab -1) * d_out * dk) + (2d_model - 1) * d_out * d_model

(4)sublayer3

 FLOPs = d_out * d_model + d_out * (4d_model + 1)+ d_out * d_model(4d_ff - 1)

(5)LayerNorm

最后还有一层LayerNorm

d_out * (4d_model + 1)

模型右半部分的最终FLOPs = LayerNorm + 6*Decoder =

d_out * (4d_model + 1)+ 6 *(d_out * d_model + d_out * (4d_model + 1)+ d_out * d_model(4d_ff - 1) + d_out * d_model + vocab * (4d_model + 1)+ h * ((2d_model-1)*vocab*2dk + (2d_model - 1) * d_out * dk + (2dk -1)*d_out * vocab + d_out * vocab +2*d_out*vocab + d_out * (vocab -1 ) +(2vocab -1) * d_out * dk) + (2d_model - 1) * d_out * d_model + h * (((2d_model-1)*d_out*3dk + d_out * d_out *(4dk + 3 )- d_out - vd_out*dk)+(2d_model - 1) * d_out * d_model +  d_out * (4d_model + 1))

=d_out * ( 4 * d_model +1) + 6 * (16 * d_out *d_model + 2 * d_out * d_model * d_model + 4*d_model*d_out*d_ff + 4 * d_model * vocab + vocab +2 * d_model * d_model * d_out + h * (8 * d_model * d_out * d_k - 6 * d_k + 4 * d_k * d_out * d_out + 3 * d_out * d_out - 2 * d_out +4 * d_model * vocab * d_k - 2 * d_k * vocab + 4 * d_k * d_out * vocab + 3 * vocab * d_out))

3.Generator

线性层 : d_out * d_model @ d_model * tgt _vocab 结果是一个d_out * tgt_vocab的矩阵

FLOPs = (2d_model -1) * d_out * tgt_vocab

softmax的FLOPs = 2d_out*tgt_vocab + d_out * (tgt_vocab -1)

generatorFLOPs = 2 * tgt_vocab * d_out - d_out + 2 * d_model * tgt_vocab * d_out

4.总结:

论文里所给得参数值:

vocab = 10 # vocab可以调整
d_model=512
d_ff=2048
h=8
d_k=64
d_out = 1
tgt_vocab = 10000
encoder = 4 * vocab *d_model +vocab + 6 * (16* vocab *d_model + h * (6*d_model*vocab*d_k - 4*vocab*d_k + 4*d_k*vocab*vocab + 3*vocab*vocab - vocab) +2 * vocab * d_model *d_model - vocab * d_model + 2 * vocab + 4 * vocab * d_model *d_ff)
decoder = d_out * ( 4 * d_model +1) + 6 * (16 * d_out *d_model + 2 * d_out * d_model * d_model + 4*d_model*d_out*d_ff + 4 * d_model * vocab + vocab +2 * d_model * d_model * d_out + h * (8 * d_model * d_out * d_k - 6 * d_k + 4 * d_k * d_out * d_out + 3 * d_out * d_out - 2 * d_out +4 * d_model * vocab * d_k - 2 * d_k * vocab + 4 * d_k * d_out * vocab + 3 * vocab * d_out))
generator = 2 * tgt_vocab * d_out - d_out + 2 * d_model * tgt_vocab * d_outresult = (encoder + decoder + generator) / 1e9
名称 FLOPs(GFLOPs) Latency(ms)
VGG16 15.483862016 1791.4
resnet18 1.819066368 190.82
resnet34 3.671263232 408.05
resnet50 4.111514624 445.56
resnet152 11.558837248 1362.19
GoogleNet 1.504879712 180.35
vit_tiny_patch16_384 >49.35  2463.74
vit_tiny_patch16_224 >16.85 712.19

Transformer-FLOPs推导过程相关推荐

  1. 一分钟详解「本质矩阵」推导过程

    文章目录 前言 一 本质矩阵如何推导 二 本质矩阵的意义 三 本质矩阵的求解 四 扩展--基本矩阵 前言 两幅视图存在两个关系:第一种,通过对极几何,一幅图像上的点可以确定另外一幅图像上的一条直线:另 ...

  2. 机器学习——线性回归的原理,推导过程,源码,评价

    https://www.toutiao.com/a6684490237105668620/ 2019-04-27 16:36:11 0.线性回归 做为机器学习入门的经典模型,线性回归是绝对值得大家深入 ...

  3. 变态跳台阶,很难很难,终于想出来了,附推导过程,为自己鼓掌

    https://www.nowcoder.net/practice/22243d016f6b47f2a6928b4313c85387?tpId=13&tqId=11162&tPage= ...

  4. 【数字信号处理】相关函数 ( 卷积与交换性 | 相关函数不具有交换性 | 推导过程 )

    文章目录 一.卷积与交换性 1.卷积概念 2.卷积交换律 二.相关函数交换性 一.卷积与交换性 1.卷积概念 对于 线性时不变系统 ( LTI - Linear time-invariant ) 来说 ...

  5. 【数字信号处理】线性时不变系统 LTI “ 输入 “ 与 “ 输出 “ 之间的关系 ( LTI 系统单位脉冲响应 | 卷积 | 卷积推导过程 )

    文章目录 一.LTI 系统单位脉冲响应 二.卷积 一.LTI 系统单位脉冲响应 线性时不变系统 , 简称 " LTI " , 英文全称 Linear time-invariant ...

  6. 【转】四元数的推导过程

    [转]四元数的推导过程 来自:https://blog.csdn.net/qq_28773183/article/details/80083607 四元数旋转推导过程 1.基本概念 (1) 四元数的一 ...

  7. Softmax vs. SoftmaxWithLoss 推导过程

    Softmax vs. SoftmaxWithLoss Softmax function: Softmax Loss function(cross-entropy): SoftmaxWithLoss的 ...

  8. 20201205 旋转矩阵导数的推导过程

    本文不讲旋转矩阵导数的证明,直接讲其中一种推导过程. 对象:姿态旋转矩阵 坐标系定义: 本体坐标系 FB\mathcal F_{B}FB​, 参考坐标系 FR\mathcal F_{R}FR​ 欧拉旋 ...

  9. Java实现基数排序及其推导过程 Radix Sort

    本文带来八大排序算法之基数排序. 基数排序(radix sort)属于"分配式排序"(distribution sort),又称"桶子法"(bucket sor ...

  10. 【机器学习基础】结合论文理解XGBoost推导过程

    前言 XGBoost是一个可扩展的提升树模型,论文"XGBoost: A Scalable Tree Boosting System"发表在2016年的KDD会议上.文章包括了XG ...

最新文章

  1. 阿里自动驾驶新突破!达摩院自研ISP图像处理器大幅提升安全性
  2. Quartz cron表达式
  3. zookeeper源码分析之五服务端(集群leader)处理请求流程
  4. 将字符串的首字母变为大写
  5. nej+regular环境使用es6的低成本方案
  6. java 中线程池的种类,原理以及源码解析(1)
  7. (转)使用Spring的注解方式实现AOP入门
  8. windows操作系统_windows下用深度系统安装器安装深度操作系统实现双系统分别运行...
  9. 加速nginx: 开启gzip
  10. flash 绘图API:绘制秀曲线图形
  11. RADIUS服务器不是消息,RADIUS通过如下哪些手段来确保RADIUS服务器与RADIUS客户端之间交互消息正确性()。...
  12. 造成服务器不稳定的原因有哪些
  13. Md5码的生成及变种Md5码的生成
  14. 数据可视化实验-茎叶图
  15. word里文字竖向排列(设置竖排文字)
  16. c语言2级考试题下载,C语言二级考试题库
  17. Entry是什么类型?
  18. 腾讯wifi管家竟然盗取我家wifi密码 惊讶!震惊!失望!
  19. 分享笔记RabbitMQ高级之消息限流与延时队列
  20. 微信视频号的10大引流技巧

热门文章

  1. HTTP 请求中的Header 参数
  2. 2018GDKOI旅行记
  3. Python 简繁体互换
  4. 观点:中国信息化现状
  5. 五大部分讲透UML对象图
  6. PTA 7-1 jmu-ds-最长数字序列 (20 分)
  7. 计算机操作处于挂起状态,在命令提示符中输入 sfc /scannow 显示有一个系统修复处于挂起状态,需要重新启动才能完成该修复...
  8. 详解CVE-2022-0847 DirtyPipe漏洞
  9. 【观察】联想凌拓+万国数据:打破多云数据管理“新边界”
  10. 从零搭建RuoYi若依(非分离版)