1. 程式人生 > >INQ(incremental network quantization:towards lossless CNNs with low-precision weights

INQ(incremental network quantization:towards lossless CNNs with low-precision weights

incremental network quantization:towards lossless CNNs with low-precision weights 實驗前提:a.一個預訓練的模型,模型已收斂                 b.訓練這個模型訓練集,驗證集,測試集 大體三個步驟:weights partition、group-wise quantization 、re-training 。
         (1)先將每個kernel的資料分為2個組,一組量化編碼另一組保持不變,          (2)再使用訓練集去訓練這個模型直到收斂。          (3)再把之前已量化編碼的資料固定住,把之前沒有量化編碼的資料分為兩組,一組量化編碼,一組保持不變,          (4)繼續使用訓練集來訓練,直至模型收斂。          (5)重複上述操作,把kernel中的所有的權重都編碼量化了,則認為模型已壓縮。         下面介紹具體每個步驟是怎麼實施的:          1.kernel的權重每次按照什麼樣的比例來分組,文章給出對各個模型的分組方案:(大括弧中的比例代表每次訓練前有多少的權重已被量化編碼)            Alexnet:{0.3, 0.6, 0.8, 1} ,batch_size:256  weights_decay:0.0005  動量係數:0.9            VGG-16:{0.5, 0.75, 0.875, 1},batch_size:32 weights_decay:0.0005  動量係數:0.9            GoogleNet:{0.2, 0.4, 0.6, 0.8, 1},batch_size:80  weights_decay:0.0005  動量係數:0.9            ResNet-18:{0.5, 0.75, 0.875,1},batch_size:80  weights_decay:0.0005  動量係數:0.9
           ResNet-50: {0.5,0.75, 0.875, 1},batch_size:80  weights_decay:0.0005  動量係數:0.9           每次把權重大的分為一組,權重小的分為一組,後面量化的主要為權重大的那個組。         2.量化編碼:(很多trick,這些trick的理解我可能理解有錯)            首先看下最終編的           不在一個範圍內線性取值,如在0到1間取值{0.1,0.2,0.3,0.4,...1},而是在在一個範圍內以對數的方式取值,在n1到n2間取2的指數,這樣處理的原因就是為了在FPGA等平臺上使用。            現在就是確定n1和n2了,假設n1>n2,那麼可以首先確定的就是n1了                    
(我的理解:由於降取值,也就是小數只取整數部分,必然會帶來誤差,所以s前的係數應為一個大於1的數去補償,為什麼是4/3,後面解釋)            其中s為每個kernel值得絕對值的最大值:                                   現在怎麼確定n2了,如果確定了幾位2進位制的數來儲存,那麼就可以確定n2了。模型中的權重儲存的形式是float32位的形式儲存的,希望使用b位資料來儲存我們的資料,則 n2=n1+1 −2^(b−1)/2.  式子中b-1是為了單獨用1位資料來儲存0(有點奢侈),除以2是由於存在正負數。          量化的過程也很簡單,在Pl中相鄰的兩個數α,β,則權重量化為:
     作者寫了這個公式,也沒說為什麼這樣量化。這個量化規則是非常常規的,就是到這個數距離Pl最近的那個數為量化值,比如2.8到整數3的距離比到整數2的距離小,則量化為3.     根據公式,現在一個權重w量化為β,即這個數到Pl中β的前一個數和後一個數的距離都比β大,怎麼度量就是     而α+β=3β/4,所以上述條件可以寫成3β/4這個條件乘以4/3,得到的區間就是β和2β之間,這就說明了4/3是怎麼來的了。     3.重訓練re-train             訓練的目標函式:                                        改進後的塔索模型的損失函式:     訓練的規則: