减少模型参数
网络裁剪(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。