Skip to content

Commit

Permalink
Update some file
Browse files Browse the repository at this point in the history
  • Loading branch information
HarleysZhang committed Sep 22, 2021
1 parent c58d96b commit da18389
Show file tree
Hide file tree
Showing 7 changed files with 53 additions and 11 deletions.
4 changes: 3 additions & 1 deletion 5-deep_learning/4-深度学习面试题.md
Original file line number Diff line number Diff line change
Expand Up @@ -531,7 +531,7 @@ L1 范数(`L1 norm`)是指向量中各个元素绝对值之和,也有个

### 十九,BN(批归一化)的作用

在神经网络中间层也进行归一化处理,使训练效果更好的方法,就是批归一化Batch Normalization(BN)
在神经网络中间层也进行归一化处理,使训练效果更好的方法,就是批归一化Batch Normalization(BN)

(1). **可以使用更高的学习率**。如果每层的 `scale` 不一致,实际上每层需要的学习率是不一样的,同一层不同维度的 scale 往往也需要不同大小的学习率,通常需要使用最小的那个学习率才能保证损失函数有效下降,Batch Normalization 将每层、每维的 scale 保持一致,那么我们就可以直接使用较高的学习率进行优化。

Expand All @@ -543,6 +543,8 @@ L1 范数(`L1 norm`)是指向量中各个元素绝对值之和,也有个

(5). **Batch Normalization调整了数据的分布,不考虑激活函数,它让每一层的输出归一化到了均值为0方差为1的分布**,这保证了梯度的有效性,可以解决反向传播过程中的梯度问题。目前大部分资料都这样解释,比如 BN 的原始论文认为的缓解了 Internal Covariate Shift(ICS) 问题。

