INQ

Incremental Network Quantization

[paper]
[code]

思想

  • 将32位浮点数的权值量化成低精度的权值(2的幂次或者0)
    • 低精度是指相邻的两个权值之间还有多少个数。参考刻度尺的精度。
    • 量化成2的幂次方之后一方面是作乘法的时候就变成移位操作,另一方面量化成低精度的权值可以通过编码来存储,从而减少模型在嵌入式设备的存储大小。

算法

  1. 先将预训练好的模型的权值进行分组,第一组是准备进行量化的,第二组是需要重新训练以弥补量化权值带来的精度损失。
  2. 将第一组进行量化,使第一组的权值量化成(2的幂次方或者0)
  3. 将量化之后的权值矩阵(包含量化后的第一组已经需要重新训练的第二组)重新训练,更新第二组的权值以此弥补第一组量化后带来的精度损失。
  4. 重复上述步骤直到所有权值都被量化。

结构图

fig1:第一个图中黑色是需要量化的,白色的是需要重新训练的,经过量化和重新训练之后的结果如第三个图所示,绿色的为量化后的结果,灰色的需要进行分组、量化和重新训练的操作。

具体实现

  • 分组

    • 原始权重模型 {Wl:1<=l<=L} ,其中, l 代表第l层,它是一个四维张量, NCHW , N 代表l+1层的通道数 C 代表l层的通道数, HW 代表卷积核的大小,如果是全链接层的话,则权重矩阵为二维的张量。
    • 将原始权重矩阵分成 A(1)l (即将量化), A(2)l (需要重新训练的) ,
      A(1)lA(2)l={Wl(i,j)},A(1)lA(2)l=,
      为了进行分组,定义一个二值矩阵(为了更好的实现这个分组算法),当
      Wl(i,j)A(1)l,Tl(i,j)=0
      同理,
      Wl(i,j)A(2)l,Tl(i,j)=1
    • 分组策略,采取修剪激励策略,即具有较大的绝对值的权值更重要,换句话说就是具有较大的绝对值的权值已经奠定了网络的整体精度的基础,较小绝对值的权值是在这个基础上进行修修补补,因此,可以将这些具有较大绝对值的权值划分到即将量化的权值矩阵中,具有较小的绝对值的权值划分到需要重新训练的矩阵中。具体实现要参考github上的代码。
    • 量化

      • 最终目的是将 Wl 量化成低精度的 Wˆl ,其中, Wˆl 的每个元素都来自
        Pl={±2n1,,±2n2,0}
      • 将第 n 次分组好的权值矩阵表示为W(n)l=TlW(n1)l,然后量化的位宽 b ,,这个位宽指的是编码存储权值的位长,实际上这个是指量化后的权值存放在嵌入式上所需要的位宽,并不是指跑完INQ网络后,原来的vgg_caffemodel为537.2M会变小,因为量化后权值在计算机的存储还是双精度浮点型,因此量化后的vgg_caffemodel还是537.2M。
      • 定好b 之后,需要计算 n1 ,
        n1=floor(log2(4s/3),s=max(abs(Wl))
        ,以此可以得到 n2=n1+12(b1)/2 也就是说 Pl 定下来了。
      • 对第i阶段分好组得权值矩阵进行量化
        Wˆ(n)l(i,j)={βsgn(W(n)l(i,j)),3n+1,if (α+β)/2abs(W(n)l(i,j)<3β/2otherwise

        其中, α β Pl 排序之后相邻的两个元素。
    • 重新训练

      • INQ重训练的目的是将由量化造成的损失降至最低值,用数学式子来表达就是:

        minWl=L(Wl)+λR(Wl)

        s.t.Wl(i,j)Pl,ifTl(i,j)=0,1lL

      使用SGD算法更新权值可以表示如下:

      Wl(i,j)Wl(i,j)γdEdWl(i,j)Tl(i,j)

      前面提到当 Wl(i,j) 需要量化的话 Tl(i,j)=0 ,否则 Tl(i,j)=1 ,因此从上面的式子可以知道权重更新只更新需要重新训练的权值。

整体算法

  • 输入:训练数据 X ,预训练模型{Wl:1lL},量化权值占的累计比重 σn
  • 输出:量化后的权值矩阵 {Wlˆ:1lL} Wlˆ 中每个数值都为2的幂次方或者0。

    1.初始化 A(1)l A(2)l{Wl(i,j)} Tl1 ,for 1lL

    2. forn=1,2,,N

    i.设置base learning rate 和 learning policy。

    ii.根据 σn 设定需要量化权值的比例更新 A(1)l A(2)l 以及 Tl

    iii.由 A(1)l 和给定的位宽 b 得到相应的Pl

    iv. 量化 A(1)l

    v. 计算feed-forward loss ,更新 A(2)l

代码解读

  • to be continued
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值