当前位置: 首页 > article >正文

Shuffle Net系列详解 (2) Shuffle Net V2论文理论部分详解

请添加图片描述

Shuffle Net 系列

  • 论文精讲部分
    • 0.摘要
    • 1.引言
    • 2.高效指导时间设计
    • 3. ShuffleNet V2: an Efficient Architecture
    • 4.实验
    • 5.总结

论文精讲部分

本专栏深入探讨轻量级模型的学术研究,并通过代码实验来加深理解。提供各类学术论文的解读,并标注引用以展示对论文的深刻理解。采用不同的阅读角度可能导致理解上的偏差,因此欢迎读者通过评论或私信分享观点或提问。

本章节将进一步分析之前提到的超轻量级 ShuffleNet 模型及其升级版本,并深入其核心理念。接下来的节将详细讨论 ShuffleNet 的代码实现,并在后续章节通过案例分析法继续探索轻量级模型的发展,帮助读者深化对相关论文的理解。读者可根据兴趣自由选择阅读顺序,如有疑问或想法,欢迎随时在评论区进行交流。

0.摘要

当前,神经网络架构设计主要由间接复杂度指标(如 FLOPs)引导。然而,直接指标(例如速度)也依赖于其他因素,比如内存访问成本和平台特性。因此,本工作提议在目标平台上评估直接指标,而不仅仅考虑 FLOPs。基于一系列受控实验,本工作得出了几条高效网络设计的实用指南。据此,我们提出了一种新的架构,称为 ShuffleNet V2。全面的消融实验验证了我们的模型在速度与准确性权衡方面是最先进的。

就是提出了新的模型性能很好,并且其不在基于理论层面的复杂度讨论,而是实际应用层面的比较。不玩虚的就是干

1.引言

属于是论文最难写的部分了,现阶段研究进展,发现了哪些问题。如何结果的,现在还有哪些问题。

深度卷积神经网络(CNN)的架构经过多年发展,变得更准确、更快速。自从 AlexNet 的里程碑式工作以来,通过 VGG、GoogLeNet、ResNet、DenseNet、ResNeXt、SE-Net 以及自动化神经网络架构搜索等新结构,ImageNet 分类准确率得到了显著提高。除了准确率,计算复杂度也是一个重要的考量因素。

AlexNet 、 VGG、 GoogLeNet、ResNet、谁写都得拉出来说说。主要是这句话 “ImageNet
分类准确率得到了显著提高。除了准确率,计算复杂度也是一个重要的考量因素。”

大家都在卷参数,虽然性能上去了,但是太复杂了,难训练难应用。虽然巨型计算机的算力好,这并不是每个人都能无时无刻使用的吧。因此其还是存在一定的应用壁垒。所示其还是需要考虑算法的计算复杂的温度和其准确率的综合评定。
剩下的就是DenseNet、ResNeXt、SE-Net这几个网络了:挖个坑后面开一个CNN专题都讲一下。如果我你看到了我还没写私信催催我

  • DenseNet(密集连接网络)
    DenseNet 是在 2017 年提出的一种网络架构,其最大的特点是网络中的每一层都与前面的所有层相连。在传统的深度网络中,每一层的输入仅仅是前一层的输出,而 DenseNet 中,每一层的输入是之前所有层的特征图的集合。这种密集的连接方式促使了特征的重用,大大减少了参数的数量并提高了效率。相较于 ResNet,DenseNet 的主要创新在于增加了特征复用,减少参数量和计算复杂度,提高模型的表现。
  • ResNeXt
    ResNeXt 是在 2017 年提出的,它并不是基于 ResNet 的轻量化网络,而是一种旨在增加网络容量而不显著增加复杂度的架构。ResNeXt 的核心思想在于引入了组卷积(group convolution)和 “基数”(cardinality)的概念。通过组卷积,它将特征分割成多个组进行处理,每组应用不同的权重集;而基数是一个重要的维度,表示组的数量。ResNeXt 通过这种方式来提高模型的精确度和效率,主要是为了提高模型的复用性并减少计算资源消耗。
  • SE-Net(Squeeze-and-Excitation Networks)
    SE-Net,即压缩和激励网络,是在 2017 年提出的一种网络架构,它通过显式地建模特征通道之间的相互关系来提高特征表示的质量。SE-Net 通过两个操作,“压缩”(squeeze)和 “激励”(excitation),对特征通道进行了重标定,从而使网络能够自适应地强调重要的特征并抑制不重要的特征。这种机制被证明在提高几乎所有 CNN 架构的性能方面都非常有效。

现实世界任务往往旨在有限的计算预算下获得最佳准确率, (经典的BUT转折) 这一预算由目标平台(如硬件)和应用场景(如自动驾驶需要低延迟)给出。这激发了一系列朝着轻量架构设计和更好的速度 - 准确率权衡的工作,包括 Xception、MobileNet、MobileNet V2、ShuffleNet 和 CondenseNet 等。分组卷积和深度卷积在这些工作中至关重要。

Xception、MobileNet、MobileNet V2、ShuffleNet 和 CondenseNet 等。前面讨论了传统的CNN。引出了轻量化问题解决的必要性,后面则引入轻量化网络的的进展。这也可以看到基本就是谷歌(Mobilenet)和旷世(ShuffleNet)的纠缠。Xception、 CondenseNet 也挖个坑。
Xception(Extreme Inception)是一种深度学习模型,于 2017 年由 François Chollet 提出。Xception 模型是基于 Inception 架构的一个扩展,它引入了 “深度可分离卷积”(depthwise separable convolution)的概念,来进一步提高模型的性能和效率。这种架构在参数数量、计算复杂度和性能上都有显著优势。这个其实可以通Googlenet中一并介绍。而这个CondenseNet 看名字就是在densenet上引入的轻量化模型。
回到正文继续看

