卷积神经网络的复杂度分析

转载自:http://www.dataguru.cn/article-12668-1.html

在梳理CNN经典模型的过程中,我理解到其实经典模型演进中的很多创新点都与改善模型计算复杂度紧密相关,因此今天就让我们对卷积 神经网络的复杂度分析简单总结一下下。

1.时间复杂度

1.2 卷积神经网络整体的时间复杂度

示例:用 Numpy 手动简单实现二维卷积

假设 Stride = 1, Padding = 0, img 和 kernel 都是 np.ndarray.

2. 空间复杂度
空间复杂度即模型的参数数量,体现为模型本身的体积。


可见,网络的空间复杂度只与卷积核的尺寸 K 、通道数 C 、网络的深度 D 相关。而与输入数据的大小无关。
当我们需要裁剪模型时,由于卷积核的尺寸通常已经很小,而网络的深度又与模型的能力紧密相关,不宜过多削减,因此模型裁剪通常最先下手的地方就是通道数。

3. 复杂度对模型的影响
时间复杂度决定了模型的训练/预测时间。如果复杂度过高,则会导致模型训练和预测耗费大量时间,既无法快速的验证想法和改善模型,也无法做到快速的预测。
空间复杂度决定了模型的参数数量。由于维度诅咒的限制,模型的参数越多,训练模型所需的数据量就越大,而现实生活中的数据集通常不会太大,这会导致模型的训练更容易过拟合。

4. Inception 系列模型是如何优化复杂度的
通过五个小例子说明模型的演进过程中是如何优化复杂度的。


4.1 InceptionV1中的 1×1 卷积降维
InceptionV1 借鉴了 Network in Network 的思想,在一个 Inception Module 中构造了四个并行的不同尺寸的卷积/池化模块(上图左),有效的提升了网络的宽度。但是这么做也造成了网络的时间和空间复杂度的激增。对策就是添加 1 x 1 卷积(上图右红色模块)将输入通道数先降到一个较低的值,再进行真正的卷积。
以 InceptionV1 论文中的 (3b) 模块为例,输入尺寸为 28×28×256,1×1 卷积核128个,3×3 卷积核192个,5×5 卷积核96个,卷积核一律采用Same Padding确保输出不改变尺寸。

可见,与真正的卷积层不同,全连接层的空间复杂度与输入数据的尺寸密切相关。因此如果输入图像尺寸越大,模型的体积也就会越大,这显然是不可接受的。例如早期的VGG系列模型,其 90% 的参数都耗费在全连接层上。
InceptionV1 中使用的全局较大池化 GAP 改善了这个问题。由于每个卷积核输出的特征图在经过全局较大池化后都会直接精炼成一个标量点,因此全连接层的复杂度不再与输入图像尺寸有关,运算量和参数数量都得以大规模削减。复杂度分析如下:


4.3 InceptionV2 中使用两个 3×3 卷积级联替代 5×5 卷积分支

根据上面提到的二维卷积输入输出尺寸关系公式,可知:对于同一个输入尺寸,单个 5×5 卷积的输出与两个 3×3 卷积级联输出的尺寸完全一样,即感受野相同。
同样根据上面提到的复杂度分析公式,可知:这种替换能够非常有效的降低时间和空间复杂度。我们可以把辛辛苦苦省出来的这些复杂度用来提升模型的深度和宽度,使得我们的模型能够在复杂度不变的前提下,具有更大的容量,爽爽的。
同样以 InceptionV1 里的 (3b) 模块为例,替换前后的 5×5 卷积分支复杂度如下:


4.4 InceptionV3 中使用 N×1 与 1×N 卷积级联替代 N×N 卷积

InceptionV3 中提出了卷积的 Factorization,在确保感受野不变的前提下进一步简化。
复杂度的改善同理可得,不再赘述。

4.5 Xception 中使用 Depth-wise Separable Convolution

我们之前讨论的都是标准卷积运算,每个卷积核都对输入的所有通道进行卷积。
Xception 模型挑战了这个思维定势,它让每个卷积核只负责输入的某一个通道,这就是所谓的 Depth-wise Separable Convolution。
从输入通道的视角看,标准卷积中每个输入通道都会被所有卷积核蹂躏一遍,而 Xception 中每个输入通道只会被对应的一个卷积核扫描,降低了模型的冗余度。
标准卷积与可分离卷积的时间复杂度对比:可以看到本质上是把连乘转化成为相加。


5.总结
通过上面的推导和经典模型的案例分析,我们可以清楚的看到其实很多创新点都是围绕模型复杂度的优化展开的,其基本逻辑就是乘变加。模型的优化换来了更少的运算次数和更少的参数数量,一方面促使我们能够构建更轻更快的模型(例如MobileNet),一方面促使我们能够构建更深更宽的网络(例如Xception),提升模型的容量,打败各种大怪兽,欧耶~

### 图卷积神经网络的时间复杂度分析卷积神经网络(Graph Convolutional Network, GCN)是一种专门设计用于处理图结构数据的深度学习模型。其时间复杂度主要取决于以下几个因素: #### 1. **邻接矩阵的操作** GCN 的核心操作涉及邻接矩阵 \( A \) 和特征矩阵 \( X \) 的乘法运算。如果图有 \( N \) 个节点,则邻接矩阵 \( A \) 是一个大小为 \( N \times N \) 的矩阵。对于每一层的前向传播,计算公式如下: \[ H^{(l+1)} = \sigma(\tilde{D}^{-\frac{1}{2}} \tilde{A} \tilde{D}^{-\frac{1}{2}} H^{(l)} W^{(l)}) \] 其中,\( \tilde{A} = A + I_N \),\( \tilde{D}_{ii} = \sum_j \tilde{A}_{ij} \),\( H^{(l)} \) 表示第 \( l \)-th 层的隐藏状态,\( W^{(l)} \) 是可训练权重矩阵。 - 邻接矩阵与特征矩阵相乘的时间复杂度为 \( O(N^2 D) \)[^4],其中 \( D \) 是输入特征维度。 - 如果使用稀疏表示的邻接矩阵(常见于实际应用中),则复杂度降低至 \( O(E D) \)[^3],其中 \( E \) 是边的数量。 #### 2. **层数的影响** 假设 GCN 模型共有 \( L \) 层,每层都需要执行一次上述的核心操作。因此,总的时间复杂度为: \[ O(L \cdot E \cdot D) \] 当图较为稀疏时,这种稀疏性能够显著减少计算开销。 #### 3. **通道数的作用** 类似于传统 CNN 中的情况,通道数的变化也会影响 GCN 的时间复杂度。随着通道数量增加,权重矩阵 \( W^{(l)} \) 的规模变大,从而增加了每次矩阵乘法所需的 FLOPs 数量。具体来说,设输出通道数为 \( C_{out} \),输入通道数为 \( C_{in} \),那么单次矩阵乘法的时间复杂度变为: \[ O(L \cdot E \cdot (C_{in} + C_{out})) \] #### 4. **优化技术的应用** 现代框架如 PyTorch 或 TensorFlow 提供了针对稀疏张量的支持,通过高效实现稀疏矩阵乘法来进一步降低运行时间。然而需要注意的是,尽管理论上稀疏运算可能带来性能提升,但在实践中还需考虑硬件支持以及算法的具体实现细节。 ```python import torch.sparse as tsparse def sparse_matrix_multiplication(sparse_A, dense_X): """ Perform efficient multiplication between a sparse adjacency matrix and feature matrix. Args: sparse_A (torch.Tensor): Sparse representation of the normalized adjacency matrix. dense_X (torch.Tensor): Dense input feature matrix. Returns: result (torch.Tensor): Resultant tensor after multiplication. """ return tsparse.mm(sparse_A, dense_X) ``` --- ### 总结 综上所述,图卷积神经网络的时间复杂度受多个因素影响,主要包括图的稀疏程度、层数、输入/输出通道数等。在理想情况下,利用稀疏表示可以有效减小计算负担并提高效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值