深度学习基础-模型压缩

减少模型参数

网络裁剪network pruning

通过判断某参数的 l1 或者 l2 范数是否接近于 0 来决定是否要裁剪该参数通常使用 0 来代替被裁剪的权重

神经元的输出在大多数情况下都为 0 或者接近 0那么我们就可以把这个神经元给裁减掉

裁剪后进行微调(fine-tune)填补丢失的性能

知识蒸馏knowledge distillation

先训练一个大模型teacher然后再训练一个小模型student来拟合大模型的输出这样最终得到的小模型体积比大模型小但能获得和大模型接近的性能

参数量化parameter quantization

参数聚类parameter clustering使用聚类算法例如 k-means将相似的参数转为同一个值然后记录某个参数属于哪个簇以及该簇对应的参数值是多少即可

模型结构设计architecture design

比如1x1卷积核 Depthwise Separable Convolution深度可分离卷积,减少卷积核参数 假设卷积核输入端的特征图大小为(4x4)x64输出端的大小为(3x3)x128卷积核尺寸为(2x2)单位步长和无填充则深度可分卷积首先使用64个(2x2)x1的卷积核在每个通道分别卷积并组合得到(3x3)x64的张量随后使用128个(1x1)x64的单位卷积核输出结果所需的参数总量为8448若使用标准卷积则128个(2x2)x64的卷积核所需的参数总量为32768是前者的4倍左右

减少存储空间

16位模型 torch.nn.Module.half()方法APEX 深度学习加速库由英伟达开源完美支持PyTorch框架用于改变数据格式来减小模型显存占用的工具其中最有价值的是 amp (Automatic Mixed Precision自动混合精度) 将模型的大部分操作都用 Float16 数据类型测试一些特别操作仍然使用 Float32