计算复杂度的一个广泛使用的度量标准是浮点运算数量,或 FLOPs。(给出定义) 然而,FLOPs 是一个间接度量标准。它是对我们真正关心的直接度量标准(如速度或延迟)的近似,但通常不等同于直接度量标准。之前的工作已经注意到了这种差异。例如,尽管 MobileNet v2 和 NASNET-A 的 FLOPs 相当,但 MobileNet v2 要快得多。这一现象进一步在图 1 ©(d) 中展示了,展示了具有相似 FLOPs 的网络有不同的速度。因此,仅使用 FLOPs 作为计算复杂度的唯一度量标准是不够的,可能导致次优设计。

提到了一种衡量尺度一个是FLOPs float-point operations 正文中给出的缩写。浮点操作次数。其和速度存在相关性近似结果。但在最终的实践阶段还是存在诸多实际操作的问题。传统的MobileNet v2 和通过网络得到的 NASNET-A 尽管理论上 FLOPs相同,但是其在实际的运算速度上还是和 MobileNet v2 存在差距。这可能由其其他因素决定。所以在构建网络的时候这个能导致速度差异的问题也要被考虑在内。

间接(FLOPs)和直接(速度)度量标准之间的差异可以归因于两个主要原因。首先,FLOPs 没有考虑到对速度有重要影响的几个因素。其中一个这样的因素是内存访问成本(MAC)。这种成本在如分组卷积等某些操作中占运行时间的大部分。它可能成为具有强大计算能力设备(如 GPU)的瓶颈。这种成本在网络架构设计期间不应简单忽略。另一个是并行度。在相同 FLOPs 下,具有高并行度的模型可能比具有低并行度的另一个模型快得多。
其次,具有相同 FLOPs 的操作可能有不同的运行时间,这取决于平台。例如,早期工作广泛使用张量分解来加速矩阵乘法。然而,近期工作发现,尽管分解减少了 75% 的 FLOPs,但在 GPU 上甚至更慢。我们调查了这个问题,发现这是因为最新的 CUDNN 库专门针对 3×3 卷积进行了优化。
基于这些观察,我们提出应考虑两个原则以进行有效的网络架构设计。 首先,应使用直接度量标准(例如,速度)而不是间接度量标准(例如,FLOPs)。其次,应在目标平台上评估此度量标准。

提出了三点影响模型运算速度的原因,两点主要原因,内存读取问题,主要是采用分组卷积就要存储多组计算结果,采用11卷积进行计算。才会得到最终的特征图。这就比传统卷积多了一个步骤,其分组的计算结果也要保存给11卷积使用,这就导致其分组虽然参数下来了。但是读取时间上升。另一个就是计算的并行能力,这主要来源于架构设计的问题。最后一个就是计算平台对问题。这个不在模型的讨论范围内容。你计算的时候使用相同的平台就行了。但是这确实是影响因素所以还是要考虑以保证试验的公平准确性。

公平公平还是他妈的公平,其主要是对模型有信心的体现,另一个方面是其对模型的改进主要是对真实使用环境的讨论,落地的东西还是要够实在。评定标准一定要更严格,才能实现性能的最大化。

在这项工作中,我们遵循这两个原则并提出了一个更有效的网络架构。在第二节中,我们首先分析了两个代表性的最新网络的运行性能。

个人觉得这很符合逻辑,先按照这样的一套评价系统去测试基准模型才能更好的凸显实验的有效性。要不然何谈公平可言

然后,我们得出了几个高效网络设计的指导原则,这些指导原则不仅仅考虑 FLOPs。

让后讲解其提出的针对实际应用中会影响模型速度的的建议或者是人家研究的发现

虽然这些指导原则独立于平台,但我们在两个不同的平台(GPU 和 ARM)上进行了一系列控制实验,通过专门的代码优化来验证它们,

当然会存在着实验的适用性基于平台架构的问题。所以在通用的平台进行控制变量测试来验证人家提出指导原则的正确性以及严谨性。

第二节针对之前提出的模型进行分析测试,得出自己的研究结论,怎么样才能让模型更好。第三节阐述按照这样的结论设计的模型有效性。

确保我们的结论是最新的。在第三节中,根据这些指导原则,我们设计了一种新的网络结构。因为它是受到 ShuffleNet 的启发,所以称为 ShuffleNet V2。它在两个平台上都通过全面的验证实验被证明比之前的网络更快、更准确,第四节提供了概述对比。例如,在 40M FLOPs 的计算复杂度预算下,ShuffleNet v2 比 ShuffleNet v1 和 MobileNet v2 分别准确 3.5% 和 3.7%。

在引言部分可以的最后介绍了一下文章的主题脉络。旷世基于自己模型的分析改善了模型架构,但是和这个mobilenetV2其理论层面上计算出来比起来感觉没什么优势。但是其性能确实比较好的啊。所以这一顿分析。发现存在诸多因素是影响模型性能的关键,所以才出现了引文中的指标。其最初还是对科研的严谨性,并且其和自身比较试验的公平性都是要考虑的。究其原因都是在前面不断的探索。性能提升肯定是有限。其这一点点提升也是努力的一大步。哪怕性能持平,人家这一顿分析也值得鼓掌。其性能差异的主要来源。也对后面评价模型打个样,确保试验的相对公平性。

当然后续我又看了一下ShuffleNet v1 确实在 v1 的时候人家就讨论过理论和实际的差异性。确实是做落地起家的公司啊,要的就是实打实的性能

