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

一.神经网络复杂度简述

两个指标

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

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

计算量/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

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

<think> 首先,用户要求我介绍深度学习运算复杂度的相关信息。我需要参考站内引用:[^1], [^2], [^3],但这些引用仅供参考,不是用户的真正需求。我必须基于用户的上一个问题来响应。 回顾用户的上一个问题:用户说“参考站内引用”,然后列出了引用内容,最后提到“上述引用仅供参考...请尽可能多的参考用户上一次的问题和你的回答。我想了解深度学习运算复杂度的相关信息 请问深度学习运算复杂度介绍”。 用户的上一次问题是关于深度学习运算复杂度的介绍。我需要提供清晰、结构化的回答。 系统级指令: - 所有行内数学表达式使用 $...$ 格式。 - 独立公式使用 $$...$$ 格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识。 回答结构: - 结构清晰,逐步解决问题。 - 帮助用户理解深度学习运算复杂度的概念。 - 基于引用内容,但要融入回答中。 引用内容总结: - [^1]: 讨论了模型复杂度计算量(FLOPs)、参数量等。 - [^2]: 定义深度学习中时间复杂度计算量/FLOPs,空间复杂度为访存量/Bytes(参数数量)。 - [^3]: 给出了卷积运算的计算量示例:一次3x3卷积需要17次操作。 核心概念: - **深度学习运算复杂度**:通常指计算复杂度(时间复杂度)和空间复杂度模型大小或内存需求)。 - **时间复杂度**:以FLOPs(浮点运算次数)衡量。 - **空间复杂度**:以参数数量(参数量)或内存使用量衡量。 我需要覆盖: 1. 什么是FLOPs?为什么重要? 2. 如何计算FLOPs? 3. 参数量是什么? 4. 实际例子和公式。 5. 引用相关部分。 结构化回答: 1. **引言**:简要介绍深度学习模型复杂度。 2. **时间复杂度和FLOPs**:解释计算量。 3. **空间复杂度和参数量**:解释模型大小。 4. **计算方法**:提供示例计算。 5. **总结和意义**:为什么这些指标重要。 6. **相关问题**:生成一些相关问题。 使用中文回答。 加入数学表达式: - 行内数学:如 $ \text{FLOPs} $, $ n \times n $ 卷积。 - 独立公式:如计算FLOPs的公式。 引用标识:在回答中,如果引用特定内容,添加[^1], [^2], [^3]。 生成相关问题:在回答末尾。 最终回答结构: - 标题或清晰分段。 - 逐步解释。 - 相关问题。 </think> ### 深度学习运算复杂度介绍 深度学习模型的运算复杂度是衡量模型效率和资源消耗的关键指标,通常分为**时间复杂度和空间复杂度**。时间复杂度反映计算开销(如推理或训练速度),空间复杂度反映内存需求(如模型大小)。这些指标帮助优化模型设计,尤其在资源受限的设备上。我将逐步解释核心概念、计算方法和实际意义。 #### 1. **核心概念** - **时间复杂度**:以计算量(FLOPs, Floating Point Operations)表示,即模型执行所需的浮点运算次数。FLOPs越小,模型推理越快。例如,在卷积神经网络(CNN)中,FLOPs 取决于层类型和输入尺寸[^2]。 - **空间复杂度**:以参数量(Parameters)表示,即模型权重和偏差的总数,单位为字节(Bytes)或百万参数(Million Params)。参数量越大,模型占用内存越多,影响部署效率[^1]。 两者的关系:更高的参数量往往导致更高的FLOPs,但并不绝对;优化(如稀疏化和量化)可以降低复杂度。 #### 2. **时间复杂度(FLOPs)的计算** FLOPs 的计算基于模型结构。常见层类型的计算方式: - **全连接层(Fully Connected Layer)**:对于一个输入大小为 $m$、输出大小为 $n$ 的层,FLOPs 为 $2 \times m \times n$(包括乘法和加法运算)。 - 公式:$$ \text{FLOPs}_{\text{fc}} = 2 \times \text{input\_size} \times \text{output\_size} $$ - **卷积层(Convolutional Layer)**:卷积核大小、输入通道数和输出通道数影响计算量。例如,一个 $k \times k$ 卷积核在输入特征图尺寸为 $H \times W$、输入通道 $C_{\text{in}}$、输出通道 $C_{\text{out}}$ 时: - FLOPs 包括乘法和加法:每个输出元素的计算量为 $(k \times k \times C_{\text{in}}) + (k \times k \times C_{\text{in}} - 1)$(近似为 $2 \times k^2 \times C_{\text{in}} \times C_{\text{out}} \times H' \times W'$,其中 $H' \times W'$ 是输出特征图尺寸)。 - 示例:如引用[^3]所述,一个3x3卷积核在单个元素上需要17次操作(9次乘法和8次加法)。对于一个输出特征图尺寸为3x3的任务: - 独立公式: $$ \text{FLOPs} = \underbrace{(k \times k)}_{\text{乘法}} + \underbrace{(k \times k - 1)}_{\text{加法}} \times \text{输出元素数} $$ 代入 $k=3$:一个元素需17 FLOPs,全图(9个元素)为153 FLOPs[^3]。 - 简化公式:通用卷积层的 FLOPs 为: $$ \text{FLOPs}_{\text{conv}} = 2 \times k^2 \times C_{\text{in}} \times C_{\text{out}} \times H' \times W' $$ - **其他层类型**:池化层或激活函数的 FLOPs 通常较低(如 ReLU 约 1 FLOPs per element),可忽略不计或单独计算。 实际中,总 FLOPs 是所有层累加的结果。工具如 PyTorch 的 `torchstat` 或 TensorFlow 的 `tf.profiler` 可自动计算。 #### 3. **空间复杂度(参数量)的计算** 参数量直接统计模型权重: - **全连接层**:参数量为 $\text{input\_size} \times \text{output\_size} + \text{output\_size}$(包括权重和偏差)。 - **卷积层**:参数量为 $k \times k \times C_{\text{in}} \times C_{\text{out}} + C_{\text{out}}$。 - 示例:一个3x3卷积,输入通道64,输出通道128,参数量为 $3 \times 3 \times 64 \times 128 + 128 = 73,856$。 总参数量决定模型大小(例如,1百万参数约占用4MB内存)。减少参数量可通过剪枝或知识蒸馏实现[^1]。 #### 4. **为什么复杂度重要?** - **优化模型性能**:高 FLOPs 导致训练/推理慢,影响实时应用(如移动端);高参数量增加内存成本。 - **模型设计指导**:在准确度和效率间平衡。例如,轻量级模型(如 MobileNet)使用深度可分离卷积降低 FLOPs 和参数量。 - **基准指标**:FLOPs 和参数量是评估模型效率的标准,相关研究常以此比较模型[^2]。 实际案例:ResNet-50 约有2500万参数和4G FLOPs,而优化后的EfficientNet-B0仅530万参数和0.39G FLOPs,更适合资源受限场景。 深度学习运算复杂度分析是模型优化的基础,帮助开发者在准确率、速度和资源消耗间找到最佳平衡[^1][^2]。如需更深入的计算工具或特定模型分析,可进一步讨论。
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值