【指标原理】CNN和ViT的FLOPs、参数量计算

一、介绍

FLOPs(Floating Point Operations)是浮点运算次数的缩写,其计算包括所有的浮点数加法、减法、乘法和除法运算。在深度学习领域,FLOPs特别用来量化一个神经网络模型进行一次前向传播所需的浮点运算数量,这对于评估模型的计算效率和资源需求非常有用。

CNN(卷积神经网络)和ViT(Vision Transformer)的FLOPs(浮点运算次数)计算方法依赖于网络的具体架构和输入数据的维度。

二、CNN的FLOPs计算

卷积层的FLOPs计算公式通常如下:

 FLOPs = 2 \times K^{2} \times C_{in} \times C_{out} \times H_{out} \times H_{out}

其中, K 是卷积核的大小,正常卷积核大小是 K×K ;

C_{in}C_{out} 分别是输入、输出特征图的通道数;

H_{out}W_{out} 分别是输出特征图的高度和宽度;

乘以2是因为,每个卷积操作都包含了一次乘法和一次加法运算。

卷积操作的计算过程

如果使用分组卷积(如在深度可分离卷积中),FLOPs的计算需要根据分组数量进行调整,因为每个分组只处理输入通道的一部分。

分组卷积:

FLOPs = G \times (2 \times K^{2} \times \frac{C_{in}}{G} \times H_{out} \times W_{out} \times \frac{C_{out}}{G})

2 \times K^{2} \times C_{in} \times H_{out} \times W_{out} \times \frac{C_{out}}{G}

三、ViT的FLOPs计算

ViT模型的计算复杂度主要来自于其自注意力机制前馈网络

3.1 ViT的基本组成

  1. 自注意力(Self-Attention)层:允许模型在处理一个序列的不同位置时,根据其他位置的信息来加权当前位置的表示。这一机制的核心是通过计算序列中每个元素对于其他元素的注意力得分来实现的。

  2. 前馈网络(Feed-Forward Network, FFN)层:每个位置上应用相同的全连接层,通常包括两个线性变换和一个非线性激活函数。

3.2 自注意力的FLOPs计算

自注意力计算过程由3个部分组成:

(1)线性映射:就是通过线性层得到查询(Q)、键(K)和值(V)矩阵;

(2)注意力得分:要进行矩阵乘法操作 QK^{T},计算得到相似度后再应用SoftMax函数,但是一般可以忽略,因为计算量相对比较小;

(3)应用注意力:得分矩阵和值V矩阵进行乘法;

假设N是序列长度(也就是输入的token数量),D是特征的维度。

对于一张图像而言,ViT首先会将其切割成多个小块(patches),每个块通常有相同的像素大小。然后,每个块的原始像素值平展成一个长向量,然后通过一个线性变换,将其映射到一个指定的维度D,如果一张图像被划分成N块,那么整个图像就可以表示为 N \times D 的矩阵:

其中,每一行代表一个图像块转换后的D维向量;整个矩阵代表了原始的图像,由N个这样的D维向量组成。

对于线性映射部分,输入序列(也就是说的 N \times D 矩阵)会被转化为Q、K、V。这个过程是通过权重矩阵进行转换的,这个矩阵是可以学习的。假设权重矩阵分别是 W^{Q}W^{K}W^{V},每个矩阵大小是D \times D^{'} ,其中D^{'} 是映射后的维度,通常等于D。因此,Q、K和V就是下面公式得到的:

Q = XW^{Q}, K = XW^{K}, V = XW^{V}

因此输出就是 N \times D^{'}

那么,对于每个元素都要进行D^{'}次乘法运算,一共有N \times D 个元素。3是因为Q、K、V是相同操作。

FLOPs计算就是:3 \times N \times D \times D^{'}

对于注意力得分部分,是进行QK^{T} 乘法运算,有N \times D 个元素,要进行N次乘法运算。

FLOPs计算就是:N \times D \times N

对于应用注意力部分:同理是N \times D \times N

因此,整个注意力实现部分是2 \times D \times N^{2} + 3 \times D^{2} \times N

对于FFN(前馈网络)的FLOPs,其实就是2层线性层,加一个激活函数,假设中间隐藏层是D_{hidden}

第一层:N \times D \times D_{hidden}

第二层:N \times D_{hidden} \times D

整个FLOP计算就是2 \times N \times D_{hidden} \times D

在ViT模型中,自注意力层和前馈网络层通常会交替出现多次。对于整个模型的FLOPs计算,是需要将所有层的FLOPs累加起来。此外,如果模型采用了多头注意力机制,上述自注意力部分的FLOPs还需要乘以头数(H)。

四、参数量计算

卷积层的参数量由卷积核的尺寸、输入通道数和输出通道数决定。对于一个卷积层,参数量计算公式为:

参数量=(卷积核高度×卷积核宽度×输入通道数+1)×输出通道数

其中+1是因为每个输出通道还有一个偏置项。

连接层(线性层)的参数量由输入特征数和输出特征数决定。公式为:

参数量=(输入特征数+1)×输出特征数参数量=(输入特征数+1)×输出特征数

ViT的参数量计算涉及到嵌入层、自注意力层和前馈网络(FFN)层

嵌入层:将图像分块后,每个块被线性投影到一个固定维度的特征空间。参数量为:

参数量=(块的大小×嵌入维度)参数量=(块的大小×嵌入维度)

如果加入了位置编码,通常位置编码是不计入可训练参数的,因为它们可以是固定的,除非是可学习的位置编码。

自注意力层:包括查询(Q)、键(K)和值(V)的线性映射以及自注意力机制的权重。

对于每个映射,参数量为:

参数量=嵌入维度×嵌入维度参数量=嵌入维度×嵌入维度

一共有3个,要乘以3。自注意力机制的其他部分,如Softmax计算,不涉及可训练参数。

前馈网络(FFN):每个自注意力层后面跟着一个FFN,通常包含两个线性变换,参数量为:

参数量=(嵌入维度+1)×FFN中间层维度+(FFN中间层维度+1)×嵌入维度参数量

=(嵌入维度+1)×FFN中间层维度+(FFN中间层维度+1)×嵌入维度

  • 21
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值