clipping. 設定兩個截止點標量c−c−
和c+ c
+,用超引數
p p
來確定,使正引數中(p
×100)%
' role="presentation">(p×
100)%(
p×100)
%的引數小於c+c+
,同時使負引數中(p
×100)%(p
×100)%
的引數大於c−c−
。位於c
− c−和c
+ c
+之間的引數置為0。注意的是這種減除是暫時的,在下個週期中,用這個規則作用於更新後的引數,之前被剪枝的連線可能會重新出現。
partitioning。第二步把未被剪掉的引數分到不同的量化區間。可以被視覺化到乙個一維數軸上。通過給定的權重位寬
b b
,將數軸劃分為2b
−1' role="presentation">2b−
12b−
1個區間,再加上從c−c−
到c+ c
+的0區間。文中採用了deep compression中linear (uniform) partitioning方式。
quantizing.量化值是由量化區間中的值平均得來的,並在下次的前向傳播中賦值。和clipping一樣,值只是暫時的量化,可能在後面的過程進行更改。
首先設定p=
0.25,b
=2p
=0.25,b
=2根據設定的閾值減去不需要的小權重;
剩下的12個權重分為22
−1=322
−1=3
類;計算每一類的均值,作為量化值。
訓練中量化值和全精度值都會被跟蹤,其中全精度值用於引數更新和反向傳播,量化值用於前向計算。訓練完成之後只需要保留量化值即可。整體演算法的偽**如圖:
演算法中的超引數有p,
b p,b
兩個,文中採用貝葉斯優化方法確定最優引數θi
=(pi
,bi)
θ i=
(pi,
bi):
minθϵ(
θ)−λ
⋅ci(
θ)minθϵ
(θ)−
λ⋅ci
(θ)對於第
i i
層,ϵ(
θ)' role="presentation">ϵ(θ
)ϵ(θ
)為top1誤差,ci
(θ) ci(
θ)表示壓縮效果,經由:ci
(θ)=
(mi−
si(θ
))/∑
imi ci(
θ)=(
mi−s
i(θ)
)/∑i
mi計算得來。其中mi
m i是
i i
層需要以非壓縮形式儲存的權重所需的位元數,si
(θ)' role="presentation">si(
θ)si
(θ)是使用稀疏編碼方案在使用
θ θ
進行剪枝量化之後來儲存所需的位元數。後面使用高斯過程進行建模,有些複雜,不再進行講解。
其實這個方法很容易想到,最大的創新我覺得也是他超引數的自動設定了。由於每個mini-batch之後繼續更新,所以是一種不固定的量化剪枝,因而給定的b,
p b,p
引數也隨著網路不斷更新。結果在googlenet 上有10x壓縮,resnet-50有15x,還是不錯的。但實際上真的需要用超引數的自動設定嗎?從目前自己的實驗上來看感覺也沒有那麼重要,損失可能也就在1%以內。