关于训练阶段和推理阶段 `BN` 的不同可以参考 [Batch Normalization详解](https://www.cnblogs.com/shine-lee/p/11989612.html)

### 二十,什么是梯度消失和爆炸

+ 梯度消失是指在深度学习训练的过程中,梯度随着 `BP` 算法中的链式求导逐层传递逐层减小,最后趋近于0,导致对某些层的训练失效;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

### 标准卷积

一个滤波器(`3` 维卷积核)在输入特征图 $h_1 \times w_1 \times c_1$ 大小的区域内操作,输出结果为 `1``feature map` ,因为输出 `feature map` 的数量为 $c_2$ 个,所以需要 $c_2$ 个滤波器。标准卷积抽象过程如下图所示。
一个大小为 $h_1\times w_1$ 过滤器(`2` 维卷积核),沿着 `feature map` 的左上角移动到右下角,过滤器每移动一次,将过滤器参数矩阵和对应特征图 $h_1 \times w_1 \times c_1$ 大小的区域内的像素点相乘后累加得到一个值,又因为 `feature map` 的数量(通道数)为 $c_1$,所以我们需要一个 `shape` 为 $ (c_1, h_1, w_1)$ 的滤波器( `3` 维卷积核),将每个输入 featue map 对应输出像素点位置计算和的值相加,即得到输出 feature map 对应像素点的值。又因为输出 `feature map` 的数量为 $c_2$ 个,所以需要 $c_2$ 个滤波器。标准卷积抽象过程如下图所示。

![标准卷积过程](../../data/images/mobilenetv1/标准卷积过程.png)

Expand All @@ -20,7 +20,7 @@

![分组卷积](../../data/images/mobilenetv1/分组卷积.png)

**分组卷积的定义**:对输入 `feature map` 进行分组,然后分组分别进行卷积。假设输入 feature map 的尺寸为 $H \times W \times c_{1}$,输出 feature map 数量为 $c_2$ 个,如果将输入 feature map 按通道分为 $g$ 组,则每组特征图的尺寸为 $H \times W \times \frac{c_1}{g}$,**每组**对应的滤波器(卷积核)的 尺寸 为 $h_{1} \times w_{1} \times \frac{c_{1}}{g}$,每组的滤波器数量为 $\frac{c_{2}}{g}$ 个,滤波器总数依然为 $c_2$ 个。每组的滤波器只与其同组的输入 map 进行卷积,每组输出特征图尺寸为 $H \times W \times \frac{c_{2}}{g}$,将 $g$ 组卷积后的结果进行拼接 (`concatenate`) 得到最终的得到最终尺寸为 $H \times W \times c_2$ 的输出特征图,其分组卷积过程如下图所示:
**分组卷积的定义**:对输入 `feature map` 进行分组,然后分组分别进行卷积。假设输入 feature map 的尺寸为 $H \times W \times c_{1}$,输出 feature map 数量为 $c_2$ 个,如果将输入 feature map 按通道分为 $g$ 组,则每组特征图的尺寸为 $H \times W \times \frac{c_1}{g}$,**每组**对应的滤波器(卷积核)的 尺寸 为 $h_{1} \times w_{1} \times \frac{c_{1}}{g}$,每组的滤波器数量为 $\frac{c_{2}}{g}$ 个,滤波器总数依然为 $c_2$ 个,即分组卷积的卷积核 `shape` 为 $(c_2,\frac{c_1}{g}, h_1,w_1)$。每组的滤波器只与其同组的输入 map 进行卷积,每组输出特征图尺寸为 $H \times W \times \frac{c_{2}}{g}$,将 $g$ 组卷积后的结果进行拼接 (`concatenate`) 得到最终的得到最终尺寸为 $H \times W \times c_2$ 的输出特征图,其分组卷积过程如下图所示:

![分组卷积过程2](../../data/images/mobilenetv1/分组卷积过程2.png)

Expand All @@ -36,10 +36,10 @@ $$

从以上公式可以得出分组卷积的参数量和计算量是标准卷积的 $\frac{1}{g}$ 的结论 ,但其实对分组卷积过程进行深入理解之后也可以直接得出以上结论。

**分组卷积的深入理解**:对于 $1\times 1$ 卷积,常规卷积输出的特征图上,每一个像素点是由输入特征图的 $h_1 \times w_1 \times c_1$ 个点计算得到,而分组卷积输出的特征图上,每一个像素点是由输入特征图的 $h_1 \times w_1 \times \frac{c_1}{g}$个点得到(参考常规卷积计算过程)。**卷积运算过程是线性的,自然,分组卷积的参数量和计算量是标准卷积的 $\frac{1}{g}$ 了**
**分组卷积的深入理解**:对于 $1\times 1$ 卷积,常规卷积输出的特征图上,每一个像素点是由输入特征图的 $c_1$ 个点计算得到,而分组卷积输出的特征图上,每一个像素点是由输入特征图的 $ \frac{c_1}{g}$个点得到(参考常规卷积计算过程)。**卷积运算过程是线性的,自然,分组卷积的参数量和计算量是标准卷积的 $\frac{1}{g}$ 了**

当分组卷积的分组数量=输入 map 数量=输出 map 数量时,即 $g=c_1=c_2$,有 $c_1$ 个滤波器,每个滤波器尺寸为 $1 \times K \times K$ 时,Group Convolution 就成了 Depthwise Convolution(DW 卷积),**`DW` 卷积的卷积核权重尺寸为** $(c_{1}, 1, K, K)$。
> 常规卷积的卷积核权重 shape 都为(`C_out, C_in, kernel_height, kernel_width`),常规卷积是这样,但是分组卷积的卷积核权重 `shape` 为(`C_out, C_in/g, kernel_height, kernel_width``DW` 卷积的卷积核权重 `shape` 为(`C_in, 1, kernel_height, kernel_width`)。
当分组卷积的分组数量 = 输入 feature map 数量 = 输出 feature map 数量,即 $g=c_1=c_2$,有 $c_1$ 个滤波器,且每个滤波器尺寸为 $1 \times K \times K$ 时,Group Convolution 就成了 Depthwise Convolution(DW 卷积),**`DW` 卷积的卷积核权重尺寸为** $(c_{1}, 1, K, K)$。
> 常规卷积的卷积核权重 shape 都为(`C_out, C_in, kernel_height, kernel_width`),分组卷积的卷积核权重 `shape` 为(`C_out, C_in/g, kernel_height, kernel_width``DW` 卷积的卷积核权重 `shape` 为(`C_in, 1, kernel_height, kernel_width`)。
### 从 Inception module 到 depthwise separable convolutions

Expand Down Expand Up @@ -76,7 +76,7 @@ Figure 4 中的“极限” Inception 模块与本文的主角-深度可分离

![PW卷积过程](../../data/images/mobilenetv1/PW卷积过程.jpg)

假设输入特征图大小为 $D_{G} \times D_{G} \times M$,输出特征图大小为 $D_{G} \times D_{G} \times N$,则滤波器尺寸为 $1 \times 1 \times M$,因此可计算得到 `PW` 卷积的计算量 $MACC = N \times M \times D_{G}^{2}$。
假设输入特征图大小为 $D_{G} \times D_{G} \times M$,输出特征图大小为 $D_{G} \times D_{G} \times N$,则滤波器尺寸为 $1 \times 1 \times M$,且一共有 $N$ 个滤波器。因此可计算得到 `PW` 卷积的计算量 $MACC = N \times M \times D_{G}^{2}$。

综上:`Depthwise``Pointwise` 卷积这两部分的计算量相加为 $MACC1 = M \times D_{G}^{2} \times D_{K}^{2} + N \times M \times D_{G}^{2}$,而标准卷积的计算量 $MACC2 = N \times D_{G}^{2} \times D_{K}^{2} \times M$。所以深度可分离卷积计算量于标准卷积计算量比值的计算公式如下。

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,9 @@

## 2、高效网络设计的实用指导思想

首先,作者分析了两个经典结构 ShuffleNet v1 和 MobileNet v2 的运行时间。
首先,作者分析了两个经典结构 ShuffleNet v1 和 MobileNet v2 的运行时间。ARM 和 GPU 平台的具体运行环境如下图所示。

![ARM和GPU的具体运行环境](../../data/images/shufflenetv2/ARM和GPU的具体运行环境.png)

![图2](../../data/images/shufflenetv2/图2.jpg)

Expand Down Expand Up @@ -53,7 +55,7 @@ MAC &= hw(c_{1} + c{2}) + c_{1}c_{2} \\\\

### G2-分组数太多的卷积会增加 MAC

分组卷积是现在网络结构设计的核心,它通过通道之间的**稀疏连接**(也就是只和同一个组内的特征连接)来降低计算复杂度。一方面,它允许我们使用更多的通道数来增加网络容量进而提升准确率,但另一方面随着通道数的增多也对带来更多的 `MAC`
分组卷积是现在轻量级网络结构(`ShuffleNet/MobileNet/Xception/ResNeXt`)设计的核心,它通过通道之间的**稀疏连接**(也就是只和同一个组内的特征连接)来降低计算复杂度。一方面,它允许我们使用更多的通道数来增加网络容量进而提升准确率,但另一方面随着通道数的增多也对带来更多的 `MAC`

针对 $1 \times 1$ 的分组卷积,我们有:
> 分组卷积 `FLOPs` 的计算公式,我写的 [MobileNet v1 论文详解](https://63427ff0.wiz06.com/wapp/pages/view/share/s/1zgD_M0Qfx7F2AnL_C3tohc93-WpoF0GskOx2_h4E626G3MN) 有给出推导。
Expand Down Expand Up @@ -120,8 +122,8 @@ $$

根据 `ShuffleNet v1`,轻量级神经网络的主要挑战在于,在给定预算(`FLOPs`)的情况下,特征图的通道数也是受限制的。为了在不显著增加 `FLOPs` 计算量的情况下提高通道数,`ShuffleNet v1` 论文采用了两种技术:**逐点组卷积和类瓶颈结构**(pointwise group convolutions and bottleneck-like structures.);然后引入“channel shuffle” 操作,令不同组的通道之间能够进行信息交流,提高精度。其构建模块如图 3(a)(b) 所示。

从本文 Section 2 的讨论,可以知道**逐点组卷积和瓶颈结构**都增加了 `MAC`( `G1``G2` )。这个成本不可忽视,特别是对于轻量级模型。另外,使用太多分组也违背了 `G3``shortcut connection` 中的**逐元素加法**(element-wise "Add")操作也不可取 (`G4`)。因此,为了实现较高的**模型容量和效率**,关键问题是**如何保持大量且同样宽的通道,同时没有密集卷积也没有太多的分组**
> **如何保持大量且同样宽的通道,同时没有密集卷积也没有太多的分组**,这句话比较难理解。我的理解:1,卷积 `block` 里面的卷积层通道多且同样宽的通道的,意味着两个连接的卷积层的通道数要多且相等。2,密集卷积是?3,使用分组卷积时,分组数 `group` 不宜过多,那就意味着 `DW` 卷积的输入通道数要较小。
从本文 Section 2 的讨论,可以知道**逐点组卷积和瓶颈结构**都增加了 `MAC`( `G2``G1` )。这个成本不可忽视,特别是对于轻量级模型。另外,使用太多分组也违背了 `G3``shortcut connection` 中的**逐元素加法**(element-wise "Add")操作也不可取 (`G4`)。因此,为了实现较高的**模型容量和效率**,关键问题是**如何保持大量且同样宽的通道,同时没有密集卷积也没有太多的分组**
> **如何保持大量且同样宽的通道,同时没有密集卷积也没有太多的分组**,这句话比较难理解。我的理解:1,卷积 `block` 里面的卷积层通道多且同样宽的通道的,意味着两个连接的卷积层的通道数要多且相等。2,这里密集卷积是指 $1\times 1$ 卷积。3,使用分组卷积时,分组数 `group` 不宜过多,那就意味着 `DW` 卷积的输入通道数要较小。
**ShuffleNet v2 的通道拆分**。在 ShuffleNet v1 `block`的基础上,**ShuffleNet v2 block 引入通道分割(`Channel Split`)这个简单的算子**来实现上述目的,如图 3(c) 所示。在每个单元 (block) 的开始,我们将输入特征图的 $c$ 个通道切分成 (`split`) 两个分支 (`branches`):$c-c^{'}$ 个通道和 $c^{'}$ 个通道。根据 **G3** 网络碎片尽可能少,其中一个分支保持不变(shortcut connection),另外一个分支包含三个通道数一样的卷积来满足 **G1**。和 v1 不同,v2 block 的两个 $1 \times 1$ 卷积不再使用分组卷积,一部分原因是为了满足 **G2**,另外一部分原因是一开始的通道切分 (`split`)操作已经完成了分组效果。

Expand Down
38 changes: 38 additions & 0 deletions 7-model_deploy/B-神经网络模型复杂度分析.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,43 @@
* [三,一些概念](#三,一些概念)
* [四,参考资料](#四,参考资料)

## 前言

现阶段的轻量级模型 MobileNet/ShuffleNet 系列、CSPNet、RepVGG、VoVNet 等都必须依赖于于具体的计算平台(如 CPU/GPU/ASIC 等)才能更完美的发挥网络架构。

1,计算平台主要有两个指标:算力 $\pi $和 带宽 $\beta $。

- 算力指的是计算平台每秒完成的最大浮点运算次数,单位是 `FLOPS`
- 带宽指的是计算平台一次每秒最多能搬运多少数据(每秒能完成的内存交换量),单位是 `Byte/s`

计算强度上限 $I_{max}$,上面两个指标相除得到计算平台的**计算强度上限**。它描述了单位内存交换最多用来进行多少次计算,单位是 `FLOPs/Byte`

$$I_{max} = \frac {\pi }{\beta}$$

> 这里所说的“内存”是广义上的内存。对于 `CPU` 而言指的就是真正的内存(`RAM`);而对于 `GPU` 则指的是显存。
2,和计算平台的两个指标相呼应,模型也有两个主要的反馈速度的**间接指标**:计算量 `FLOPs` 和访存量 `MAC`

- **计算量(FLOPs)**:指的是输入单个样本(一张图像),模型完成一次前向传播所发生的浮点运算次数,即模型的时间复杂度,单位是 `FLOPs`
- **访存量(MAC)**:指的是输入单个样本(一张图像),模型完成一次前向传播所发生的内存交换总量,即模型的空间复杂度,单位是 `Byte`,因为数据类型通常为 `float32`,所以需要乘以 `4``CNN` 网络中每个网络层 `MAC` 的计算分为读输入 `feature map` 大小、权重大小(`DDR` 读)和写输出 `feature map` 大小(`DDR` 写)三部分。
- 模型的计算强度 $I$ :$I = \frac{FLOPs}{MAC}$,即计算量除以访存量后的值,**表示此模型在计算过程中,每 `Byte` 内存交换到底用于进行多少次浮点运算**。单位是 `FLOPs/Byte`。可以看到,模计算强度越大,其内存使用效率越高。
- 模型的理论性能 $P$ :我们最关心的指标,即模型在计算平台上所能达到的每秒浮点运算次数(理论值)。单位是 `FLOPS or FLOP/s``Roof-line Model` 给出的就是计算这个指标的方法。

3,`Roofline` 模型讲的是程序在计算平台的算力和带宽这两个指标限制下,所能达到的理论性能上界,而不是实际达到的性能,因为实际计算过程中还有除算力和带宽之外的其他重要因素,它们也会影响模型的实际性能,这是 `Roofline Model` 未考虑到的。例如矩阵乘法,会因为 `cache` 大小的限制、`GEMM` 实现的优劣等其他限制,导致你几乎无法达到 `Roofline` 模型所定义的边界(屋顶)。

所谓 “Roof-line”,指的就是由计算平台的算力和带宽上限这两个参数所决定的“屋顶”形态,如下图所示。

- 算力决定“屋顶”的高度(绿色线段)
- 带宽决定“房檐”的斜率(红色线段)

![roof-line](../data/images/模型复杂度分析/roof-line.jpg)

`Roof-line` 划分出的两个瓶颈区域定义如下:

![Roof-line划分出的两个瓶颈区域](../data/images/模型复杂度分析/Roof-line划分出的两个瓶颈区域.png)

**个人感觉如果在给定计算平台上做模型部署工作,因为芯片的算力已定,工程师能做的主要工作应该是提升带宽。**

## 一,模型计算量分析

> 终端设备上运行深度学习算法需要考虑内存和算力的需求,因此需要进行模型复杂度分析,涉及到模型计算量(时间/计算复杂度)和模型参数量(空间复杂度)分析。
Expand Down Expand Up @@ -110,3 +147,4 @@ $$ mac\ utilization = \frac {used\ Ops/s}{raw\ OPs/s} = \frac {FLOPs/time(s)}{Ra
+ [MobileNetV1 & MobileNetV2 简介](https://blog.csdn.net/mzpmzk/article/details/82976871)
+ [双精度,单精度和半精度](https://blog.csdn.net/sinat_24143931/article/details/78557852?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase)
+ [AI硬件的Computational Capacity详解](https://zhuanlan.zhihu.com/p/27836831)
+ [Roofline Model与深度学习模型的性能分析](https://zhuanlan.zhihu.com/p/34204282)
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit da18389

Please sign in to comment.