最后的最后啊这个写论文他把成果放在了最前面,确实是十分的有必要。言简意赅。我做了什么。效果是啥问题和答案都给出来了。你好奇在看其核心架构问题。很不错。大家一起康康人家的图吧,告诉世界俺就是遥遥领先:请添加图片描述

2.高效指导时间设计

和上一个shufflenet一样。先说发现的的问题解决所在在哪里,最后在将这些发现的问题解决方式如何融合进模型。 那么如何发现问题的呢,你得保证在相同环境下进行测试啊。

我们的研究在两种广泛采用的硬件上进行, 这些硬件的CNN库都经过了行业级别的优化。我们发现,我们的CNN库比大多数开源库更为高效。 因此,我们确保我们的观察和结论对于工业实践是坚实而有意义的。

一个是GPU一个是CPU都是采用常见的,以保证其准确性。“这些硬件的CNN库都经过了行业级别的优化。”这句话的本质就是用的太多了,自然而言就有有人已经对其卷积操作一系列底层做好了优化。而本文所开发的CNN底层代码则更加高效。

  • GPU:我们使用了一块NVIDIA GeForce GTX 1080Ti显卡。卷积库为CUDNN 7.0。我们还启动了CUDNN的基准测试功能,以分别为不同的卷积选择最快的算法。
  • ARM:我们采用了一颗Qualcomm Snapdragon 810处理器。我们使用了一个高度优化的基于Neon的实现。一次评估中使用单线程。其他设置包括:开启了所有优化选项(例如,张量融合,用于减少小操作的开销)。输入图像大小为224×224。每个网络随机初始化并评估100次。使用平均运行时间作为结果。

在引言部分已经说了第二节会讨论ShuffleNet v1和MobileNet
v2的性能。讨论的前提就是建立在一个公平的平台之上。并且人家说了GPU,CPU常见的型号。并且对各种各样的优化选项拉满

为了启动我们的研究,我们分析了两种最新网络,ShuffleNet v1和MobileNet v2在运行时间上的性能。它们在ImageNet分类任务上都非常高效且精确,也广泛用于像手机这样的低端设备上。尽管我们只分析了这两个网络,但我们注意到它们代表了当前的趋势。它们的核心是分组卷积和深度卷积,这也是如ResNeXt、Xception、MobileNet和CondenseNet等其他最新网络的关键组成部分。

上文其主要是寻找一个对比的基准。诚然这部分工作已经做到了构建这样一个基准指标。硬件固定,算法优化全开。库是常用的其他都一样对i性能进行评估。只有这样才能确定到底是不是真的好啊并且人家说了虽然没全部对比,但是其作为分组卷积核深度可分离卷积的大成之作可以代表了当下其他模型的性能水平

请添加图片描述
总体运行时间被拆分为不同的操作,如图2所示。我们注意到,FLOPs指标只计算卷积部分。虽然这部分占用了大部分时间,但==包括数据I/O、数据洗牌和逐元素操作(AddTensor、ReLU等)在内的其他操作也占用了相当多的时间。==因此,FLOPs并不是实际运行时间的准确估算。

这段就说其运行时间其实不全是卷积操作的导致的,其模型读取时间以及data shuffle and element-wiseoperations。这部分都要占用时间,而且可以看到其占用的时间是大多数时间。并不能简单的忽略掉。可以看到其分组卷积构建的shufflenet v1中就对1*1卷积部分进行优化了所以其本质上就是这部分计算时间占比很少显著优于mobilenet。但是其还有通道重排的时间,因此人家这个mobilenet没有,分别在CPU和GPU上都进行了对比。防止对比上的占便宜。谁的架构适合c或者是G。

基于这个观察,我们从几个不同的方面对运行时间(或速度)进行了详细分析,并得出了几条高效网络架构设计的实用指南。

经过上面这几个图大概也能看出来要改善运行速度,还是很清晰的就这几个点可以压缩模型的运行时间。

基于上述几点对其模型速度进行优化呗。读取时间以及data shuffle and element-wise operations

这也是为啥人家叫网络架构设计使用指南。有点像绿皮书。

G1) 相等的通道宽度最小化了内存访问成本(MAC)。 就是对通道形状做出要求:

他为啥叫G1就是guide指导这个单词的缩写,所以下述内容可以看成其分析结果,针对其分析结果提出的指导意见。其后续的设计也是基于此。

现代网络通常采用深度可分离卷积,其中点卷积(即1×1卷积)占据了大部分的复杂度。我们研究了1×1卷积的内核形状。形状由两个参数指定:输入通道数c1和输出通道数c2。设h和w为特征图的空间大小,1×1卷积的。
为B = hwc1c2。卷积计算复杂度

其实这段比较有意思,内核形状。这个1×1本质就是一个全连接啊。输入个数就是输入神经元的个数(输入通道数c1),输出通道个数一方面等于卷积核个数(输出通道数c2)。其本质就是下一个隐藏层神经元的个数被。那么计算复杂度由谁控制,权重个数啊。那不就是说这个c1*c2。为啥还要hw呢,传统的讨论全连接一个神经元对应的一个输入数值,而1×1卷积一个神经元对应一整个通道的数值。你这么多特征传统神经网络是一个输入神经元就一个数值,咱就是说您有hw个数值呢。

为了简化,我们假设计算设备中的缓存足够大,能够存储整个特征图和参数。因此,内存访问成本(MAC),或内存访问操作的数量,为MAC = hw(c1+c2)+c1c2。卷积操作占用内存空间注意,这两项分别对应于输入/输出特征图和内核权重的内存访问。

