您的当前位置:主页 > 品牌策划 >

如何减小机器学习模型的大小

时间:2020-08-11

众所周知,机器学习模型需求很多的核算、内存和功耗,这就给咱们在实时推理或在核算资源有限的嵌入式设备上运转模型带来了瓶颈。更杂乱、更巨大的模型带来的是更多的内存耗费,然后带来更多的功耗。这便是模型优化要处理的问题。模型优化的技能有剪枝、量化等,咱们今日翻译并共享了 Amandeep Singh 的文章,叙述了怎么让模型变得再小一些,以飨读者。

机器学习模型变得越来越大,核算成本也越来越高。嵌入式设备的内存、核算才能和电池都受到约束。但咱们能够对模型进行优化,使其在这些设备上能够顺畅运转。经过减小模型的巨细,咱们削减了需求履行的操作数量,然后削减了核算量。较小的模型也很简略转化为更少的内存运用,也就更节能。人们一定会以为,削减核算次数能够削减功耗,但相反,从内存拜访取得的功耗比进行加法或乘法运算要高出 1000 倍左右。现在,已然没有免费的午饭,也便是说,一切一切都是有价值的,因而,咱们就会失掉模型的正确率。记住,这些加快的办法并不是为了练习模型,而是为了进行推理。

剪枝便是删去对输出奉献不大的剩余网络衔接。剪枝网络的主意能够追溯到 20 世纪 90 时代,即“ 最优脑损伤 ”和“ 最优脑手术 ”。这些办法运用 Hessians 来确认衔接的重要性,这也使得它们不适用于深度网络。剪枝办法运用迭代练习技能,即练习 → 剪枝 → 微调。剪枝后的微调康复了网络经剪枝后丢掉的正确率。一种办法是运用 L1/L2 范数对网络中的权重进行排序,并去掉终究的 x% 的权重。其他类型的办法也运用排序,运用神经元的均匀激活,神经元在验证集上的激活次数为零,还有许多其他创造性的办法。这种办法是由 Han 等人在 2015 年的论文中创始的。

更近一些的是 2019 年,Frankle 等人在论文《 彩票假说 》中发现,在每个深度神经网络中都存在一个子集,在平等数量的练习下,该子集也具有相同的正确率。这些成果适用于非结构化剪枝,即剪枝整个网络,然后得到一个稀少网络。稀少网络在 GPU 上功率低下,因为它们的核算没有结构。为了补修这一点,需求进行结构化剪枝,即对网络的一部分进行剪枝,例如某一层或某一通道。 Liu 等人 发现,前面评论的彩票假说在这里并不适用。相反,他们发现,在剪枝之后从头练习网络比微调更好。除了功能之外,稀少网络还有其他用处吗?是的,正如 Ahmed 等人 的论文所指出的那样,稀少网络在噪声输入的情况下更具强健性。在 TensorFlow和 PyTorch都支撑剪枝。

要在 PyTorch 中运用剪枝,你能够从 torch.nn.utils.prune 中挑选一个技能类,或许完结 BasePruningMethod 的子类。

 仿制代码

fromtorch.nn.utilsimportprune
tensor = torch.rand
pruner = prune.L1Unstructured
pruned_tensor = pruner.prune

为了对模块进行剪枝,咱们能够运用 torch.nn.utils.prune 中给出的剪枝办法,并指定哪个模块要进行剪枝,乃至是该模块的哪个参数。

 仿制代码

conv_1 = nn.Conv
prune.ln_structured

这将运用剪枝后的成果替换参数权重,并增加一个参数 weight_orig 来存储输入的未剪枝版别。剪枝掩码存储为 weight_mask ,并作为模块缓冲区保存。这些参数能够经过 module.named_parameters 和 module.named_buffers 来查看。为了完结迭代剪枝,咱们能够只鄙人一次迭代中运用剪枝办法,这样它就能够正常作业了,这是因为 PurningContainer 在处理终究掩码的核算时,考虑到了之前运用 computer_mask 办法的剪枝。

量化是为了约束一个权重能够取的或许值的数量,这将削减一个权重能够削减的内存,然后减小模型的巨细。完结这一点的一种办法是,更改用于存储权重的浮点数的位宽。以 32 位浮点数或 FP32 到 FP16、或 8 位定点数方式存储的数字,越来越多地以 8 位整数的方式存储。削减位宽具有以下许多长处:

之所以可行,是因为神经网络对其权重的细小扰动是十分强健的,咱们能够很轻松地舍去它们,而不会对网络的正确率发生太大的影响。此外,因为练习中运用的正则化技能,权重并不包含在十分大的规模内,因而咱们不用运用过大的规模,比方,关于 32 位浮点数,取 $-3.4 imes 10^{38}$ 到 $3.4 imes 10^{38}$ 就能够了。例如,鄙人图中,MoboileNet 中的权重值都十分接近于零。

一个量化计划是咱们怎么将实践权重转换为量化权重,该计划的一个最基本的方式是线性缩放。假定咱们要讲规模 $[r_{min},r_{max}]$ 的值转换为 $[0,I_{max}]$ 的整数规模,其间,$I_{max}$ 为 $2^B-1$,$B$ 是整数表明的位宽。因而,

$r=\frac{r_{max}-r_{min}}{I_{max}-0}=s$

其间,$r$ 是权重的原始值,$s$ 是份额,$q$ 是量化值,$z$ 是映射到 0.0f 的值。这也称为仿射改换。因为 $q$ 为整数,因而对成果进行四舍五入。现在的问题是,咱们怎么挑选 $r_{min}$ 和 $r_{max}$。完结这一点的简略办法是生成权重和激活的散布,然后用量化散布核算他们的 KL 散度 ,并运用与原始值差异最小的那个。一种更为高雅的办法是运用伪量化,即,在练习期间将量化感知层引进网络。这个主意是由 Jacob 等人 提出的。

在练习时,伪量化节点核算权重和激活的规模,并存储它们的移动均匀值。完结练习后,咱们用这个规模来对网络进行量化,以取得更好的功能。

Rastegari 等人的关于异或网络的论文、Courbariaux 等人的关于三值网络的论文、Zhu 等人的关于二值网络的论文中也探讨了更大的位宽。在 PyTorch 1.3 中,引进了量化支撑。为量化操作引进了三种新的数据类型: torch.quint8 、 torch.qint8 和 torch.qint32 。它还供给了各种量化技能,包含在 torch.quantization 中。

 仿制代码

quantized_model = torch.quantization.quantize_dynamic.to
 
关于我们
我们的服务
我们的案例
新闻动态
联系我们

公司服务热线

Copyby 2020 Power by DedeCms