巴西足球

第 13 章 二值化网络

第 13 章 二值化网络

卷积网络取得了巨大成功,广泛应用于图像、语音和语言领域,但它巨大的权重数量(几百兆浮点数)和运算量(上千兆的浮点数乘法)限制了其应用范围。卷积网络主要运行在GPU上,很少使用在CPU和嵌入式系统(如ARM)上。在手机上很?#35328;?#34892;卷积网络,因此通常采用的做法是,手机先把图像无线传输到云端,云端的GPU运行卷积网络,再把结果传回手机。如果卷积网络能在移动设备(如手机)上运行,则会大大促进卷积网络的普及,促进社会发展。为此,我们研发了多种技术来减小卷积网络的权重数量和运算量。第10章介绍的轻量网络就是一种具有代表性的技术,通过巧妙的网络结构,直接减小权重数量和运算量。还有一种技术是通过量化权重,来减小权重的存储空间,但并不减小其数量,比如权重是浮点数,需要32个比特(bit);如果变为整数,只需要8个bit;进一步变为{+1, -1},仅需要1个bit,这大大减小了存储空间。卷积网络的主要运算是激活和权重的矩阵乘法(浮点数乘法),如果能把浮点数乘法变为浮点数加减法,甚至是逻辑运算,就能大大提高运算速?#21462;?#38477;低功耗。二值化网络(XNOR Net)是一种量化技术,通过把权重?#22270;?#27963;量化为{+1, -1},减小了存储空间(原来的1/15)、提高了运算速度(原来的10倍)?#22270;?#23567;了功耗(原来的1/30)。

13.1 权重二值化

最简单的二值化网络是只对权重进行二值化,即权重只取+1或-1。训练网络时,先计算权重的梯度,然后进行权重更新,而为了使训练过程稳定收敛,权重每次的更新量很小。这样一来,如果训练过程中权重只取+1或-1,由于更新量很小,很难使权重从+1改变为-1,权重值在训练过程中几乎不会发生变化,不能进行学习。为此,在训练过程?#34892;?#35201;引入浮点数权重,利用浮点数权重进行更新。二值化权重?#23884;?#28014;点数权重进行二值化得到的,最简单也最常用的二值化函数是符号函数sign,即浮点数权重w_r大于等于0时,二值化权重w_b为+1,否则为-1。

\boldsymbol{w}_b=\boldsymbol{sign}(\boldsymbol{w}_r)~~~~~~~~~~~~~~~~~~~~~~~~(13.1)

网络训?#27867;?#21518;,只需保存二值化权重w_b,浮点数权重w_r不需保存。进行预测时,网络前向运算为:

\begin{aligned}&~~\boldsymbol{a}_1=\boldsymbol{xw}_{\boldsymbol{b\emph{1}}},~\boldsymbol{h}_1=\boldsymbol{f}(\boldsymbol{a}_1),\\&~~~~~~~~~~~~~~~~~~\vdots\\&\boldsymbol{a}_{\boldsymbol{i}}=\boldsymbol{h}_{\boldsymbol{i}-1}\boldsymbol{w}_{\boldsymbol{bi}},~\boldsymbol{h}_{\boldsymbol{i}}=\boldsymbol{f}(\boldsymbol{a}_{\boldsymbol{i}}),\\&~~~~~~~~~~~~~~~~~~\vdots\\&~~~\boldsymbol{a}_{\boldsymbol{n}}=\boldsymbol{h}_{\boldsymbol{n}-1}\boldsymbol{w}_{\boldsymbol{bn}},~\boldsymbol{h}_{\boldsymbol{n}}=\boldsymbol{a}_{\boldsymbol{n}}\end{aligned}~~~~~~~~~~~~~~~~~~~~~~~~(13.2)

其中x是输入,h_n是网络预测值,{\rm f}(x)是非线性激活函数。预测过程和常规网络一样,只是权重采用二值化权重w_b。由于权重为{+1, -1},矩阵乘法\boldsymbol{a}_i=h_{i-1}w_{bi}变为浮点数加减法,能降低功耗和提高速?#21462;?/p>

网络训练时,由于只能对浮点数权重w_r进行更新,?#26159;?#21521;运算为:

