当前位置:网站首页 > 大数据架构 > 正文

resnet模型大小(resnet模型压缩)



来源:机器学习杂货店

本文约5200字,建议阅读10+分钟

我们知道,在一定程度上,网络越深,参数越多,模型越复杂,其最终效果越好。

神经网络的压缩算法是,旨在将一个庞大而复杂的预训练模型(pre-trained model)转化为一个精简的小模型。

按照压缩过程对网络结构的破坏程度,我们将模型压缩技术分为 “前端压缩” 和 “后端压缩” 两部分。

前端压缩,是指在不改变原网络结构的压缩技术,主要包括知识蒸馏、轻量级网络(紧凑的模型结构设计)以及滤波器(filter)层面的剪枝(结构化剪枝)等;

  • 后端压缩,是指包括低秩近似、未加限制的剪枝(非结构化剪枝 / 稀疏)、参数量化以及二值网络等,目标在于尽可能减少模型大小,会对原始网络结构造成极大程度的改造。

    总结: 前端压缩几乎不改变原有网络结构(仅仅只是在原模型基础上减少了网络的层数或者滤波器个数),后端压缩对网络结构有不可逆的大幅度改变,造成原有深度学习库、甚至硬件设备不兼容改变之后的网络。其维护成本很高。


    一、低秩近似

    简单理解就是,卷积神经网络的权重矩阵往往稠密且巨大,从而计算开销大,有一种办法是采用低秩近似的技术将该稠密矩阵由若干个小规模矩阵近似重构出来,这种方法归类为低秩近似算法。

    一般地,行阶梯型矩阵的秩等于其 “台阶数”- 非零行的行数。

    低秩近似算法能减小计算开销的原理 如下:

    基于以上想法,Sindhwani 等人提出使用结构化矩阵来进行低秩分解的算法,具体原理可自行参考论文。另一种比较简便的方法是使用矩阵分解来降低权重矩阵的参数,如 Denton 等人提出使用奇异值分解(Singular Value Decomposition,简称 SVD)分解来重构全连接层的权重。

    1.1 总结

    低秩近似算法在中小型网络模型上,取得了很不错的效果,但其超参数量与网络层数呈线性变化趋势,随着网络层数的增加与模型复杂度的提升,其搜索空间会急剧增大,目前主要是学术界在研究,工业界应用不多。


    二、剪枝与稀疏约束

    给定一个预训练好的网络模型,常用的剪枝算法一般都遵从如下操作:

    衡量神经元的重要程度;

  • 移除掉一部分不重要的神经元,这步比前 1 步更加简便,灵活性更高;

  • 对网络进行微调,剪枝操作不可避免地影响网络的精度,为防止对分类性能造成过大的破坏,需要对剪枝后的模型进行微调。对于大规模行图像数据集(如 ImageNet)而言,微调会占用大量的计算资源,因此对网络微调到什么程度,是需要斟酌的;

  • 返回第一步,循环进行下一轮剪枝。

    基于以上循环剪枝框架,不同学者提出了不同的方法,Han 等人提出首先将低于某个阈值的权重连接全部剪除,之后对剪枝后的网络进行微调以完成参数更新的方法,这种方法的不足之处在于,剪枝后的网络是非结构化的,即被剪除的网络连接在分布上,没有任何连续性,这种稀疏的结构,导致 CPU 高速缓冲与内存频繁切换,从而限制了实际的加速效果。

    基于此方法,有学者尝试将剪枝的粒度提升到整个滤波器级别,即丢弃整个滤波器,但是如何衡量滤波器的重要程度是一个问题,其中一种策略是基于滤波器权重本身的统计量,如分别计算每个滤波器的 L1 或 L2 值,将相应数值大小作为衡量重要程度标准。

    利用稀疏约束来对网络进行剪枝也是一个研究方向,其思路是在网络的优化目标中加入权重的稀疏正则项,使得训练时网络的部分权重趋向于 0 ,而这些 0 值就是剪枝的对象。

    2.1 总结

    总体而言,剪枝是一项有效减小模型复杂度的通用压缩技术,其关键之处在于如何衡量个别权重对于整体模型的重要程度。剪枝操作对网络结构的破坏程度极小,将剪枝与其他后端压缩技术相结合,能够达到网络模型最大程度压缩,目前工业界有使用剪枝方法进行模型压缩的案例。

    三、参数量化

    相比于剪枝操作,参数量化则是一种常用的后端压缩技术。所谓 “量化”,是指从权重中归纳出若干 “代表”,由这些 “代表” 来表示某一类权重的具体数值。“代表” 被存储在码本(codebook)之中,而原权重矩阵只需记录各自 “代表” 的索引即可,从而极大地降低了存储开销。这种思想可类比于经典的词包模型(bag-of-words model)。常用量化算法如下:

    标量量化(scalar quantization)。

  • 标量量化会在一定程度上降低网络的精度,为避免这个弊端,很多算法考虑结构化的向量方法,其中一种是乘积向量(Product Quantization, PQ),详情咨询查阅论文。

  • 以 PQ 方法为基础,Wu 等人设计了一种通用的网络量化算法:QCNN (quantized CNN),主要思想在于 Wu 等人认为最小化每一层网络输出的重构误差,比最小化量化误差更有效。


    这样,只需将 kk 个聚类中心(cjcj,标量)存储在码本中,而原权重矩阵则只负责记录各自聚类中心在码本中索引。如果不考虑码本的存储开销,该算法能将存储空间减少为原来的 log2 (k)/32log2(k)/32。基于 kk 均值算法的标量量化在很多应用中非常有效。参数量化与码本微调过程图如下:


    这三类基于聚类的参数量化算法,其本质思想在于将多个权重映射到同一个数值,从而实现权重共享,降低存储开销的目的。


    3.1 总结

    参数量化是一种常用的后端压缩技术,能够以很小的性能损失实现模型体积的大幅下降,不足之处在于,量化的网络是 “固定” 的,很难对其做任何改变,同时这种方法通用性差,需要配套专门的深度学习库来运行网络。

    这里,权重参数从浮点转定点、二值化等方法都是是试图避免浮点计算耗时而引入的方法,这些方法能加快运算速率,同时减少内存和存储空间的占用,并保证模型的精度损失在可接受的范围内,因此这些方法的应用是有其现实价值的。

    更多参数量化知识,请参考此 github 仓库:

    https://github.com/Ewenwan/MVision/blob/master/CNN/Deep_Compression/quantization/readme.md


    四、二值化网络

    1. 二值化网络可以视为量化方法的一种极端情况:所有的权重参数取值只能为 ±1±1 ,也就是使用 1bit 来存储 Weight 和 Feature。在普通神经网络中,一个参数是由单精度浮点数来表示的,参数的二值化能将存储开销降低为原来的 1/32。

    2. 二值化神经网络以其高的模型压缩率和在前传中计算速度上的优势,近几年格外受到重视和发展,成为神经网络模型研究中的非常热门的一个研究方向。但是,第一篇真正意义上将神经网络中的权重值和激活函数值同时做到二值化的是 Courbariaux 等人 2016 年发表的名为《Binarynet: Training deep neural networks with weights and activations constrained to +1 or -1》的一篇论文。这篇论文第一次给出了关于如何对网络进行二值化和如何训练二值化神经网络的方法。

    3.CNN 网络一个典型的模块是由卷积 (Conv)-> 批标准化 (BNorm)-> 激活 (Activ)-> 池化 (Pool) 这样的顺序操作组成的。对于异或神经网络,设计出的模块是由批标准化 (BNorm)-> 二值化激活 (BinActiv)-> 二值化卷积 (BinConv)-> 池化 (Pool) 的顺序操作完成。这样做的原因是批标准化以后,保证了输入均值为 0,然后进行二值化激活,保证了数据为 -1 或者 +1,然后进行二值化卷积,这样能最大程度上减少特征信息的损失。二值化残差网络结构定义实例代码如下:

     
      

    4.1 二值网络的梯度下降


    • 利用决定化方式(sign (x) 函数)把 Weight 量化为 +1/-1, 以 0 为阈值。

    • 利用量化后的 Weight (只有 + 1/-1) 来计算前向传播,由二值权重与输入进行卷积运算(实际上只涉及加法),获得卷积层输出。



    • 把梯度更新到浮点的 Weight 上(根据放松后的符号函数,计算相应梯度值,并根据该梯度的值对单精度的权重进行参数更新)。

    • 训练结束:把 Weight 永久性转化为 +1/-1, 以便 inference 使用。



    4.2 两个问题

    1. 如何对权重进行二值化?

    选择:<="" p="">

    • 直接根据权重的正负进行二值化:xb=sign (x)xb=sign(x)。符号函数 sign (x) 定义如下:


    • 进行随机的二值化,即对每一个权重,以一定概率取 ±1±1。

    2. 如何计算二值权重的梯度?


    4.3 二值连接算法改进

    单精度对角阵与二值矩阵之积来近似表示原矩阵的算法

    ,以提升二值网络的分类性能,弥补二值网络在精度上弱势。该算法将原卷积运算分解为如下过程:





    4.4 二值网络设计注意事项

    • 不要使用 kernel = (1, 1) 的 Convolution (包括 resnet 的 bottleneck):二值网络中的 weight 都为 1bit, 如果再是 1x1 大小, 会极大地降低表达能力。

    • 增大 Channel 数目 + 增大 activation bit 数 要协同配合:如果一味增大 channel 数, 最终 feature map 因为 bit 数过低, 还是浪费了模型容量。同理反过来也是。

    • 建议使用 4bit 及以下的 activation bit, 过高带来的精度收益变小, 而会显著提高 inference 计算量。


    五、知识蒸馏



    • 第一项是由小模型的预测结果与大模型的 “软标签” 所构成的交叉熵(cross entroy);

    • 第二项为预测结果与普通类别标签的交叉熵。

    T 是一个可调节的超参数、T 值越大、概率分布越软(论文中的描述),曲线便越平滑

    ,相当于在迁移学习的过程中添加了扰动,从而使得学生网络在借鉴学习的时候更有效、泛化能力更强,这其实就是一种抑制过拟合的策略。知识蒸馏的整个过程如下图:



     

  • 来源 | OSCHINA 社区作者 | 华为云开发者联盟-嵌入式视觉 整理 | 机器学习研习院原文链接:https://my.oschina.net/u//blog/
    到此这篇resnet模型大小(resnet模型压缩)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!







    版权声明


    相关文章:

  • 程序员入门代码大全(程序员最简单的代码)2025-10-22 08:18:10
  • 十大至高大道法则顺(天道十大至高法则)2025-10-22 08:18:10
  • 柯美c7000代码大全(柯美6000代码c6704)2025-10-22 08:18:10
  • wifi字典(wifi字典包 大全个人收集80G)2025-10-22 08:18:10
  • 好玩的代码大全QQ(好玩的代码大全合集)2025-10-22 08:18:10
  • 澳大利亚驾照怎么换国内驾照(澳大利亚驾照怎么换国内驾照新疆)2025-10-22 08:18:10
  • 大气分层图(大气分层图片)2025-10-22 08:18:10
  • 中国大学慕课认证码错误(中国大学慕课认证码不匹配)2025-10-22 08:18:10
  • ubuntu代码大全(ubuntu在哪里写代码)2025-10-22 08:18:10
  • 芯片参数查询网(芯片查询大全)2025-10-22 08:18:10
  • 全屏图片