• Dynamic Network Surgery for Efficient DNNs 笔记


    文章采用的记号与变量:

    1. (left{mathbf{W}_{k}: 0 leq k leq C ight}) 中的 (W_k) 表示第 k 层的连接的矩阵,
    2. 对于一个有 (p) 维的输入与 (q) 维的输出, 矩阵 (W_k) 的维度为 (q_{k} imes p_{k})
    3. 为了表示稀疏矩阵, 可以引入矩阵, (T_k) , 其中 (T_k) 是一个二进制的矩阵, 其中的数字表示网络连接的状态
    4. 对于卷积神经网络的卷积层, 我们讲核进行

    剪枝的方法

    剪枝的关键问题在于如何判断这个节点的重要性, 我们以第 (k) 层为例:

    我们需要解决的优化问题如下面所示:

    [min _{mathbf{W}_{k}, mathbf{T}_{k}} Lleft(mathbf{W}_{k} odot mathbf{T}_{k} ight) quad ext { s.t. } mathbf{T}_{k}^{(i, j)}=mathbf{h}_{k}left(mathbf{W}_{k}^{(i, j)} ight), forall(i, j) in mathcal{I} ]

    其中 (L) 是网络的损失函数, (h_k) 是一个判断函数, 满足 (mathbf{h}_{k}(w)=1) 如果在第 (k) 层, (w) 十分的重要, 否则 (mathbf{h}_{k}(w)=0) . (odot) 是矩阵的元素积的意思,

    那么上面的公式应该如何优化呢?

    (T_k) 矩阵是可以由 (h_k) 计算出来的, 那么每一步的 (W_k) 矩阵的更新可以使用随机梯度下降和拉格朗日乘子法:

    [mathbf{W}_{k}^{(i, j)} leftarrow mathbf{W}_{k}^{(i, j)}-eta frac{partial}{partialleft(mathbf{W}_{k}^{(i, j)} mathbf{T}_{k}^{(i, j)} ight)} Lleft(mathbf{W}_{k} odot mathbf{T}_{k} ight), forall(i, j) in mathcal{I} ]

    其中 (eta) 表示的是学习率, 我们要注意到, 这一步不仅仅是更新 (W_k) 其实也是更新了 (T_k) .

    那么训练的过程(本质是对一个model 的 retrain)是:

    1. 对于一个已经训练好的模型的矩阵 (W_k)
    2. 插入一个矩阵 (T_k) , 然后前向传播
    3. 然后反向传播, 更新 (W_k)(T_k),
    4. 这种方法能够决定某个参数重要的最关键的是函数 (h_k) , 这也使得每次会更新矩阵 (T_k)

    h函数的选择

    这个函数的选择至关重要, 那么该如何选择呢? 可以很自然的想到和矩阵 (W_k) 的参数的均值与方差有关, 但是文章并没有给出具体的计算方式, 而是给出一个基于阈值的方法, 计算方法如下:

    [mathbf{h}_{k}left(mathbf{W}_{k}^{(i, j)} ight)=left{egin{array}{ll} 0 & ext { if } a_{k}>left|mathbf{W}_{k}^{(i, j)} ight| \ mathbf{T}_{k}^{(i, j)} & ext { if } a_{k} leqleft|mathbf{W}_{k}^{(i, j)} ight|<b_{k} \ 1 & ext { if } b_{k} leqleft|mathbf{W}_{k}^{(i, j)} ight| end{array} ight. ]

  • 相关阅读:
    PAT 2016 数据的交换输出
    HDU 2020 绝对值排序
    HDU 2013 蟠桃记
    HDU 2005 第几天?
    HDU 2004 成绩转换
    系统时钟初始化
    array_map 去除数组参数里面左右两端空格
    建立自己的异常类方式
    laravel withCount 统计关联数量
    laravel门面和服务提供者使用
  • 原文地址:https://www.cnblogs.com/wevolf/p/12402596.html
Copyright © 2020-2023  润新知