本文提出了一种综合考虑权重的重要性和频率来进行量化的方式。它与其它量化方式的对比:
作者首先定义了被称为权重熵的变量:
这里Pn代表了权重的频率,In代表了它的重要性。作者设定了n个量化簇(cluster),i(n,m)是计算第n个簇的第m个权重的重要性的函数,作者这里简单地选择了平方函数。
上图是权重量化的伪代码:首先用平方函数计算每个权重的重要性,然后从小到大对其排序,并将它们均匀分为n个间隔(n为超参数)。然后对每个间隔ck遍历间隔[ck-1,ck+1],计算新的权重熵,若大于原先的S,则对间隔进行更新。最后计算每个量化间隔的量化值及对应的权重间隔。
对激活值的量化选择了另外的方法,因为它会根据输入的变化而变化。简单来说,作者用了一个截断的阶梯状ReLU函数。
这里的fsr是0之后的第一个间隔
,为1/16的倍数。step则是间隔的步长,为1/8的倍数,所以第二个间隔为
这两个值会在之后穷举搜索来获得最佳值,因为它们俩的值集合较小。前者有16个,后者有大约500个。
权重量化仅在每个mini-batch更新权重后进行,而激活值量化则要在每次前向传播和后向传播时都要进行。首先使用ReLU进行激活,然后使用本文的方法对激活值量化,再将其传递到下一层,重复这一过程。
这篇文章挺有趣的,它克服了线性量化精度较低和log量化在零附近不必要的高精度的问题。而且由于可以自定义量化间隔,我们可以根据各种条件,自由地选取量化的bit数。它的另一个优点是,它可以简单地应用到其它网络架构上,而不需要对网络进行改造。