其实这个MAC计算看起来挺抽象的啊,首先咱们这么想hw是一个通道的特征图大小,你要取出数据hw(c1这面多数据拿出来要用,算完后要将hwc2)存进去。那么参数权重呢你也要拿出来c1c2个。这样一次的1×1卷积就要面对这么大的存取量。c1c2只涉及到取出来。c1c2本身就存好了已经。空间已经分配好了,而hwc2)则要重新分配空间存。来个官方的解释醒醒脑别被我带迷糊了。

  • hw(c1+c2):这部分代表的是在进行1x1卷积操作时,对输入特征图和输出特征图的内存访问。这里的 hw 指的是单个通道的特征图大小,c1 是输入通道数,c2 是输出通道数。因此,对于输入特征图,我们需要从内存中读出 hw
    大小的特征图,共 c1 次(每个输入通道一次)。同理,一旦完成1x1卷积操作,我们还需要将输出特征图(大小为 hw,有
    c2 个通道)写回内存,也就是说每个输出通道存储一次。因此,这部分的MAC主要是由特征图的读写操作决定的。

  • c1c2:这部分代表的是在进行1x1卷积时,对卷积核权重参数的内存访问。对每对输入和输出通道组合,都有一个唯一的卷积核(其实是卷积核中的一个权重,因为是1x1卷积),因此需要访问
    c1c2 次权重参数。这意味着,对于每一维度的输入通道 c1 和每一维度的输出通道 c2,都需要进行一次权重参数的内存访问。

简而言之,hw(c1+c2) 关注的是特征图的读写操作,而 c1c2 主要关注的是卷积核权重参数的访问。结合起来,
MAC = hw(c1+c2)+c1c2 从宏观上给出了进行一次1x1卷积操作所涉及的总内存访问次数,这包括了特征图的读写操作以及卷积核权重参数的读取。

那么问题来了如何有效的控制其读取问题呢MAC = hw(c1+c2)+c1c2的大小,文中引入了均值不等式,接下来解释下这个公式是怎么来的。
请添加图片描述

首先将MA C公式通过B进行替换可以得到:

M A C = h w ( c 1 + c 2 ) + c 1 c 2 = B ( c 1 + c 2 ) c 1 c 2 + B h w MAC = hw(c_1 + c_2) + c_1c_2 = \frac{B(c_1 + c_2)}{c_1c_2} + \frac{B}{hw} MAC=hw(c1+c2)+c1c2=c1c2B(c1+c2)+hwB
对这个公式进行再次整理:
M A C = B ( 1 c 1 + 1 c 2 ) + B h w MAC =B(\frac{1}{c_1}+\frac{1}{c_2} ) + \frac{B}{hw} MAC=B(c11+c21)+hwB
插播一下什么是均值不等式:请添加图片描述

对公式的 ( 1 c 1 + 1 c 2 ) (\frac{1}{c_1}+\frac{1}{c_2} ) (c11+c21)使用均值不等式替换,可得到:
1 c 1 + 1 c 2 2 ≥ 1 c 1 ⋅ 1 c 2 \frac{\frac{1}{c_1}+\frac{1}{c_2} }{2} \geq \sqrt{\frac{1}{c_1} \cdot\frac{1}{c_2} } 2c11+c21c11c21
两侧同时乘2:
1 c 1 + 1 c 2 ≥ 2 1 c 1 c 2 {\frac{1}{c_1}+\frac{1}{c_2} }\geq 2\sqrt{\frac{1}{c_1c_2} } c11+c212c1c21
再次使用B进行替换:
1 c 1 + 1 c 2 ≥ 2 1 B / h w {\frac{1}{c_1}+\frac{1}{c_2} }\geq 2\sqrt{\frac{1}{B/hw} } c11+c212B/hw1
再来
1 c 1 + 1 c 2 ≥ 2 h w B {\frac{1}{c_1}+\frac{1}{c_2} }\geq 2\sqrt{\frac{hw}{B} } c11+c212Bhw
根据下面的均值不等式,我们有公式(1)
将这部分带入到原来的公式中
M A C = B ( 1 c 1 + 1 c 2 ) + B h w MAC =B(\frac{1}{c_1}+\frac{1}{c_2} ) + \frac{B}{hw} MAC=B(c11+c21)+hwB
可得到
M A C ≥ B ( 2 h w B ) + B h w MAC\geq B(2\sqrt{\frac{hw}{B}})+ \frac{B}{hw} MACB(2Bhw )+hwB

最终化简即可得到
请添加图片描述

透过这样公式可以直观的看到MAC的计算主要来源于,hw特征图的大小和B的取值问题,hw特征图的大小本质上是不可控的,可控的情况下其实大多数模型在这部分都会进行修改,其真正影响模型MAC大小存在着这样的一个下界,即B决定,1*1卷积核的复杂程度,因此降低网络的存储效率主要是通过降低B的数值问题。在什么时候B的数值问题能达到最低,当然我们是动态平衡不是单纯的将c1和c2都设定成1这就变的毫无意义

因此,MAC有一个由FLOPs给出的下限

当输入和输出通道数相等时,达到这个下限。

可以看下b的构成hwc1c2就是说这个数值为其相同时最低

==文中指出这个下限就是保持其通道数一致,但是为什么不是降低维度呢?==上文中已经传达了这样的一个思想。B在输入输出通道相同时达到最小。那么问题就是为什么不让一个数值变得足够小呢。试问构建网络就是为了性能啊,在保证性能的同时尽量构建相同桶装结构的网络才能保证性能和速度的和谐。

