Trained Ternary Quantization
0 我的总结
- 3元组
- 3元非对称,除0外均是训练得到
- 转换3元时,其阈值是变动的,由max_weight绝对值决定
- 探讨了三元中稀疏性对精度的影响,趋近于0(趋紧二元)不好,30~50%较好
1 简介
本文使用了2个全精度尺度系数 W l p W^p_l Wlp, W l n W^n_l Wln,把权重全部量化为三元组 { − W l n , 0 , + W l p } \{-W_l^n, 0, +W^p_l\} {−Wln,0,+Wlp},而非传统的 { − 1 , 0 , + 1 } \{-1, 0, +1\} {−1,0,+1}或者 { − E , 0 , + E } \{-E,0,+E\} {−E,0,+E}。后者是固定的而非学习所得到。该论文采用的 W l p W^p_l Wlp, W l n W^n_l Wln是通过训练所得到的,和权重一起更新。训练的时候,隐权重的全精度性仍然保留,在测试的时候把全精度权重弃置不用,以此达到压缩、加速之效果。
2 动机
传统方法是把32bit变成1或者2bit,虽然压缩率高,但是这种方法在精确度上表现上不甚优秀。因而考虑采用三元组来使压缩后的精度损失降低一下。
3 相关工作
3.1 BNN
讲的是2015.Lin的工作,使用的是概率方法来把32bits权重变成二值或者三值的权重,具体是这样:
w
b
∼
B
e
r
n
o
u
l
l
i
(
w
~
+
1
2
)
×
2
−
1
w^b \sim Bernoulli(\frac{\tilde{w}+1}{2})×2-1
wb∼Bernoulli(2w~+1)×2−1
w
t
∼
B
e
r
n
o
u
l
l
i
(
∣
w
~
∣
)
×
s
i
g
n
(
w
~
)
w^t \sim Bernoulli(|\widetilde{w}|)×sign(\tilde{w})
wt∼Bernoulli(∣w
∣)×sign(w~)
w ~ \tilde{w} w~这里是表示全精度的权重
BP的时候,因为以上这种表示法造成 w b , w t w^b,w^t wb,wt不能求导,所以就计算伯努利分布的期望的导数。
∂ L ∂ w ~ = ∂ L ∂ w b = ∂ L ∂ w t \frac{\partial L}{\partial \tilde{w}}=\frac{\partial L}{\partial w^b}=\frac{\partial L}{\partial w^t} ∂w~∂L=∂wb∂L=∂wt∂L
L代表loss值
Binary表示,可以缩小32倍
3.2 DOREFA-NET
也是binary网络,但是它们的二值化更为简单。
w
b
=
E
(
∣
w
~
∣
)
×
s
i
g
n
(
w
~
)
w^b = E(|\tilde w|) \times sign(\tilde w)
wb=E(∣w~∣)×sign(w~)
梯度算法和上面一样。
3.3 Ternary weight networks (2016 nips)
Li&liu 2016年的论文TWN,通过引入一个0作为第三个量化值,减少了二值化带来的精度损失。使用了对称的阈值 ± △ l ±\triangle_l ±△l,来产生一个尺度因数 W l W_l Wl,由 { − W l , 0 , + W l } \{ -W_l,0,+W_l\} {−Wl,0,+Wl}来给第 l l l层的权值做量化。
w l t = { W l : w ~ l > △ l 0 : ∣ w ~ l ∣ ≤ △ l − W l : w ~ l < − △ l w_l^t=\left\{ \begin{aligned} W_l: \tilde w_l > \triangle_l \\ 0: |\tilde w_l| ≤ \triangle_l \\ -W_l: \tilde w_l < -\triangle_l \end{aligned} \right. wlt=⎩⎪⎨⎪⎧Wl:w~l>△l0:∣w~l∣≤△l−Wl:w~l<−△l
可以看出,其量化精度的重点在于Li的这个方法是怎么确定
W
l
W_l
Wl和
±
△
l
±\triangle_l
±△l的。该方法是通过求解优化问题,使全精度权重与ternary权重的L2距离最小化,从而得出
W
l
W_l
Wl和
±
△
l
±\triangle_l
±△l。具体地:
±
△
l
=
0.7
×
E
(
∣
w
~
l
∣
)
±\triangle_l=0.7 \times E(|\tilde w_l|)
±△l=0.7×E(∣w~l∣)
W
l
=
E
(
∣
w
~
l
∣
)
W_l = E(|\tilde w_l|)
Wl=E(∣w~l∣)
其中这个
i
∈
{
i
∣
∣
w
~
l
∣
>
△
}
i∈\{ i | |\tilde w_l| > \triangle\}
i∈{i∣∣w~l∣>△} (这里TTQ这个论文好像少打了一个|吧)
也是使用等式2去计算梯度的。
这种ternary的方法虽然要比binary多消耗一个bit去进行权重压缩,但是TWN得到了一个非常接近与全精度网络的优秀验证结果(论文声称)。
3.4 Deep compression 深度压缩
2015年Han提出了一个深度压缩方法,通过裁剪网络,kmeans聚类权重,Huffman编码来减少权重的精度。通过一个预先训练好的网络框架,进行fine-tuned来得到低精度的权重。每个权重的assignment(就是类索引标号)建立之后就保持不变,而每个类的centroid值在fine-tuning中进行更新。
4 method
4.1
方式如图。
- 权重除以max_weight,把weight归一化到[-1,1];
- 规定阈值 t t t,从而把[-1,1]之间的值变成三元组{-1,0,1}中的一个值。t是个层不变的超参数,设为0.05。
- 最后,通过BP两个梯度来进行学习性的量化。BP梯度1是以更新全精度权值的,梯度2更新尺度系数 W l p W^p_l Wlp, W l n W^n_l Wln。就是说,前者学习ternary assignments(更新全精度权重的值,从而类别标号的分配会变动,比如原来是-1,后来变成1),后者学ternary values(类别值)。
+1和-1分别是 W l p W^p_l Wlp, W l n W^n_l Wln的索引。0就是0。那么就可以这么写:
w l t = { W l p : w ~ l > △ l 0 : ∣ w ~ l ∣ ≤ △ l − W l n : w ~ l < − △ l w_l^t=\left\{ \begin{aligned} W_l^p: \tilde w_l > \triangle_l \\ 0: |\tilde w_l| ≤ \triangle_l \\ -W_l^n: \tilde w_l < -\triangle_l \end{aligned} \right. wlt=⎩⎪⎨⎪⎧Wlp:w~l>△l0:∣w~l∣≤△l−Wln:w~l<−△l
这篇paper所谓之创新就在于此处了,其他的paper所定义的quantized weights都是32bit的全精度weight中直接求出来的。而这篇里面是通过学习得到的,是和其他参数一起训练得到的。
至于
w
~
l
\tilde w_l
w~l以及
W
l
p
W^p_l
Wlp,
W
l
n
W^n_l
Wln梯度的求取问题:
梯度2
梯度1
4.2
1)
△
l
=
t
×
m
a
x
(
∣
w
~
∣
)
\triangle_l = t \times max(|\tilde w|)
△l=t×max(∣w~∣)
其中对于CIFAR-10上的测试,设t=0.05,层不变
2)对于所有层,维持一个恒定的sparsity
r
r
r(max值的-5%到+5%都变成0)。
通过调整
r
r
r就可以调整ternary weight network的多种稀疏性。论文通过设定不同的
r
r
r进行Imagenet里的训练,来探寻这种稀疏性的影响。
实验开展所使用的是TF和Caffe。