什么是稀疏动量网络(加速训练)

稀疏动量:训练稀疏网络的有效方法

关于神经网络的快速训练,我们在整个训练过程中都会保持稀疏。我们表明,通过开发稀疏动量算法,我们可以使用稀疏随机权重初始化神经网络,并将其训练为密集的性能水平-所有这些都仅需执行一次训练即可。此外,如果我们使用优化的稀疏卷积算法,则可以将VGG的训练速度提高到3.5倍,而将宽残差网络的训练速度提高到12倍。
这与计算昂贵的方法形成了鲜明的对比,其他工作使用的重复修剪和重新训练周期。如果结合使用一种以智能方式在网络中移动权重的方法,则可以从随机权重可靠地完成。我们称这种范式在整个训练过程中保持稀疏性,同时保持密集的表现水平稀疏学习。尽管这项工作表明稀疏学习是可能的,但未来的工作有望在更多数据上训练更大,更深的网络,同时需要与当前密集网络相同或更少的计算资源。

为什么要稀疏学习?

模型大,参数多,训练需要花费的时间也就多。
人脑消耗的能量仅为GPU的1/10,但功能却强大10 ^ 9倍。是什么使大脑如此高效的计算呢?原因有很多,但原因之一是稀疏性。
已经发现,灵长类动物大脑的神经元越多,普通神经元与所有其他神经元的联系就越少(Herculano-Houzel等人,2010)。这与我们设计深层神经网络的方式大相径庭,后者是将一层中的每个新神经元与上一层中的所有神经元连接在一起的方式。我们已经了解了如何将经过全面训练的密集网络压缩为稀疏网络(Han等人,2015),但是,如果一个人从稀疏网络开始时如何成功做到这一点的工作很少,而在训练过程中我们一直保持稀疏。我们如何做到这一点?

稀疏动量:训练稀疏网络的有效方法

什么是稀疏动量网络(加速训练)
图1:稀疏动量通过查看最近的梯度的加权平均值(动量)来确定在稀疏网络中的新权重在何处增长,以找到权重和层数,从而不断减少误差。(1)根据平均动量大小确定每一层的重要性。(2)对于每一层,我们删除最小权重的50%。(3)然后,根据层的重要性在各个层之间重新分配权重。在一层内,我们在动量值很大的地方增加权重。

好的稀疏学习算法的主要质量是什么?

在稀疏学习中,最重要的是尽可能有效地利用神经网络中的每个权重。如果将“有效性”定义为“减少错误”,那么我们对如何进行有一个清晰的认识。我们需要找到一种方法来描述权重在减少错误方面的有效性,并删除所有不起作用的权重。删除权重后,我们希望在我们认为有希望减少将来误差的位置重新生成权重。
如果我们看一下误差相对于重量的梯度,则实际上就是这样一种度量。但是,如果我们观察连续的梯度,就会发现梯度会剧烈振荡。例如,如果您有一个将手写数字0到9进行分类的神经网络,那么权重可能会很好地检测顶部的直线,这可能有助于减少数字5、7的误差,但可能无济于事或甚至不利于数字0、1、2、3、6、8、9。相反,检测右上角弯曲模式的权重可能对0、2、3、8、9有所帮助,因此我们希望与“最上方的直线”权重相比,该权重随着时间的推移更一致地减少了误差。我们如何在神经网络中自动检测出这样有希望的权重?(很显然这一段没有看的特别懂)

动量:寻找能够一致减少误差的权重

如果将北极设为局部最小值,并且将罗盘针的梯度朝向局部最小值,则可以通过疯狂地摇动罗盘以旋转罗盘针来模拟随机梯度下降更新。每次针穿过北极时,它会减速并与北极对齐,但是由于旋转,它仍然会“超调”该方向。因此,当针仍在来回移动时,可能尚不清楚从两到三个测量中北极的位置。但是,如果您采用平均方向-一次将针向北极偏左,而另一次向右偏-则这些偏差将抵消,您将立即获得非常接近的方向到真正的北极。

