lecture_03
**剪枝:**pruning basically turns a dense neural network into a sparse neural network. you can remove those redundant synapses, and also you can remove those redundant neurons.
剪枝的本质上是将稠密的神经网络转变成稀疏的神经网络,可以去除那些冗余的突触,同样也能移除那些冗余的神经元。
剪枝就是“修剪”深度学习模型中多余的部分,让模型变得更轻、更快,同时尽可能保留性能。
想象一下,养了一棵树,长得有点太大了,有些枝叶其实没啥用,但又占地方。想让它更整齐、更好看,就可以修剪掉这些多余的枝叶
remove those small connections, very simple criteria, if it is small, then we remove it. remove it means setting it to zero
.
模型训练推理过程,DRAM的访问往往是耗费时间的主要原因之一:
- DRAM的访问时间(延迟)比处理器的计算速度慢很多倍。现代处理器的计算能力非常强,但每次从DRAM读取数据都需要几百个时钟周期;深度学习模型通常有大量的参数(权重、激活值等),这些参数无法全部装入处理器的缓存(Cache),因此需要频繁地从DRAM读取
- DRAM和处理器之间的数据传输受限于内存带宽。即使计算速度很快,如果数据不能及时从内存传输过来,也会导致“数据饥饿”
- 在推理时,模型需要从内存中逐层读取权重,再进行矩阵运算,最后将结果写回内存
- 对训练的影响:
- 梯度计算和参数更新需要反复读取和写入参数。这些数据通常存储在显存(GPU)或主存(CPU的DRAM)中,如果显存容量不足,还需要频繁地从主存中加载数据;当模型非常大(超出显存容量)时,训练会因频繁的主存和显存交互而变得非常慢
- 推理阶段通常是
以延迟为优化目标
(如实时性)。如果模型的权重或中间激活值不能在缓存中保留,就会因DRAM访问引入额外的延迟
NVIDIA从A100GPU开始采用权重的稀疏性,实现了高达1.5倍的性能提升。
剪枝过程理解:
-
假设原始权重矩阵W:
[ 0.8 0.1 0.05 − 0.2 0.3 0.01 0.4 − 0.5 0.02 ] (3) \left[ \begin{matrix} 0.8 & 0.1 & 0.05 \\ -0.2 & 0.3 & 0.01 \\ 0.4 & -0.5 & 0.02 \end{matrix} \right] \tag{3} 0.8−0.20.40.10.3−0.50.050.010.02 (3) -
假设我们根据权重的绝对值大小剪枝,阈值设为 𝜏 = 0.1绝对值大于𝜏则保留,小于则置为0
-
根据阈值 τ\tauτ 生成的掩码矩阵为:
[ 1 1 0 1 1 0 1 1 0 ] (3) \left[ \begin{matrix} 1 & 1 & 0 \\ 1 & 1 & 0 \\ 1 & 1 & 0 \end{matrix} \right] \tag{3} 111111000 (3) -
将 W 和 M 逐元素相乘:
WP = M⊙W =
[ 0.8 0.1 0 − 0.2 0.3 0 0.4 − 0.5 0 ] (3) \left[ \begin{matrix} 0.8 & 0.1 & 0 \\ -0.2 & 0.3 & 0 \\ 0.4 & -0.5 & 0 \end{matrix} \right] \tag{3} 0.8−0.20.40.10.3−0.5000 (3) -
剪枝后的损失函数可以写为:
LP(X,Y,WP) = L(X,Y,WP) + λ∥WP∥1
剪枝颗粒度(Pruning Granularity):
权重级别剪枝:就像挑选模型中一些“小的、不重要的”权重,将它们去掉,但是网络的架构(每一层的神经元和连接)保持不变
神经元级别剪枝:决定某些神经元(及其对应的权重)对输出几乎没有影响,因此直接去除整个神经元和与之相连的所有权重
层级剪枝:删除了一个完整的“计算模块”,即某一层的所有神经元和连接,整个层的计算就不再进行
剪枝的敏感性分析:
敏感性分析是一种用来衡量和评估模型中不同参数或层对模型整体性能(如准确率、损失等)影响的方法。通过敏感性分析,可以确定模型中哪些参数或层对于性能不敏感,从而为剪枝提供指导,帮助选择那些对性能影响较小的部分进行裁剪,以减少模型规模、提高推理速度,同时尽量保持模型的性能
- 逐层剪枝敏感性分析:
- 对每一层逐步减少参数(如减少一定比例的卷积核或神经元),观察性能变化曲线
- 敏感的层通常对模型性能具有较大影响,应慎重剪枝
- 参数重要性分析:
- 使用 L1 范数:权重值的绝对值越小,越不重要
- 使用 L2 范数:权重越接近于零,则认为其对性能贡献较小
- 基于梯度的重要性:考虑 ∣w⋅∂L/∂w∣,即权重与梯度的乘积,用以衡量权重对损失的贡献
- Hessian 矩阵方法
- 利用二阶导数(Hessian 矩阵)衡量权重对损失函数的敏感性
- 理论上较为精确,但计算复杂度较高
- 激活敏感性
- 衡量神经元的激活值对最终输出的贡献
- 激活值较低或接近零的神经元对输出影响较小,可以优先剪枝