热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

稀疏学习:从人脑得到灵感,让深度学习突破算力限制

大数据文摘出品来源:timdettmers编译:张秋玥、Luciana、钱天培深度学习的重要推动力是计算力的进步。从2010年到2018年,GPU性能提高了97倍。但是,由于我们几




大数据文摘出品

来源:timdettmers

编译:张秋玥、Luciana、钱天培


深度学习的重要推动力是计算力的进步。


从2010年到2018年,GPU性能提高了97倍。但是,由于我们几乎已达到了半导体技术的物理极限,可以预计,在未来5-8年内GPU性能的提升仅会略高于80%。


在无法进一步提高计算能力的情况下,我们还能进行什么样的研究呢?


一种可行的研究方向是,从人脑中寻找灵感。


人类大脑消耗的能量是GPU的十分之一,但强度要高出10 ^ 9倍。是什么让大脑如此高效?


原因有很多,而其中一个就是是稀疏性


研究已经发现,灵长类生物大脑中的神经元越多,平均下来每个神经元与其他神经元的连接就越少(来自Herculano-Houzel等人的研究,2010)。这与我们设计深度神经网络的方式恰恰相反。深度神经网络更倾向于将每一层中的每个新神经元都与前一层中的所有神经元连接起来。


我们已经知道如何将一个完全训练好的稠密网络压缩到稀疏网络,但是,让一个网络在训练期间始终保持稀疏却很少被研究。


我们如何才能做到这一点的呢?今天,我们就要介绍ELMo作者Luke Zettlemoyer的最新研究,稀疏动量——一种训练稀疏网络的有效方法


优秀的稀疏学习算法长什么样?


在稀疏学习中,最重要的是尽可能有效地使用神经网络中的每一个权重。如果将“有效性”定义为“减少误差”,那么我们的下一步就很明确了。我们需要找到能够一个指标——它应当能够衡量一个权重减少误差的效果,并删除所有并不能减少误差的权重。一旦移除了权重,就可以在我们认为有望减少未来误差的位置重新生成新的权重。


如果只是关注关于权重的误差梯度,那我们确实有这样的指标。然而,如果我们观察连续梯度,就发现梯度的变化可能会非常的大。例如,加入你有一个神经网络对手写数字0到9进行分类,那么某一权重可能能够很好地检测到顶部的直线——这可能有助于减少数字5和7的错误,但是它可能并无法辨认数字0,1,2,3,6,8,9(或者甚至只会帮倒忙!)。相反,检测右上方曲线图案的重量可能有助于辨认0,2,3,8,9。因此我们可以认为,随着时间的推移,这一权重将比“顶部直线”权重能够能更加一致地减少误差。那么,我们如何自动检测神经网络中这种有用的权重呢?


动量:找到能够始终如一地减少误差的权重


打个比方,如果将北极作为局部最小值并使用罗盘针向局部最小值的渐变,那么您可以通过摇动指南针来旋转罗盘针来模拟随机梯度下降更新。每次针经过正北时,它会逐渐减速,然而,由于旋转,它仍会“超过”该方向。但是,如果你取平均指示 - 一次指针位于北极左侧,另一次指向右侧 - 这些偏差抵消了,你会立即得到一个非常接近的方向真正的北极。


这是动量优化技术背后的主要思想:我们对连续梯度取平均值以更好地估计局部最小值的方向。与罗盘指针在慢下来的时候会逐渐变得越来越准确这一特性类似,我们希望在随机梯度下降中更加高度地加权最近的梯度方向。一种方法是指定一个加权平均值,我们为当前梯度分配一个更大的权重,为前一个梯度分配一个小权重——这称为指数平滑。通过指数平滑权重的梯度,我们得到一个加权梯度矩阵——这个矩阵是动量矩阵(这就是动量优化这一名字的由来)。通过这一指标,我们可以确定哪些权重能够一致地减少误差。


重新分布权重:层平均动量大小


如果一个权重的动量表明它一致地减少了多少误差,那么一个层中所有权重的平均动量大小应该表明每个层平均减少了多少误差。通过获取层的平均动量大小,我们可以轻松地比较每层中平均重量的有效性。这就使我们可以有底气地说,例如,卷积层A中的权重平均只有完全连接层B的1/3,反之亦然。这种方法使我们能够有效地重新分配权重:如果我们发现“无用”权重,现在我们就能够很精确地知道到底把它放在哪一层了。可是这下问题又来了——在这一层中,我们把它具体放哪儿呢?


该删除哪些权重,在何处重新分配权重?


我们可以从以下两个问题着手:哪些是最无用的权重因素?我们应该在哪一层特征中增加权重?第一个问题在神经网络压缩研究中十分常见,我们采取修剪小量级权重的方式,这种方式意义重大。假设所有权重具有相似量级的平均输入,并使用批量归一化方法,那么小量级权重会使神经元产生激活差异最小,因此,删除这些小量级权重对神经网络法预测性能的改变最小。