这是动量优化技术背后的主要思想:我们对连续的梯度进行平均,以更好地估计局部最小值的方向。类似于指南针,随着速度的降低,它会随着时间的推移越来越精确,我们希望在随机梯度下降中对最近的梯度方向进行加权。一种方法是分配加权平均值,其中我们将更大的权重分配给当前梯度,将较小的权重分配给先前的梯度-这称为指数平滑。通过对权重的梯度进行指数平滑处理,我​​们得到一个加权梯度矩阵-该矩阵是动量矩阵,它的名字叫动量优化。通过这种措施,我们可以确定哪些权重可以一致地减少误差。

重新分配权重:一层的平均动量幅度

从这里开始,我们对稀疏动量算法进行了第一个重要观察:如果权重的动量表明它一致地减小了误差多少,则一层中所有权重的平均动量大小应指示每一层正在减小多少。平均错误。我们采用幅度,是因为两个不同的权重可能始终朝着负方向和正方向发展。通过获取各层的平均动量幅值,我们可以轻松地比较各层的平均重量的有效性。例如,这使得可以说,卷积层A中的权重在减小误差方面的平均效率是完全连接层B中的平均权重的1/3,反之亦然。这种方法使我们能够有效地重新分配权重:如果我们发现“无用的”权重。

哪些参数应该被移除?怎样再生出他们?

接下来的两个问题更直接了:最无用的参数是哪些?我们在哪一层增加权重?第一个问题是神经网络压缩研究中的一个常见问题,其中人们经常以最小的幅度修剪权重。为什么这有意义?如果我们假设所有权重在相似大小的平均输入上得到接收(如果使用批归一化,这是一个合理的假设),那么权重较小的权重在神经元**方面的差异最小。因此,删除它们应该以最小的数量改变我们网络的预测性能。

一旦我们删除了权重并将它们重新分配到权重有效的层(通过层的平均动量大小来衡量),我们就需要确定在层中确切地生长它们的位置。如果我们问:“如果我们将两个未连接的神经元连接在一起,哪个神经元会一致地减少错误?”,一个可能的解决方案变得显而易见。这个问题的答案将再次指出动量的大小。但是,这一次,我们要查看“丢失”或零值权重的动量大小,也就是说,我们要查看以前未训练的权重。因此,我们在失重具有最大动量幅度的位置增加权重。这样就完成了稀疏动量算法,如图1所示。

结果

结果相当令人印象深刻!我们将MNIST上的压缩算法与稀疏动量优于其他大多数方法进行了比较。鉴于压缩方法是从密集的网络开始的,并且通常在我们从头开始训练稀疏网络时会反复进行重新训练,因此这是一个很好的结果!另一个令人印象深刻的结果是,通过使用20%的权重(80%的稀疏性),我们可以匹配甚至超过密集网络的性能。在CIFAR-10上,我们将其与“单次网络修剪”进行了比较,后者是为了简单而不是性能而设计的-因此,稀疏的动量会更好就不足为奇了。但是,有趣的是,我们可以将VGG16-D(具有两个完全连接的层的VGG16版本)和宽带残差网络(WRN)16-10(16层深度和非常宽的WRN)训练到密集的性能水平,而仅需重量的5%。对于其他网络,稀疏的动量接近密集的性能水平。而且,正如我稍后将展示的那样,使用优化的稀疏卷积算法,我们将能够训练各种网络以产生相同的性能水平,同时训练速度要快3.0-5.6倍!
什么是稀疏动量网络(加速训练)
与针对LeNet-300-100和LeNet-5 Caffe的MNIST上的神经网络压缩方法相比,稀疏动量结果。
什么是稀疏动量网络(加速训练)
ImageNet得出稀疏动量和相关方法的结果。对于不完全稀疏的模型,从训练开始,第一次卷积和所有下采样残差连接都是密集的。在完全稀疏设置中,所有层都是稀疏的。稀疏动量比其他方法效果更好,并且如果所有权重都较小,则效果几乎相同。这表明稀疏动量可有效地找到需要高密度的重要层。
在ImageNet上,我们无法达到密集的性能水平,这表明存在改善稀疏动量的空间。但是,我们可以证明,与在整个训练过程中保持稀疏权重的其他方法相比,稀疏动量具有明显的优势。

