大规模 CNN(卷积神经网络)是许多最先进的计算机视觉算法中最基本的部分,可在各种任务中实现高精度。这种网络的架构往往非常深,因为它们具有大量参数。所有的参数,数以百万计,数以亿计,权重冗余度高,使用巨大的计算资源。由于其对计算和硬件的高要求,在内存和计算资源有限的嵌入式和移动设备上部署此类模型变得非常困难。为了解决这个问题,已经进行了研究,以使用各种技术(如修剪、神经架构搜索、量化和知识蒸馏)来减小模型的大小。Learning to Prune Filters in CNNs论文并使用混合精度量化论文中的量化来减少模型大小和计算量。
1、学习在 CNN 中修剪过滤器
修剪过滤器的单个权重会导致 CNN 的稀疏性增加,这需要专门设计的软件或硬件来处理它。本文介绍了一种数据驱动的方法来修剪过滤器,基于其对模型整体准确性的贡献。他们将这种方法制定为“尝试和学习”任务,其中每个修剪代理(由神经网络建模)将过滤器权重作为输入,并输出关于保留过滤器的二元决策(是/否)。
Eq 1. 奖励函数(基于选择的二元动作和验证集)
每个剪枝代理都使用新的奖励函数 (Eq 1) 进行训练,该函数是准确度项和效率项的乘积。这种奖励功能可以轻松控制网络性能和规模之间的权衡。奖励函数的准确度项(等式 3)由一个下限参数“b”组成,它确保修剪过滤器后的准确度下降不超过阈值,并且还提高了更高的准确度。效率项是模型中过滤器总数与修剪代理保留的过滤器数量之比的对数(如公式 2 所示);这有利于更高的修剪。由于奖励函数相对于剪枝代理的参数不可微,因此在训练时使用策略梯度更新来修改参数。
Eq 2. 效率项,这里 N 表示第 l(th) 层中的过滤器数量,C(.) 是保留过滤器的数量
Eq 3. Accuracy Term,这里 p* 和 p^ 是基线和修剪模型的性能,b 是下降界限。M 是使用的度量(识别中的分类准确度和分割任务中的全局准确度)
该论文的作者评估了他们的模型在图像分割和视觉识别这两个任务中的性能。对于视觉识别任务,他们以两种方式进行了实验。首先,他们单独训练每一层的剪枝代理,然后一起训练所有卷积层的代理。图 1 显示了在 CIFAR-10 数据集上训练的 VGG-16 网络上的单个层剪枝结果,其精度下降边界 b = 2。从图中,我们可以观察到我们可以修剪高达 99.4% 的层精度下降非常小(0.5%)(第 10 层和第 11 层)。
为了单独修剪过滤器,它们从已经在数据集上训练的基线模型 (f) 开始,然后根据神经修剪代理为每个权重选择的动作对其进行修剪。层中权重的动作是随机初始化的,并在我们评估动作的奖励函数和基于策略梯度方法的精度下降时通过迭代学习。在对基线网络进行手术后,网络再次在数据集上进行微调,以适应剪枝动作。对网络的每一层重复此过程。在所有层一起修剪的情况下,我们从“L”层网络的 L 修剪代理开始,一个用于网络中的每个卷积层和一个基线网络。在这种情况下,他们遵循跨层的单层修剪方法。随着我们在网络中深入,基线网络不会重新初始化,并且来自早期层的修剪网络被带到更深层以进一步修剪。在每一层修剪之后,模型在训练数据集上进行微调以补偿性能下降。下面的图 2 显示了 VGG-16 在 CIFAR-10 数据集上的这个过程的结果,下降边界为 2。我们可以在此处观察到,每一层的修剪比其单层修剪对应物少一点,但仍然具有攻击性.
网络性能和规模之间的权衡由下拉参数“b”提供。不同b值的实验如图 3 所示,结果如图 4 所示。从中可以看出,较大的 drop bound 给出了更高的剪枝率,更多节省的 FLOP(浮点运算),更高的 GPU和 CPU 加速,以及测试集上更大的准确度下降。此外,我们可以看到,对于数据驱动的剪枝,在与基于幅度的剪枝相同的剪枝率下,VGG-16 网络上的精度下降较低。
在 ResNet-18 网络上使用 CIFAR-10 数据集进行了类似的实验,该数据集比 VGG-16 更大、更复杂。据观察,修剪率比 VGG-16 中的更小(仍然显着),这是因为 ResNet-18 是一种更有效的网络架构。结果表明,在残差块中,第一个 Conv 层比第二个更容易修剪;这也可以在图 5 中看到(7th/9th/12th/14th — 第一层,8th/10th/13th/15th — 第二层)。
对于语义分割任务,在具有 Pascal VOC 数据集的 FCN-32s 网络和 CamVid 数据集上的 SegNet 网络上进行了实验。为分割任务定义的网络基于像素级标记过程,这需要更多的权重和表示能力,因此更难以修剪。用于评估模型的指标是全局像素精度,下降边界b设置为 2。从图 6 中,我们可以看到,对于 SegNet 网络,有一个负的精度下降,这意味着精度的提高,这有利于奖励函数中的准确度项。这是由于修剪导致网络的过度拟合减少。
从下图可以看到一个有趣的结果,它显示了 SegNet 在 CamVid 数据集上的修剪结果,即使网络是对称的,网络的较深一半也有更多的冗余过滤器需要修剪。据观察,下半年去除了 49.2% 的过滤器,而上半年去除了 26.9%。
2、通过可微神经架构搜索实现混合精度量化
量化是另一种压缩模型大小的技术,它使用较小的位以较低的精度(< 32 位)将滤波器权重存储在卷积层中。之前考虑了 CNN 每一层中所有激活和权重的相同精度。本文首先介绍了对不同层具有不同精度(位宽)的想法。从N层和每层M候选精度的 CNN 开始,我们希望找到最佳精度分配,以减少模型大小、内存占用和计算次数,同时保持精度下降最小。这将花费 O(M^N) 时间来搜索指数;因此,他们引入了一种新方法来有效地解决这个问题。
在这个方法中介绍了可微神经架构搜索 (DNAS) 框架,该框架将架构搜索空间表示为一个随机“超网”,它是一个 DAG(有向无环图),其节点代表 CNN 的中间数据张量(特征图)和边表示网络的运算符(卷积层),如图 1 所示。因此,任何候选架构都可以是该超级网络的子图。图的任何边都是随机执行的,执行概率由一些架构参数参数化。因此,我们需要找到提供最有希望的准确性的最佳架构参数,然后可以从找到的最佳参数中对网络进行采样。通过使用 SGD(随机梯度下降)在网络权重和架构参数方面训练超级网络来找到最佳架构参数。由于边缘执行由一组离散值控制,作者使用 Gumbel Softmax 函数来“软控制”边缘,这有助于计算架构参数的梯度估计,并在偏差和方差之间进行可控权衡。
Eq 1. 超网 vⱼ 中的一个节点被写为所有传入边 vᵢ's 与掩码变量 mᶦʲ 的总和。
在 DNAS 框架中,数据张量(节点 vⱼ)是通过将来自先前节点(vᵢ's)的所有传入边与掩码变量相加来计算的,这已在上面的等式 1 中显示。掩码变量m是一个“边缘掩码”,用于决定将在候选网络中执行的边缘。本文开始时将边缘掩码设为离散值 {0,1},并且特定节点的所有掩码总和为 1,这确保仅执行 1 个边缘。超级网络通过使用等式 2 中给出的概率分布随机执行边缘来实现随机化。这将架构搜索的问题归结为找到最佳架构分布参数 θ 以最小化预期损失函数。使用架构参数 θ,我们可以通过从 P_θ 中采样得到候选架构。
Eq 2. 为每条边分配一个参数 θ ij k 以便从 P_θ 中采样执行边 eᵢⱼ 的概率
方程 3. 梯度的蒙特卡罗估计,其中 aᵢ 是从分布 P_θ 采样的架构,B 是批量大小。
当我们尝试求解最优架构参数 θ 时,我们尝试使用 Monte Carlo 方法(在方程 3 中给出)估计损失函数的梯度,我们发现存在高方差,因为架构空间大小是数量级大于任何可行的 Batch 大小B。梯度的高方差使得 SGD 难以收敛。这个问题是通过使用 Gumbel Softmax 来控制边缘选择来解决的,而不是应用“硬采样”,我们使用“软采样”来选择两个节点之间执行的边缘。这使得掩码向量变量是连续的并且可以直接对 θ 微分,并且没有梯度通过 gᶦʲ 传播(等式 4)。
Eq 4. 使用 gumbel softmax 计算掩码,这里 τ 是温度系数。
温度系数 τ 呈指数衰减。这很有帮助,因为在训练开始时,我们需要具有低方差的梯度,这受到高 τ 值的青睐,从而使m的分布均匀。随着训练的进行,τ 减小,这使得m的分布越来越离散。在训练快结束时,通过离散选择边缘来实现更高的方差是有利的。这有助于温度系数的退火。该管道在开始时用作DARTS(一起训练整个网络),最后用作ENAS(要独立训练的样本子网络)。这里有 2 个参数需要训练w和θ它们是交替和分开训练的。w优化所有候选边,而θ优化选择性能更好的边缘并抑制性能较差的边缘的概率。因此w被训练了几个额外的时期(N_warmup),以便在训练θ 之前得到充分的训练。
针对混合精度量化的问题,DNAS 框架创建了一个具有相同宏观结构(层数和每层滤波器数)的随机超网。使用的损失函数在下面的等式 5 中给出,其中 Cost(a) 表示候选架构的成本(基于选择的权重和激活精度),C(.) 用于平衡交叉熵项和成本(它可以根据选择的超参数偏爱一个)。
Eq 5. 混合精度量化的损失函数
在具有不同网络架构的两个数据集(CIFAR-10 和 ImageNet)上进行了实验。ResNet{20,56,110} 仅在权重上进行量化,并为激活保持全精度,并且在块级别进行搜索,块中的所有层都获得相同的精度。这个实验是在 CIFAR-10 数据集上完成的,按照惯例,第一层和最后一层没有被量化。精度是从 {0, 1, 2, 3, 4, 8, 32} 中选择的,其中 0 表示忽略该块,输入与输出相同,32 表示该块使用全精度。该实验的结果如下图2所示。
CIFAR10 数据集上 ResNet 的混合精度量化。我们在 ResNet{20, 56, 110} 上报告结果。在表中,精度为“Acc”,压缩率为“Comp”。
从上面的结果中,我们可以观察到 DNAS 框架有助于更有效地搜索解决方案,因为总体精度结果更好。此外,所有 Most Accuracy 模型在将模型压缩 11.6x — 12.5x 的同时具有更高的 0.37% 精度,最有效的模型可以实现 16.6x–20.3x 模型大小压缩,精度下降小于 0.39%。从图 3 中我们可以看到,对于最高效的网络,第三个块(在第 1 组中)的精度为 0,这意味着它被跳过了。
ResNet20 最准确与最高效架构的分层位宽
ResNet{18,34} 使用 imagenet 数据集进行量化。他们进行了 2 种不同类型的实验,一种是压缩模型大小,他们只量化权重,另一种是压缩计算成本,他们量化权重和激活。模型压缩的结果如图 4 所示,计算压缩的结果如图 5 所示。DNAS 非常高效,使用 8 个 V100 GPU 在 ResNet 18 上完成对 ImageNet 的搜索不到 5 小时。
ImageNet 上 ResNet 的混合精度量化,用于模型大小压缩。
ImageNet 上 ResNet 的混合精度量化,用于计算成本压缩。“arch-{1, 2, 3}”是按准确度排名的三个搜索架构。
从上图 中可以观察到与图 2 非常相似的情况,DNAS 框架优于全精度对应物,并且最准确模型具有比具有 2 (TTQ) 和 3 (ADMM) 位固定精度的计数器更高的精度。从图 5 中我们可以看到,最准确的架构(arch-1)与压缩率为 40 倍的全精度模型具有非常相似的准确度。arch-2 的压缩率与 PACT、DoReFa、QIP 相似,但精度更高。Arch-3 比 GroupNet 具有更高的压缩率和更高的准确度。
小结
随着对任何 ConvNet 的深入研究,过滤器会不断从数据中学习冗余信息,并且可以将更深的层修剪 90% 以上,而不会损失手头任务的太多准确性,但搜索需要很多时间.
为每一层存储全精度的权重和激活是一种过度杀伤,实验表明,单独的 DNAS(全精度)提高了模型的精度,量化导致了更好的精度他们最准确的模型,并且在他们最有效的模型中下降很少。
模型压缩、模型修剪、量化、神经架构搜索和知识蒸馏等有很多不同的方法,这是一项非常实验性的任务。
DNAS 是一种通用架构搜索框架,不限于混合精度量化问题,可用于不同的应用。
数据驱动的剪枝比基于权重大小或 L1 范数的剪枝效果更好。
“尝试学习”算法本身并不是很有效。我们需要一种方法将整个网络的修剪制定为更高自动化的学习任务,目前它是一项长期运行的顺序任务。
参考
学习在卷积神经网络中修剪过滤器[2018]
通过可微神经架构搜索对卷积网络进行混合精度量化[2018]