一旦我们移除了小量级权重,重新分配剩余权重到有效层(由平均动量确定),就需要确定此权重在相应有效层的发展位置。首先思考一个问题:“连接哪些神经元可以协同减少误差?”答案很明显,取决于动量的大小。但无论如何,我们需要先找到缺失或零值权重的动量值(之前我们从训练中排除的那些),在这些缺失权重的位置增加动量值大的权重,这样就完成了稀疏动量算法,此过程如下图所示。


稀疏动量通过查看临近梯度(动量)的加权平均值来确定在稀疏网络中增加新权重的位置,以找到能够一致减少误差的权重和层。(1)我们根据平均动量大小确定每层的重要性。(2)我们删除每一层较小50%的权重。(3)然后,我们根据层的重要性在层之间重新分配权重。在每一层中,我们增加大动量之处的权重。


结果


结果令人振奋!稀疏动量法得出的结果表明,它胜于基于MNIST手写数据集的其他压缩算法。首先,它提供了一种实现方式:从密集网络开始,重复重新训练稀疏网络;其次,可以通过使用20%密集权重(即80%稀疏权重)匹配密集网络的性能。为便于理解此结论,我们同时将稀疏动量法与基于CIFAR-10数据集的单发网络修剪法进行比较,毫无疑问,对比得出稀疏动量法更胜一筹。在基于CIFAR-10数据集的单发网络修剪法中,VGG16-D和WRN16-10模型可以通过使用5%密集权重匹配密集网络的性能,其他模型的密集权重水平与稀疏动量法的密集权重水平近似。此外,通过优化的稀疏卷积算法,使用WRN 16-10模型可以保证在实现相同性能情况下使训练速度提升12倍。





在ImageNet图像识别数据库中,我们无法达到密集性能水平,这表明需要改善稀疏动量的指标。但无论如何,稀疏动量法与其他方法相比,在训练样本过程中实现保持稀疏权重方面,具有明显优势。


加速效果


稀疏学习预示了我们需要加速样本的训练,我们是否已经做到了?似是而非。如果权衡稀疏卷积的加速效果,稀疏动量可以有效地加速训练,但由于稀疏神经网络法近期才用于训练,对于GPU来说尚未建立优化的稀疏卷积算法,目前,至少对于稀疏动量法,细粒度稀疏模式的权重表现如此。


因此,我们将加速效果分为两组:一组假设存在某种稀疏卷积算法来实现加速,另一组使用标准密集卷积算法来实现加速。究竟密集卷积法如何帮助稀疏网络实现加速呢?


当看到神经网络稀疏模式出现卷积通道完全为空的情况,即出现一个全零的卷积滤波器时,我们便可以从计算中删除此通道,同时不改变卷积的结果,从而获得加速效果。


应用最佳稀疏卷积法和朴素密集卷积法所获得加速效果


但是,我们从加速效果中发现,最佳稀疏卷积法和朴素密集卷积法大相径庭,这正好清楚地表明了GPU对的优化稀疏卷积算法的需求。


为什么稀疏学习有效?


我们使用稀疏动量法训练的样本与使用仅有5%权重的密集卷积法的性能水平相当。是什么原因让这5%的权重如此高效,可以与稀疏动量法权重的20倍相匹配呢?


为了研究这个问题,我们对比了稀疏网络法与密集网络法的不同特征,其中低层特征例如边缘检测器,中层特征例如轮子、鼻子、眼睛、爪子,高层特征例如汽车表面,猫脸,冰箱门等。


边缘检测器可以有效减少卷积通道中特征的数量即神经元数量,同时可以确定卷积通道对数据集中数据分类的决定程度。边缘检测器对数据集中所有类型数据都适用,也就是说它的类特化水平较低,像眼睛这样的中级特征对例如猫,狗和人类的数据比较适用,高级特征类特化水平较高,常用来选取特定的类别。


AlexNet模型,VGG16模型和WRN 28-2模型的稀疏动量法和密集网络法的类特化直方图


我们发现,平均而言,稀疏网络学习法的特征可供学习的范围更广,这可以解释为什么稀疏网络法可以与只用5%的权重的密集网络法的性能相匹配。


稀疏学习法的未来


我认为稀疏学习法的前景非常光明,一方面,未来几年内GPU的性能不会有大的变化,另一方面,用于负载稀疏学习法的专用处理器Graphcore(核图形处理器)即将面世: 核图形处理器将整个神经网络存储在300 MB缓存空间中,同时将速度提升约100倍。这意味着如果训练样本时我们将神经网络数据压缩到300 MB,训练速度整体将提高100倍。那么使用一个核图形处理器在ImageNet图像识别数据库上训练50个残差样本只需要大约15分钟,当然,通过稀疏学习法,数据可以毫无疑问的地控制在300 MB大小以内。


由此可以预测,第一个能够在核图形处理器上成功训练稀疏神经网络的研究团队,将开启人工智能领域的新世界的大门。除此之外,稀疏学习算法的另一个挑战是将其应用于自然语言处理(NLP)。基于我的实验,毫无疑问,与计算机可视化相比,在使用自然语言进行稀疏学习方面,还需要加强。


相关报道:

https://timdettmers.com/2019/07/11/sparse-networks-from-scratch/



推荐阅读
author-avatar
Caroline19921009
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有