Transformer-FLOPs推导过程

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_out

result = (encoder + decoder + generator) / 1e9
名称FLOPs(GFLOPs)Latency(ms)
VGG1615.4838620161791.4
resnet181.819066368190.82
resnet343.671263232408.05
resnet504.111514624445.56
resnet15211.5588372481362.19
GoogleNet1.504879712180.35
vit_tiny_patch16_384>49.35 2463.74
vit_tiny_patch16_224>16.85712.19

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值