这个结论是理论上的。在实践中,许多设备上的缓存不够大。此外,现代计算库通常采用复杂的阻塞策略,以充分利用缓存机制。

文中再次提到,理论上能这么大存储能力的还是很少的设备,因此都采用了一定的缓存策略,这同样也占用时间。因此人家进行实验验证这一计算方法

因此,实际的MAC可能与理论上的不同。为了验证上述结论,进行了以下实验。通过重复叠加10个构建块来构建一个基准网络。每个块包含两个卷积层。第一个包含c1输入通道和c2输出通道,第二个则相反。

其实可以看这个实验只是用到了1*1卷积测试下处理的时间,本质上是不传播的单纯的比计算速度 人家这里看起来好像是卷积核个数不同,但是FLOP是一致的,比如128128的参数你用90128实际上得到的数值差不多。在参数量相同的情况下,就是说筒状结构更快

请添加图片描述
表1通过在固定总FLOPs的情况下变化c1:c2比例来报告运行速度。很明显,当c1:c2接近1:1时,MAC变小,网络评估速度变快。

G2) 过多的分组卷积会增加MAC。 对分组情况做出要求
分组卷积是现代网络架构的核心。通过将所有通道间的密集卷积变为稀疏的(仅在通道组内部进行),它降低了计算复杂度(FLOPs)。一方面,这允许在给定的FLOPs下使用更多的通道,并增加了网络的容量(从而提高准确性)。然而,另一方面,通道数量的增加导致了更高的MAC

会增加存储通道数据的吞吐量

正式来说,根据G1中的记号和方程式1,1x1分组卷积的MAC和FLOPs之间的关系为

M A C = h w ( c 1 + c 2 ) + c 1 c 2 g MAC = hw(c_1 + c_2) +\frac{ c_1c_2}{g} MAC=hw(c1+c2)+gc1c2

这个公式就是之前的卷积核参数个数是 c 1 c 2 c_1c_2 c1c2现在进行分组卷积了,需要对c_1输入的特征通道进行分组即使每组卷积接收到的通道只有 c 1 g \frac{ c_1}{g} gc1个。输出通道为了仍然满足 c 2 c_2 c2个则每组的指标为 c 2 g \frac{ c_2}{g} gc2个但是,最终计算的是全部组的要✖️g所以最终形态如上述公式一致

最终对这个公式化简:
M A C = h w c 1 + B g c 1 + B h w MAC =hwc_1 + \frac{Bg}{c_1} + \frac{B}{hw} MAC=hwc1+c1Bg+hwB
其中g是分组的数量, B = h w ⋅ c 1 ⋅ c 2 g B = \frac{hw \cdot c_1 \cdot c_2}{g} B=ghwc1c2是FLOPs。很容易看出,给定固定的输入形状 c 1 × h × w c_1 \times h \times w c1×h×w和计算成本B,随着g的增加,MAC也随之增加。
请添加图片描述
为了在实践中研究这一影响,构建了一个由10层点对点分组卷积层堆叠的基准网络。表2报告了在固定总FLOPs的情况下,使用不同分组数量时的运行速度。很明显,使用较大的分组数量会显著降低运行速度。例如,在GPU上使用8组比使用1组(标准密集卷积)慢了2倍多,在ARM上慢了30%。这主要是由于MAC的增加。我们注意到,我们的实现已经经过特别优化,比逐个计算分组卷积要快得多。

因此,我们建议基于目标平台和任务谨慎选择分组数量。仅仅因为这可以使用更多的通道,而使用大的分组数量是不明智的,因为准确性的提高很容易被迅速增加的计算成本所抵消。

在上述计算的部分已经展示了分组数量确实影响了Mac的存储速度因此整体性能确实由分组数量影响,其文中首先就阐述了其主要观点,分组会增加通道数量,并切同时存的图就变多了。而相同的参数量设定在传统的1*1卷积网络下是构建不出来这么多的特征图的。并且后续会不断的在这么多的图下进行存取,层数越多其占用时间越大。

G3) 网络碎片化降低了并行度。 模型采用并行多路径设定
在GoogLeNet系列和自动生成的架构中,广泛采用了每个网络块中的“多路径”结构。许多小型运算符(这里称为“碎片化运算符”)被用来代替少数大型运算符。例如,在NASNET-A中,单个构建块中碎片化运算符的数量(即单个卷积或池化操作的数量)是13。相比之下,在像ResNet这样的常规结构中,这个数字是2或3。

虽然这种碎片化结构已被证明有利于提高准确性,但它可能会降低效率,因为它对于具有强大并行计算能力的设备(如GPU)并不友好。它还引入了额外的开销,如内核启动和同步。

为了量化网络碎片化如何影响效率,我们评估了一系列具有不同碎片化程度的网络块。具体来说,每个构建块由1到4个1x1卷积组成,这些卷积是顺序排列还是并行排列的。块结构在附录中有说明。每个块重复叠加10次。表3中的结果显示,碎片化在GPU上显著降低了速度,例如,4碎片结构比1碎片结构慢3倍。在ARM上,速度减少相对较小。

这段就是说通过
类似于GoogLeNet系列中通过多种小的卷积核去拟合大的复杂的卷积核从而有效的降低模型的复杂度。但是这样的模型设计本质上不利于模型的并行计算。
您在深度学习网络中使用较小的卷积核(即碎片化结构)代替较大的卷积核确实可以减少模型的计算复杂度,因为它减少了网络参数的数量和相对应的浮点操作次数(FLOPs)。例如,通过分解一个大卷积层为多个小的1x1卷积层或采用分组卷积策略,可以有效地降低网络的计算需求,同时也有可能提高模型的表示能力。

