INQ(incremental network quantization:towards lossless CNNs with low-precision weights
阿新 • • 發佈:2019-01-01
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
訓練的目標函式:
改進後的塔索模型的損失函式:
訓練的規則:
(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