\begin{aligned}&\boldsymbol{w}_{\boldsymbol{b}\emph{1}}=\boldsymbol{sign}(\boldsymbol{w}_{\boldsymbol{r}\emph{1}}),~\boldsymbol{a}_1=\boldsymbol{xw}_{\boldsymbol{b}\emph{1}},~\boldsymbol{h}_1=\boldsymbol{f}(\boldsymbol{a}_1),\\&~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\vdots\\&\boldsymbol{w}_{\boldsymbol{bi}}=\boldsymbol{sign}(\boldsymbol{w}_{\boldsymbol{ri}}),~\boldsymbol{a}_{\boldsymbol{i}}=\boldsymbol{h}_{\boldsymbol{i}-1}\boldsymbol{w}_{\boldsymbol{bi}},~\boldsymbol{h}_{\boldsymbol{i}}=\boldsymbol{f}(\boldsymbol{a}_{\boldsymbol{i}})\\&~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\vdots\\&~\boldsymbol{w}_{\boldsymbol{bn}}=\boldsymbol{sign}(\boldsymbol{w}_{\boldsymbol{rn}}),~\boldsymbol{a}_{\boldsymbol{n}}=\boldsymbol{h}_{\boldsymbol{n}-1}\boldsymbol{w}_{\boldsymbol{bn}},~\boldsymbol{h}_{\boldsymbol{n}}=\boldsymbol{a}_{\boldsymbol{n}}\\&~~~~~~~~~~~~~~~~~~~~~~\boldsymbol{c}=\boldsymbol{L}(\boldsymbol{h}_{\boldsymbol{n}},\boldsymbol{y}_0)\end{aligned}~~~~~~~~~~~~~~~~~~~~~~~~(13.3)

y_0x对应标签,{\rm L}(h_0,y_0)是损失函数。先对浮点数权重w_r进行二值化,得到二值化权重w_b,然后进行矩阵乘法。难点是计算损失对w_r的梯度,根据链式法则得到损失c对权重w_b的梯度,损失c对权重w_r的梯度为:

\frac{\partial \boldsymbol{c}}{\partial \boldsymbol{w}_{\boldsymbol{r}}}=\frac{\partial \boldsymbol{c}}{\partial \boldsymbol{w}_{\boldsymbol{b}}}\frac{\partial \boldsymbol{sign}(\boldsymbol{w}_{\boldsymbol{r}})}{\partial \boldsymbol{w}_{\boldsymbol{r}}}~~~~~~~~~~~~~~~~~~~~~~~~(13.4)

需要计算符号函数的偏导数,由于符号函数的偏导数几乎处处为0,导致损失c对权重w_r的梯度也几乎处处为0,因此权重w_r难以更新。为了解决此问题,引入直通估计(Straight-Through Estimator, STE),把符号函数的偏导数定义为:

\frac{\partial \boldsymbol{sign}(\boldsymbol{w}_{\boldsymbol{r}})}{\partial \boldsymbol{w}_{\boldsymbol{r}}}=1_{|\boldsymbol{w}_{\boldsymbol{r}}|\leqslant1}~~~~~~~~~~~~~~~~~~~~~~~~(13.5)

当权重w_r的绝对值小于等于1时,梯度为1,否则为0。因此,当权重w_r绝对值小于等于1时,损失c对权重w_r的梯度直接等于损失c对权重w_b的梯度,这就是直通估计。权重w_r的绝对值大于1时,损失c对权重w_r的梯度为0。

训练过程如下:首先权重w_r随机初始化;然后采用公式(13.3)进行前向计算,计算损失c对权重w_b的梯度,根据公式(13.4)和公式(13.5)计算损失c对权重w_r的梯度,权重w_r进行更新,完成一次迭代。

前面是以传统网络为例进行介绍的,卷积网络也完全一样,因为卷积运算经过整理后变为矩阵乘法,前向计算和公式(13.3)一样。由于代码很简单,此处省略,读者可以参考随书代码。代码实现时,没有进行优化,只展示算法原理。

13.2 XNOR网络

仅对权重进行二值化,矩阵乘法变为浮点数加减法,虽然理论上存储量能获得32倍的提升,但提速效果十分有限,不到2倍。如果激活二值化为{+1, -1},则矩阵乘法只需要进?#26032;?#36753;同或(XNOR)运算和对+1进行计数,极大提高运算速?#21462;NOR是数字逻辑运算,有2个输入端和1个输出端,当输入电平相同时,输出为高电平(逻辑1)。矩阵乘法?#19978;?#37327;点积构成,假设2个二值化向量为v1=[+1,-1, +1, +1]和v2=[-1, -1, +1, -1],则点积为(+1)×(-1)+(-1)×(-1)+(+1)×(+1)+(+1)×(-1)=(-1)+(+1)+(+1)+(-1)=2×num(+1)-length(v1)=0。+1和-1之间的乘法和XNOR一致,同号为+1,异号为-1。对XNOR结果中的+1进行计数,则点积为2倍的+1数目减去向量的长度,由于向量长度是固定值,所以只需记录+1数目。加入激活二值化的前向运算为:

有几个细节值得注意,对激活进行二值化,相当于引入了非线性,称为二值化激活,所以不再需要非线性激活函数。输入x不能进行二值化,否则丢失太多信息,效果极差。最后一层得分向量a_n也不能进行二值化,否则得分向量不是+1就是-1,无法分类。

XNOR网络在训练过程和权重二值化网络一样,只是非线性激活函数被符号函数取代,利用公式(13.5)进行激活梯度的传递。

13.3 权重尺度化

XNOR网络极大地减小了存储空间和功耗,并提高了运算速度,但由于二值化带来信息丢失,和浮点数网络相比,?#38405;?#19979;降很大。为了提高?#38405;埽?#21487;以对权重进行尺度化,这个过程仅增加极少的运算量和存储空间。矩阵乘法由点积构成,二值化尺度化后的权重和输入的点积尽可能与浮点数权重和输入的点积接近,这样权重量化带来的信息丢失就会最小化,网络?#38405;?#25439;失最小。假设浮点数权重向量为w_r,对应的二值化向量为w_b={\rm sign}(w_r),尺度因子为\alpha(1个正浮点数),输入向量为x_r,则量化后的点积pb=\alpha x_r^{~{\rm T}}w_b要和原始点积pr=x_r^{~{\rm T}}w_r尽量接近,即要求向量差pr-pb的L2范数最小,通过不太复杂的数学运算,得最优\alpha

\alpha=\frac{1}{\boldsymbol{n}}\sum|\boldsymbol{w}_{\boldsymbol{ri}}|~~~~~~~~~~~~~~~~~~~~~~~~(13.7)

即向量w_r绝对值的平均值。

公式(13.7)是权重为向量时的结论,而前向运算中权重是矩阵,此时只需把权重矩阵看成是列向量的集合(线性代数中经常这样),每个列向量计算尺度因子\alpha_i,则权重矩阵的尺度因子是各个尺度因子\alpha_i组成的行向量\boldsymbol{a}。前向运算为:

即先计算二值化权重矩阵和权重尺度向量,然后矩阵乘法,最后二值化激活。矩阵乘法是先计算2个二值矩阵的乘积(XNOR运算),然后再与权重尺度向量进行逐元素的乘法,由于权重尺度是浮点数,这会增加一定的运算量,增加的乘法运算量等于矩阵元素数量,与矩阵乘法运算量相比,占比小,所以影响?#27493;?#23567;。

进行梯度反向传播时有个技巧,即把二值化权重矩阵和尺度因子向量的逐元素乘积矩阵w_{\alpha}作为一个整体进行计算,公式如下:

根据链式法则得到损失c对权重w_{\alpha}的梯度,损失c对权重w_r的梯度为:

\frac{\partial \boldsymbol{c}}{\partial \boldsymbol{w}_{\boldsymbol{r}}}=\frac{\partial \boldsymbol{c}}{\partial \boldsymbol{w}_{\alpha}}\frac{\partial \boldsymbol{signscale}(\boldsymbol{w}_{\boldsymbol{r}})}{\partial \boldsymbol{w}_{\boldsymbol{r}}}=\frac{\partial \boldsymbol{c}}{\partial \boldsymbol{w}_{\alpha}}[\frac{1}{\boldsymbol{n}}+\alpha\frac{\partial \boldsymbol{sign}(\boldsymbol{w}_{\boldsymbol{r}})}{\partial \boldsymbol{w}_{\boldsymbol{r}}}]~~~~~~~~~~~~~~~~~~~~~~~~(13.10)

训练过程和权重二值化网络完全一样。

为了进一步提高?#38405;埽?#23545;激活进行二值化时可以引入尺度因子。这个技巧对?#38405;?#25552;升比较小,但引入的运算量和临时存储空间比较大,读者可根据情况进行选择。

实际应用时,由于网络第1层和最后1层的权重数量少,一般不进行权重量化,而是采用浮点数权重,?#38405;?#33719;得极大提升。

量化技术应用于卷积网络时,有几点需要注意。卷积网络模块一般包括批量归一化层B、二值化激活层A、卷积层C和池化层P,这些层的顺序对?#38405;?#24433;响很大,浮点数网络的顺序为C、B、A、P,但对于量化网络,顺序应为B、A、C、P。因为经过二值化激活层A后,激活不是+1就是-1,如果紧跟池化层P,则激活几乎都是+1。卷积网络中大量存在1×1卷积,但量化网络中,如果采用1×1卷积,对?#38405;?#25439;失很大,所以量化网络中不能有1×1卷积。由于这个原因,量化网络很难对轻量网络进行加速。二值化激活层可以取代非线性激活层,但对复杂网络(如AlexNet、VGG和ResNet),在卷积层后插入非线性层(ReLU)能提高?#38405;堋?/p>

目录

巴西足球 陕西11选5今日走势 看今天3d焰舞字谜 北京快三预测推荐号码 云南快乐10分前三直开将结果 大了透开奖开奖直播 体彩能不能买nba冠军 黑龙江时时财神票 强制进入qq空间软件 辽宁35选7最新开奖结果查询 时时彩计划网页人工