然而,这种碎片化结构可能不太适合高度并行化的硬件架构,比如GPU。GPU是设计来同时处理大量计算任务的,因此在处理大量小运算时,可能会遇到一些效率问题,如:

  • 内核启动开销:每一个独立的卷积操作都需要启动一个新的计算核心(内核)。如果有很多小的卷积操作,这种启动开销会累积,并可能成为一个瓶颈。
  • 同步与管理开销:多个小运算单位之间可能需要进行数据同步,特别是在多路径结构中。这些同步操作会增加额外的时间开销。
  • 并行度下降:在一些情况下,由于GPU的计算单元无法被充分利用,高度碎片化的结构可能导致并行度下降,这意味着GPU的强大计算能力不能被充分发挥出来。

因此,尽管通过使用小的卷积核以减少计算复杂度这一策略在理论上能够改进模型性能并减少资源需求,但在实践中,设计深度学习网络时还需要考虑目标硬件平台的特性。特别是对于需要在GPU等并行计算资源上运行的网络,选择适当的碎片化程度变得尤为重要,以确保既能利用碎片化带来的计算优势,又不会因为碎片化过度而损失过多的并行计算效率。

G4) 逐元素操作不容忽视。
如图2所示,在轻量级模型中(例如[15, 14]),逐元素操作占用了相当一部分时间,特别是在GPU上。这里,逐元素操作包括ReLU、AddTensor、AddBias等。它们的FLOPs较小,但相对而言MAC较高。特别地,我们还将深度卷积视为逐元素操作,因为它同样具有较高的MAC/FLOPs比率。

为了验证,我们使用了ResNet中的“瓶颈”单元(1x1卷积后接3x3卷积,然后是1x1卷积,伴有ReLU和快捷连接)进行了实验。分别移除了ReLU和快捷操作。不同变体的运行时间在表4中报告。我们观察到,在去除了ReLU和快捷操作之后,无论在GPU还是ARM上,都获得了约20%的速度提升。

这段内容描述了在一个实验中,研究者移除了 ResNet 中 “瓶颈” 单元里的激活函数(具体是 ReLU 函数)和残差连接(shortcutconnection)。这项实验旨在验证这些逐元素操作对网络执行效率的影响。 在 ReLU 和残差连接被移除后,实验结果显示,在 GPU 和ARM 这两种计算平台上,模型运行速度都获得了大约 20% 的提升。这个结果表明,尽管这些逐元素操作在网络中扮演重要角色(例如 ReLU提供非线性,残差连接帮助训练深层网络),但它们也同样引入了额外的计算和内存访问成本,这在特定硬件上可能会影响模型的执行效率。

结论与讨论:基于上述指导原则和经验研究,我们得出结论,
一个高效的网络架构应该:

  1. 使用“平衡”的卷积(相等的通道宽度);
  2. 注意使用分组卷积的成本;
  3. 减少碎片化程度;
  4. 减少逐元素操作。

这些理想的属性取决于平台特性(如内存操作和代码优化),这些都超出了理论FLOPs的范畴。在实际网络设计时,应该考虑到这些因素。

近期在轻量级神经网络架构中的进步[15,13,14,9,11,10,12]主要基于FLOPs的指标,并没有考虑上述属性。

有点类似于人家开辟了一个新的赛道。但是确实人家对这部分研究确实领先啊,你们还在卷比分,我都已经自成一派了

例如,ShuffleNet v1[15]大量依赖分组卷积(违反了G2指导原则)和瓶颈状的构建块(违反了G1指导原则)。MobileNet v2[14]使用了反向瓶颈结构,违反了G1指导原则。它在“厚”特征图上使用深度卷积和ReLUs,违反了G4指导原则。自动生成的结构[9,11,10]高度碎片化,违反了G3指导原则。

首先骂自己这个用了分组卷积太多,也是增加MAC的存储量不利于速度。骂别人你反向瓶颈结构没遵循相同的筒状结构,后面深度卷积增加了通道个数从而 存特征图都变多了,你让特征图变厚激活部分也在增加。nas的问题就死活高度碎片化,这个就是并行小结构太多;

接下里啊重头戏,当当当当自己设计的模型闪亮登场,这要没点优越的性能,还真扛不住这么骂人🤬

3. ShuffleNet V2: an Efficient Architecture

首先哈人家这个名字一个高效架构,哈哈哈哈哈太强了,真实一点也不收敛。其实国外期刊这么投有料确实很直观的表述,不藏着掖着。都展示展示

ShuffleNet v1的回顾:ShuffleNet是一种先进的网络架构,广泛应用于低端设备,如手机。它启发了我们的工作。因此,首先对其进行回顾和分析。

根据[15],轻量级网络的主要挑战是,在给定的计算预算(FLOPs)下,只能负担有限数量的特征通道。为了在不显著增加FLOPs的情况下增加通道数量,[15]采用了两种技术:点群卷积(pointwise group convolutions)和瓶颈式结构。然后引入了“通道混洗”操作,以实现不同通道组之间的信息通信并提高准确性。构建块如图3(a)(b)所示。

说人话就总结一下ShuffleNet的工作1*1分组卷积。残差结构和通道冲排

正如第2节中讨论的,点群卷积和瓶颈结构都会增加MAC(G1和G2)。这种成本不可忽略,特别是对于轻量型模型。使用过多的群组也违反了G3。快捷连接中的逐元素“Add”操作也是不可取的(G4)。因此,为了实现高模型容量和效率,关键问题在于如何在不使用密集卷积或过多群组的情况下,保持大量且等宽的通道。

