Skip to content

Commit

Permalink
Update markdown show problem
Browse files Browse the repository at this point in the history
  • Loading branch information
HarleysZhang committed Nov 4, 2020
1 parent 80fb467 commit f7ae646
Showing 1 changed file with 10 additions and 1 deletion.
11 changes: 10 additions & 1 deletion 深度学习/神经网络压缩算法总结.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,15 @@
给定权重矩阵 $W\epsilon R^{m*n}$ , 若能将其表示为若干个低秩矩阵的组合,即 $W=\sum_{i=1}^{n}\alpha_{i}M_{i}$ , 其中 $W\epsilon R^{m*n}$ 为低秩矩阵,其秩为 $r_{i}$ , 并满足 $r_{i}<<min(m,n)$ ,则其每一个低秩矩阵都可分解为小规模矩阵的乘积,$M_{i}=G_{i}H_{i}^{T}$ ,其中 $G_{i}\epsilon R^{m*r_{i}}$ ,$H_{i}\epsilon R^{m*r_{i}}$。当 $r_{i}$ 取值很小时,便能大幅降低总体的存储和计算开销。

基于以上想法,Sindhwani 等人提出使用结构化矩阵来进行低秩分解的算法,具体原理可自行参考论文。另一种比较简便的方法是使用矩阵分解来降低权重矩阵的参数,如 Denton 等人提出使用`奇异值分解`(Singular Value Decomposition,简称 SVD)分解来重构全连接层的权重。

### 1.1,总结

低秩近似算法在中小型网络模型上,取得了很不错的效果,但其超参数量与网络层数呈线性变化趋势,随着网络层数的增加与模型复杂度的提升,其搜索空间会急剧增大。

## 二,剪枝与稀疏约束

给定一个预训练好的网络模型,常用的剪枝算法一般都遵从如下操作:

1. 衡量神经元的重要程度
2. 移除掉一部分不重要的神经元,这步比前 1 步更加简便,灵活性更高
3. 对网络进行微调,剪枝操作不可避免地影响网络的精度,为防止对分类性能造成过大的破坏,需要对剪枝后的模型进行微调。对于大规模行图像数据集(如ImageNet)而言,微调会占用大量的计算资源,因此对网络微调到什么程度,是需要斟酌的
Expand All @@ -51,7 +56,10 @@
3. 以PQ方法为基础,Wu等人设计了一种通用的网络量化算法:`QCNN(quantized CNN)`,主要思想在于Wu等人认为最小化每一层网络输出的重构误差,比最小化量化误差更有效。

标量量化算法基本思路是,对于每一个权重矩阵 $W\epsilon R^{1*mn}$,首先将其转化为向量形式:$w\epsilon R^{1*mn}$。之后对该权重向量的元素进行 $k$ 个簇的聚类,这可借助于经典的 `k-均值(k-means)聚类`算法快速完成:
$$\underset{c}{arg min}\sum_{i}^{mn}\sum_{j}^{k}\begin{Vmatrix}​w_{i}-c_{j}\end{Vmatrix}_{2}^{2}$$

$$
\underset{c}{arg min}\sum_{i}^{mn}\sum_{j}^{k}\begin{Vmatrix}​w_{i}-c_{j}\end{Vmatrix}_{2}^{2}
$$

这样,只需将 $k$ 个聚类中心($c_{j}$,标量)存储在码本中,而原权重矩阵则只负责记录各自聚类中心在码本中索引。如果不考虑码本的存储开销,该算法能将存储空间减少为原来的 $log_{2}(k)/32$。基于 $k$ 均值算法的标量量化在很多应用中非常有效。参数量化与码本微调过程图如下:

Expand Down Expand Up @@ -87,6 +95,7 @@ def residual_unit(data, num_filter, stride, dim_match, num_bits=1):
### 4.1,二值网络的梯度下降

现在的神经网络几乎都是基于梯度下降算法来训练的,但是二值网络的权重只有 $\pm 1$,无法直接计算梯度信息,也无法进行权重更新。为解决这个问题,[Courbariaux](https://arxiv.org/pdf/1602.02830v1.pdf) 等人提出二值连接(binary connect)算法,该算法采取单精度与二值结合的方式来训练二值神经网络(),这是第一次给出了关于如何对网络进行二值化和如何训练二值化神经网络的方法。过程如下:

1. 权重 `weight` 初始化为浮点
2. 前向传播 `Forward Pass`:
+ 利用决定化方式(`sign(x)函数`)把 Weight 量化为 `+1/-1`, 以0为阈值
Expand Down

0 comments on commit f7ae646

Please sign in to comment.