在进行int8量化感知训练时,权重和特征是这样传递的,浮点型的特征Arl−1经过量化后变成int8比特的Aql−1,然后再反量化为Ar′l−1,Wrl也是同样,量化为Wql,再反量化为Wr′l,于是,Wr′l和Ar′l−1这两个浮点数进行卷积运算,加上偏置后结果为浮点数Arl,再经过量化,可得Aql,如下图所示A^{l-1}_r经过量化后变成int8比特的A^{l-1}_q,然后再反量化
\\为A^{l-1}_{r'},W^l_r也是同样,量化为W^l_q,再反量化为W^{l}_{r'},
\\于是,W^l_{r'}和A^{l-1}_{r'}这两个浮点数进行卷积运算,加上
\\偏置后结果为浮点数A^{l}_r,再经过量化,可得A^l_q,
\\如下图所示Arl−1经过量化后变成int8比特的Aql−1,然后再反量化为Ar′l−1,Wrl也是同样,量化为Wql,再反量化为Wr′l,于是,Wr′l和Ar′l−1这两个浮点数进行卷积运算,加上偏置后结果为浮点数Arl,再经过量化,可得Aql,如下图所示
deq是反量化操作,q则是量化操作。
由于梯度反向传播时对精度要求较高,因此训练时更新的是浮点型的权重,即量化之前的权重,在训练时,卷积运算是浮点型的权重和特征进行计算,如图中的Conv单元,而在训练结束推断时,为了使用int8进行推断,我们将上图中的deq、conv、q单元整体看成一个量化后的卷积运算单元,这样,这个新的卷积运算单元的输入是int8的权重和特征,输出也是int8。
再看是如何计算的
设反量化操作deq为
r=S(q-Z)
则训练时的浮点卷积运算为rout=rifmap∗rweight,∗为卷积或矩阵乘法运算,带入上式得r_{out}=r_{ifmap}*r_{weight},
\\*为卷积或矩阵乘法运算,带入上式得rout=rifmap∗rweight,∗为卷积或矩阵乘法运算,带入上式得
Sout(qout−Zout)=Sifmap(qifmap−Zifmap)∗Sweight(qweight−Zweight)S_{out}(q_{out}-Z_{out})=S_{ifmap}(q_{ifmap}-Z_{ifmap})*S_{weight}(q_{weight}-Z_{weight})Sout(qout−Zout)=Sifmap(qifmap−Zifmap)∗Sweight(qweight−Zweight)
整理可得
qout=M(qifmap−Zifmap)∗(qweight−Zweight)+Zoutq_{out}=M(q_{ifmap}-Z_{ifmap})*(q_{weight}-Z_{weight})+Z_{out}qout=M(qifmap−Zifmap)∗(qweight−Zweight)+Zout
其中M=Sifmap∗SweightSout是一个浮点数。M=\dfrac{S_{ifmap}*S_{weight}}{S_{out}}是一个浮点数。M=SoutSifmap∗Sweight是一个浮点数。
总之,经过一番化简整理,可以得到简单的int8数据之间的乘法(当然M需要稍微进行处理)
从上面的式子可以看出,Z应该是整型。
上边的分析中没有设计到激活函数,若使用ReLu激活函数,则如下图
INT8量化感知训练原理分析
于 2020-09-23 23:43:28 首次发布