我觉得有一个比较好的形容就是带着镣铐跳舞,又要马儿🐎跑又不让马儿吃草,那你就发明一个电动马呗

防止大家遗忘这四个镣铐咱们再看看这几个铁律:

  1. 使用“平衡”的卷积(相等的通道宽度);
  2. 注意使用分组卷积的成本;
  3. 减少碎片化程度;
  4. 减少逐元素操作。元素级别的操作就是激活函数和残差连接

上文都讨论过了,分组的 1 ∗ 1 1*1 11卷积会增加mac值。因此在保证能够有一定量的通道并且等宽的前提下能够少使用分组 1 ∗ 1 1*1 11卷积。这是这项研究的关键。
还要分组还要使用1*1卷积,这怎么办啊
人家的解决方式就是使用通道分离这个操作。加入一个特征图厚度是4分出一半出来这不就是分组了嘛。那么卷积也不用分组卷积就用深度可分离吧,最终将一半特征通道进行卷积,一半没操作的通道进行concat 变回去这不就是相当于一次分组卷积吗。为了防止分组卷积的近亲繁殖现象。人家最后concat后加了一个通道重排,首先人家设计这个模块严格罪受通道输入和输出是一致的大小。其次人啊集没用分组卷积仅仅是用了通道分离操作就实现了类似分组卷积的作用。G1G2都满足了。可以说是很厉害了。后续的G3人家说了resnet就做的很好,所以人家在模型块内并行这部分仅用到了两个通道一个是直连一个是三层卷积。,咱们回过头来看论文,实际上以上就是这个论文的改进核心。牛就牛在这个通道分离在用残差concat这就完全满足了G12并且人家这个通道重排安排在了后面还不会出现近亲繁殖运算量还少。
看下图其实没什么普通的有些模块还是老样子,有些则是抛弃了分组卷积改成了传统的 1 ∗ 1 1*1 11卷积唯一不同的就是黄色的通道分离操作。

请添加图片描述
通道分割和ShuffleNet V2: 为了达到上述目标,我们引入了一个名为通道分割的简单操作符。如图3©所示。在每个单元的开始,将c个特征通道的输入分为两个分支,分别具有c - c0和c0通道。

就是部分通道卷积呗,直接省略掉不让一部分通道卷积。减少卷积计算成本啊。分割后还达到了分组效果。

遵循G3,一个分支保持为身份。

就是这个通道分离操作有两个好处

G3不要过多碎片化的并行行为人家采用这个通道分离类似于resnet结构仅有两个并行模块确实并没有通过各种各样的卷积核去拟合。

另一个分支由三次卷积组成,输入和输出通道相同,以满足G1。

这部分指的是分支卷积的部分输入输出的通道都是一致的

第二个好处就是人家这个又能够类似于分组卷积,一半通道被卷积了一半直接连接,如果要是类别全连接就是一部分连接成功被稀疏了,减少运算量

两个1×1的卷积不再是分组的,不同于[15]。这部分是为了遵循G2,部分是因为分割操作已经产生了两个组。

人家内部由于使用通道分割其实使用正常的1*1卷积就能进行操作了,同样人家也满足了G2少用分组卷积

卷积后,两个分支被连接起来。因此,通道数量保持不变(G1)。

这个部分指的是模型块的输入输出通道数量

然后使用与[15]中相同的“通道混洗”操作,以实现两个分支之间的信息通讯。混洗后,下一个单元开始。

注意,在ShuffleNet v1中的“Add”操作不再存在。逐元素操作如ReLU和深度卷积只存在于一个分支中。此外,三个连续的逐元素操作,“Concat”、“Channel Shuffle”和“Channel Split”,被合并成一个单一的逐元素操作。根据G4,这些更改是有益的。

其实这部分为了减少按元素操作的代价,所以取消了残差结构中的Add取而代之的单纯的堆叠起来即concat “Concat”、“Channel
Shuffle”和“Channel Split”,被合并成一个单一的逐元素操作。这句话的意思就是被同时处理,减少分开的让一件事情做很多次。

对于空间下采样,单元稍作修改,并在图3(d)中说明。移除了通道分割操作符。因此,输出通道的数量翻倍。
这个就是说人家后续的下采样块中没用残差结构而是将一个特征图被两个卷积分支卷积的结构进行堆叠,这很符合卷积后期特征图越来越厚并且越来越小,容易接上全连接层

提出的构建块©(d)以及由此产生的网络被称为ShuffleNet V2。基于上述分析,我们得出结论,这种架构设计极其高效,因为它遵循了所有的指导原则。

构建的上述各种块被反复的堆叠使用在网络中

构建块被反复堆叠以构建整个网络。为了简化,我们设置c0 = c/2。整体网络结构类似于ShuffleNet v1[15],并在表5中总结。只有一个区别:在全局平均池化之前增加了一个额外的1×1卷积层,以混合特征,这在ShuffleNet v1中不存在。类似于[15],为了生成不同复杂度的网络,每个块中的通道数量按比例缩放,标记为0.5x、1x等。

网络准确性分析:Shufflenet v2不仅高效,而且准确。主要有两个原因。首先,每个构建块的高效性使得使用更多的特征通道和更大的网络容量成为可能。其次,在每个块中,一半的特征通道(当c0 = c/2时)直接通过该块并加入下一个块。这可以被视为一种特征复用,在与DenseNet[6]和CondenseNet[16]类似的精神中。

4.实验

