本文提出了一种量化部分小的激活值及新的量化网络的反向传播的方法。
和权重熵量化方法的观察一致,作者发现大的激活值对精度的影响很大,且出现频率更低。于是作者提出了将1-3%最大的激活值保持原样,只量化剩余部分的激活值。
另外,作者在反向传播时,在计算每一层的梯度时,将激活值的数值类型转换为全精度。这样做的好处是,每次只需要存储一层激活值的全精度值,就减少了对存储的要求。
随后作者解释了,为什么量化激活值对网络的影响极小——即使有时候量化的bit数极低:
上述公式是反向传播到某一层时的梯度,φ·是激活值的导数。当使用ReLU时,它的值为1。这样激活值就与本地梯度无关了(也就是说,量化激活值并不会导致累积的梯度误差,除了计算权重的梯度时,使用ReLU的量化网络的梯度与全精度网络的梯度是一致的)。
在实现本方法时会遇到的一个问题是,因为该方法需要对激活值进行排序,那么在使用多个GPU进行计算时,就需要进行GPU间的通信,这会很消耗时间。对此作者提出的解决方案是,在单个GPU上进行排序,而并不进行通讯。实验表明这样的效果还不错。
梯度要经过那些非零值进行传播,但量化网络的一个问题是,有时候零值是真实的零值(比如由ReLU带来的),这种情况下就不需要继续传播;但有时候零值是由量化导致的,那么梯度就仍然需要经过它进行传播。作者对此的解决方案是,提出两个值分别表示两种零。但他没提对后者如何进行传播,我的理解是给它一个合适的小值,比如下一个量化值的一半。
另一个实现细节是,作者发现在训练时逐步降低保留全精度激活值的比例,会有不错的效果。
作者也提出,该方法的一个问题是,排序算法还不够高效。