理解深度学习模型复杂度评估

一.神经网络复杂度简述

两个指标

时间复杂度和空间复杂度是衡量一个算法的两个重要指标,用于表示算法的最差状态所需的时间增长量和所需辅助空间.

在深度学习神经网络模型中我们也通过:

计算量/FLOPS(时间复杂度)即模型的运算次数
访存量/Bytes(空间复杂度)即模型的参数数量

这两个指标来评判深度学习模型的性能

所以我们经常在论文里面看到类似如下的图就可以理解其含义了:
在这里插入图片描述

复杂度对模型的影响

时间复杂度决定了模型的训练/预测时间。

如果复杂度过高,会导致模型训练和预测耗费大量时间,既无法快速的验证想法和改善模型,也无法做到快速的预测。

空间复杂度决定了模型的参数数量。

由于维度灾难的限制,模型的参数越多,训练模型所需的数据量就越大,而现实生活中的数据集通常不会太大,这会导致模型的训练更容易过拟合。

下面我将分全连接FC和卷积网络CNN两种分别介绍其网络的复杂度计算:

二.全连接层复杂度计算

假设输入的数据维度(N, D),隐藏层权重维度(D, out),输出(N,out)那么计算量:

F L O P s = ( 2 × D − 1 ) × o u t FLOPs= (2\times D-1)\times out FLOPs=(2×D1)×out

访存量(参数量):
B y t e s = D × o u t + o u t Bytes = D\times out+out Bytes=D×out+out (后面加的out是偏置b的数量)

注意:在全连接FC网络中,除了FLOPS之外还一种方法来衡量计算量,就是 MACCs(乘-加操作)也叫 MAdds。就是把一次点积和加法运算,合看成一次运算。

M A C C s = D × o u t MACCs= D\times out MACCs=D×out
举例

一个全连接层,输入 100 维,输出 300 维,输入形状【N,100】,隐藏层形状【100,300】
FLOPS 有 (2×100-1)×300
MACCS有300×100

激活函数:(这里本来不想写,后来想想还是加上吧,帮助理解)

激活函数里面没有参数,也就没有访存量,只有计算量(根据函数式来计算)
拿ReLU 或者 Sigmoid举例:

对输出为 J 的 FC 层,ReLU 有 J 个FLOPS:

y=max(x,0)y=max(x,0)

相比之下 Sigmoid 就复杂很多。

y=1/(1+exp(−x))y=1/(1+exp(−x))

我们把加减乘除、指数、平方根等等运算都算作一次 FLOPS,这里有除法、加法、指数和减法四种运算,所以 FLOPS 就是 J×4 。

可以明显看出来,相对于全连接的矩阵运算,激活函数的计算量太小了,通常忽略不计

三.卷积神经网络复杂度计算

单个卷积层的时间复杂度(计算量)

在这里插入图片描述
M :输出特征图FeatureMap) 的边长 (这里以宽高相等为例)

K :每个卷积核 (Kernel) 的边长(这里以宽高相等为例)

Cin : 输入通道数,也就是每个卷积核的层数
Cout: 输出通道数,即卷积核的个数

公式是由卷积的操作计算出来的,这里就不赘述了。如何理解:
总的计算量其实等于:
卷积核的计算量(卷积核的面积×卷积核的个数×卷积核的层数) 再乘以 特征图的面积(因为特征图上的每个特征点都代表了一次卷积核的运算结果)
下图展示了卷积的过程(2个卷积核)
在这里插入图片描述

单个卷积层的空间复杂度(访存量)

严格来讲包括两部分:总参数量 + 输出特征图。

参数量:模型所有带参数的层的权重参数总量
特征图:模型在实时运行过程中每层所计算出的输出特征图大小
B y t e s = ( K × K × C i n × C o u t + M × M × C o u t ) × 4 Bytes =( K\times K\times Cin\times Cout + M\times M \times Cout)\times 4 Bytes=K×K×Cin×Cout+M×M×Cout×4

乘以4的原因是 得出的单位是Byte,而数据类型通常为float32

四.模型的计算强度和理论性能

基于计算量和访存量二个参数,我们有了关于模型的计算强度和理论性能的概念:

模型的计算强度 :由计算量除以访存量就可以得到模型的计算强度,它表示此模型在计算过程中,每Byte内存交换到底用于进行多少次浮点运算。单位是FLOP/Byte。可以看到,模计算强度越大,其内存使用效率越高。

模型的理论性能 :我们最关心的指标,即模型在计算平台上所能达到的每秒浮点运算次数(理论值)。单位是 FLOP/s。有兴趣的可以看看Roof-line Model 这个理论关于这个指标的计算方法

五.优化网络来加速模型

举一个Depthwise(深度可分离卷积)的例子:

Depthwise:
分组数量等于输入的通道数量,也等于输出通道数量。
不同于常规卷积每个卷积核是同时操作输入图片的每个通道,Depthwise Convolution的一个卷积核负责一个通道,一个通道只被一个卷积核卷积

常规卷积
在这里插入图片描述
如图所示对于一张5×5像素、三通道彩色输入图片(shape为5×5×3)。经过3×3卷积核的卷积层(假设输出通道数为4,则卷积核shape为3×3×3×4),最终输出4个Feature Map

计算量 = 3 × 3 × 3 × 3 × 3 × 4= 972
访存量 = 4 × 3 × 3 × 3 + 3×3×4 = 144

Depthwise Convolution

先Depthweise 然后再用1*1 逐点卷积把通道从3扩到4

在这里插入图片描述

在这里插入图片描述

权重参数量分两部分: 3 × 3 × 3 (depthwise)+1 × 1 × 3 × 4(pointwise) = 39
访存量 = 39 + 特征图大小(3 ×3 ×3 + 3 ×3 ×4) = 102
计算量 = 3×3×3×3×4 + 1×1×3×4×3×3 = 432

所以可以看出,经过这样的优化后,同样会使计算量大幅减小,访存量基本不变,所以计算密度大幅下降。

  • 2
    点赞
  • 3
    评论
  • 27
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值