Additive Powers-of-Two (APoT) Quantization:硬件友好的非均勻量化方法

APoT

本文是電子科大&哈佛大學&新加坡國立聯合發表在 ICLR2020 上的一篇非均勻量化(APoT)的工做。本文,在非均勻量化中經過採用Additive Powers-of-Two(APoT)加法二次冪量化,綜合考慮了計算上有效性,低比特量化致使的模型精度降低問題。並實現了不錯的量化效果!node

  • 論文題目:Additive Powers-of-Two Quantization: A Non-uniform Discretization for Neural Networks
  • 論文連接:https://arxiv.org/pdf/1909.13144v2.pdf
  • 論文代碼:https://github.com/yhhhli/APoT_Quantization

摘要

本文首先提出了Additive Powers-of-Two(APoT)加法二次冪量化,一種針對鐘形和長尾分佈的神經網絡權重,有效的非均勻性量化方案。經過將全部量化數值限制爲幾個二次冪相加,這APoT量化有利於提升計算效率,並與權重分佈良好匹配。其次,本文經過參數化Clipping函數以生成更好的更新最佳飽和閾值的梯度。最後,提出對權重歸一化來調整權重的輸入分佈,使其在量化後更加穩定和一致。實驗結果代表,本文提出的方法優於最早進的方法,甚至能夠與全精度模型競爭,所以證實了本文提出的APoT量化的有效性。例如,本文在 ImageNe t上的 3bit 量化 ResNet-34 僅降低了 0.3% 的 Top-1 和 0.2% Top-5 的準確性。git

方法

Additive Powers-of-Two量化 (APoT)

三種量化方法示意圖
量化表示
  • 表明裁剪閾值。
  • 表明Clip函數,將權重裁剪到
  • 中每一個元素經過 映射成量化值
  • 表明量化候選數值
  • 表明量化位寬
均勻量化表示
Powers-of-Two (PoT) 量化表示

基於Powers-of-Two (PoT) 的非均勻量化模式有一個好處是在計算過程當中能夠採用移位的方式代替複雜的乘法運算,所以冪次的非均勻量化能夠顯著提升計算效率。以下公示所示:github

基於Powers-of-Two (PoT) 的非均勻量化十分適配基於鍾型的weights形式,能夠實現0附近權重集中的位置量化表示多,長尾部份量化表示少。web

Additive Powers-of-Two 量化表示

PoT 量化雖然十分適配基於鍾型的weights形式,可是,對於增長bit數是沒有明顯增益。好比,咱們將位寬從 設置爲 範圍內的間隔(interval)不會發生變化,只是在 範圍進一步縮小間隔。這個問題被定義爲 rigid resolution(剛性分辨率)問題。爲解決此問題,本文提出了APoT量化表示。微信

  • 是一個縮放係數,以確保 中的最大級別是
  • 稱爲 基位寬,即每一個加法項的位寬 是加法項的數量。
  • 當設置了位寬 和基位寬 時, 可由 計算獲得。

參數化Clipping函數 (RCF)

傳統的STE僅僅對clip函數邊界之外的閾值梯度值進行更新,對於邊界之內的閾值參數梯度均爲零,這不利於尋找最優的clip閾值邊界。網絡

針對傳統STE梯度約束不完整的問題,本文對權重內外的閾值邊界梯度均進行梯度約束,以便於更快更好的訓練獲得最優閾值。架構


class _pq(torch.autograd.Function):
    @staticmethod
    def forward(ctx, input, alpha):
        input.div_(alpha)                          # weights are first divided by alpha
        input_c = input.clamp(min=-1, max=1)       # then clipped to [-1,1]
        sign = input_c.sign()
        input_abs = input_c.abs()
        if power:
            input_q = power_quant(input_abs, grids).mul(sign)  # project to Q^a(alpha, B)
        else:
            input_q = uniform_quant(input_abs, b).mul(sign)
        ctx.save_for_backward(input, input_q)
        input_q = input_q.mul(alpha)               # rescale to the original range
        return input_q

    @staticmethod
    def backward(ctx, grad_output):
        grad_input = grad_output.clone()             # grad for weights will not be clipped
        input, input_q = ctx.saved_tensors
        i = (input.abs()>1.).float()
        sign = input.sign()
        grad_alpha = (grad_output*(sign*i + (input_q-input)*(1-i))).sum()
        return grad_input, grad_alpha

權重歸一化

權重歸一化爲裁剪(Clip)和投影(projection)提供了相對一致且穩定的輸入分佈,這便於在訓練過程當中更平滑地優化不一樣層和迭代。此外,將權重的平均值設爲零能夠使得量化更加對稱。權重歸一化公式以下,主要是經過權重值減均值除方差完成,使得歸一化後的權重分佈知足均值爲0方差爲1。app

權重歸一化使得訓練參數更加一致

APoT量化僞代碼

APoT量化僞代碼

實驗結果

CIFAR-10

CIFAR-10量化結果

ImageNet

ImageNet量化結果-表格
ImageNet量化結果-柱狀圖


GDFQ:基於Data-Free的低比特量化方法編輯器


ZeroQ:基於Data-Free的30秒快速量化方法ide


目標檢測二值量化——BiDet


神經網絡低比特量化——TQT


神經網絡架構搜索——二值可微分搜索(BATS)






更多內容關注微信公衆號【AI異構】


本文分享自微信公衆號 - AI異構(gh_ed66a0ffe20a)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索