加速

稀疏学习的主要希望是加速培训-我们成功了吗?是的-否。如果我们测量稀疏卷积的可能加速,稀疏动量会有效地加快训练速度,但是由于稀疏网络只是最近才用于训练,因此不存在针对GPU的优化稀疏卷积算法-至少没有针对所示的权重的细粒度稀疏模式动力稀疏。

因此,我们将加速分为两类:如果存在稀疏卷积算法,则可以实现可能的加速,而今天使用标准密集卷积算法可以实现的加速。密集卷积如何有助于稀疏网络?

如果我们看一下网络的稀疏模式,就会发现卷积通道完全是空的,即一个充满零的卷积滤波器!如果发生这种情况,我们可以在不更改卷积结果的情况下从计算中删除通道,从而可以提高增益。
什么是稀疏动量网络(加速训练)
稀疏的动量可以以较小的权重复制一系列网络的密集性能水平,从而导致加速。
但是,如果我们看一下加速比,就会发现稀疏卷积和密集卷积加速比之间有明显的区别。这清楚地表明需要针对GPU优化的稀疏卷积算法。

为什么稀疏学习有效?

我们使用稀疏动量训练的一些稀疏网络与仅5%权重的密集网络的性能水平相匹配。是什么让这5%的权重如此有效,以至于它们可以匹配具有20倍权重的神经网络?

为了研究这个问题,我们研究了稀疏网络与密集网络相比的功能。低级功能可能包括边缘检测器之类的东西。中级功能可能是*,鼻子,眼睛,爪子之类的东西。高级功能可能是汽车的“面部”,猫的面部,冰箱的门等。

为了将特征简化为数字,我们着眼于卷积通道(相当于卷积网络中的“神经元”),以及通道对数据集中的类有多有用。边缘检测器对于数据集中的几乎所有类都应该有用—换句话说,它们应该具有较低的类专业化水平。诸如眼睛之类的中级功能对于猫,狗和人类等某些类应该有用。高级功能对某些选定的类别很有用-它们是高度专业化的。
什么是稀疏动量网络(加速训练)
图6:AlexNet,VGG16和WRN 28-2的稀疏和密集网络的类专业直方图。
我们发现,平均而言,稀疏网络学习的功能对更广泛的类别有用,它们会学习更多的常规功能。这可能是为什么稀疏网络可以以低至5%的权重匹配密集网络的性能的可能解释。

稀疏学习的未来

我认为,稀疏学习的未来非常光明,因为(1)GPU在未来几年内将停滞不前,(2)稀疏工作负载的专用处理器Graphcore处理器迫在眉睫。Graphcore处理器将整个网络存储在其300 MB缓存中,并将其加速大约100倍。这意味着,如果我们可以在培训期间将网络压缩到300 MB,则总体培训速度将提高100倍。使用一台Graphcore处理器,在ImageNet上训练ResNet-50只需大约15分钟。通过稀疏学习,可​​以毫无问题地达到300 MB的限制。

我的预测是,第一个可以在Graphcore处理器上成功训练稀疏神经网络的研究团队将解锁全新的人工智能水平。

除此之外,另一个挑战是将稀疏学习算法应用于自然语言处理(NLP)。毫不奇怪,我对用于自然语言处理任务的转换器的实验表明,与计算机视觉相比,NLP中的稀疏学习要困难得多,需要做很多工作!

用自己的模型在10行代码中尝试稀疏动量!

什么是稀疏动量网络(加速训练)
图7:可用于您自己的模型的通用稀疏学习脚本示例。使用我的稀疏学习库,可以轻松使用稀疏动量:(1)导入库,(2)添加解析器选项,(3)使用Masking类包装模型,(4)应用mask而不是优化器,(5)在时期结束时应用稀疏动量。该库还可以使用您自己的稀疏学习算法轻松扩展,以进行增长,修剪或重新分配-只需几行代码!

有相关问题的可以在以下连接寻找问题答案:
https://github.com/TimDettmers/sparse_learning/issues
注意该库是基于pytorch的矿框架的