我们在ImageNet 2012分类数据集上进行了削减实验。遵循常见实践,所有对比网络有四个级别的计算复杂度,即约40、140、300和500+ MFLOPs参数量四种规模的不同。这种复杂度对移动场景来说是典型的。其他超参数和协议与ShuffleNet v1完全相同。

我们与以下网络架构进行了比较:

  • ShuffleNet v1,在该工作中,比较了一系列的群组数量g,建议g=3在准确性和速度之间有更好的折衷。这也与我们的观察一致。在这项工作中,我们主要使用g=3。
  • MobileNet v2,它优于MobileNet v1。为了全面对比,我们报告了原论文和我们重新实现的准确率,因为[14]中的一些结果不可用。
  • Xception,原始Xception模型非常大(FLOPs>2G),超出了我们的比较范围。最近的工作提出了一个修改过的轻量级Xception结构,在准确性和效率之间表现出更好的折衷。因此,我们与这个变体进行了对比。
  • DenseNet,原始工作只报告了大型模型的结果(FLOPs>2G)。为了直接比较,我们按照表5中的架构设置重新实现了它。
  • 请添加图片描述

准确率 vs. FLOPs. 很明显,提出的ShuffleNet v2模型在所有网络中表现最佳,尤其是在较小的计算预算下。此外,我们注意到在40 MFLOPs级别上,MobileNet v2在224x224图像尺寸下表现不佳。这可能是因为通道太少所致。相反,我们的模型没有这个缺点,因为我们高效的设计允许使用更多的通道。

推断速度 vs. FLOPs/准确率。对于四种准确率较好的架构,我们比较了它们的实际速度与FLOPs,如图1©(d)所示。
请添加图片描述
ShuffleNet v2明显比其他三个网络更快,尤其是在GPU上。例如,在500MFLOPs时,ShuffleNet v2比MobileNet v2快58%,比ShuffleNet v1快63%,比Xception快25%。在ARM上,ShuffleNet v1、Xception和ShuffleNet v2的速度相当;然而,MobileNet v2要慢得多,尤其是在较小的FLOPs上。我们认为这是因为MobileNet v2有更高的MAC。

与MobileNet v1、IGCV2和IGCV3比较时,我们有两个观察。首先,尽管MobileNet v1的准确率不如其他模型,但其在GPU上的速度比所有对手都快,包括ShuffleNet v2。其次,IGCV2和IGCV3较慢,这是由于使用了太多的卷积群组。

最近,自动模型搜索成为CNN架构设计的一个有希望的趋势。我们发现自动生成的模型速度相对较慢,主要是由于使用了太多的碎片。尽管如此,这个研究方向仍然很有前景。但是这个nasnet确实不是普通人玩的,跑模型都是问题怎么会用来生成模型啊

最后,图1(a)(b)总结了准确率与速度的结果。我们得出结论,在GPU和ARM上,ShuffeNet v2表现最佳。ShuffeNet v2可以与其他技术结合以进一步提高性能。使用Squeeze-and-Excitation (SE)模块,ShuffleNet v2的分类准确率提高了0.5%,但速度有所下降。

ShuffleNet v2也可以用于大型模型。我们将50层ShuffleNet v2与ShuffleNet v1和ResNet-50进行了比较。ShuffleNet v2仍然表现更好,并且使用了40%较少的FLOPs。

我们还在COCO对象检测任务上测试了ShuffleNet v2的泛化能力。使用最先进的轻量级检测器——Light-Head RCNN作为框架。ShuffleNet v2与其他三个轻量级模型比较,表现最佳。

5.总结

在本章中,讨论了轻量级网络模型 ShuffleNet 及其升级版本 ShuffleNet V2,探讨了它们在实际应用中的高效性。ShuffleNet 的核心在于采用分组卷积、瓶颈式结构和通道混洗操作,实现了在有限的计算预算下增加通道数量而不显著增加 FLOPs 的目标。

然而,通过对 ShuffleNet v1 和 MobileNet v2 等现代轻量级网络的分析,本文揭示了 FLOPs 这一间接复杂度指标不能全面反映模型的实际运行效率,尤其是在 GPU 等并行计算资源丰富的平台上。内存访问成本(MAC)、并行度和平台特性等因素同样对模型性能有重要影响。从而旷世团队提出了ShuffleNet V2 在 ImageNet 分类和 COCO 对象检测等任务上展现了卓越的性能,超越了当前多数轻量级网络模型,证明了它是一个既高效又准确的网络架构。下一阶段本专栏将会对代码部分实战操作解释,便于各位的理解和学习。有什么问题欢迎各位评论区私信讨论栓q。


http://www.kler.cn/news/339887.html

相关文章:

  • c++ 计算同一行上的最大点数(Count maximum points on same line)
  • 微信小程序 实现下拉刷新功能
  • CSS调整元素大小
  • 第3天:Android应用组件
  • Bean的实例化方式
  • 图解 Transformer
  • 基于Kafka2.1解读Producer原理
  • 【LeetCode刷题记录】45.跳跃游戏 II
  • 45岁被裁员的程序员,何去何从?
  • 等保测评:企业如何进行安全的软件更新与补丁管理
  • 如何设计三极管放大电路?
  • 上海AI Lab视频生成大模型书生.筑梦环境搭建推理测试
  • 正则表达式【JavaScript】
  • Spring Boot快速入门:HelloWorld示例
  • UI自动化测试示例:python+pytest+selenium+allure
  • SDUT数据结构与算法第一次机测
  • SQLITE 构建多表查询
  • UE4 材质学习笔记03(翻书(Flipbook)动画/环境混合)
  • JUC高并发编程6:Callable接口
  • 海报设计模板免费的好用吗?活动海报排版技巧轻松get