Skip to content

Commit

Permalink
fix md img
Browse files Browse the repository at this point in the history
use markdown syntax instead html in ch8, ch9, ch13
fix img path in ch17
  • Loading branch information
izayoi5776 committed Nov 9, 2018
1 parent 7337f33 commit 027629d
Show file tree
Hide file tree
Showing 4 changed files with 122 additions and 122 deletions.
30 changes: 15 additions & 15 deletions ch13_优化算法/第十三章_优化算法.md
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ CPU 除了负责浮点整形运算外,还有很多其他的指令集的负载

  
没有免费的午餐定理:
<center><img src="./img/ch13/figure_13_4_1.png" alt="没有免费的午餐定理"></center>
![没有免费的午餐定理](./img/ch13/figure_13_4_1.png)
<center>图 13.4 没有免费的午餐(黑点:训练样本;白点:测试样本)</center>

&emsp;&emsp;
Expand Down Expand Up @@ -103,7 +103,7 @@ CPU 除了负责浮点整形运算外,还有很多其他的指令集的负载
神经网络的训练中,通过改变神经元的权重,使网络的输出值尽可能逼近标签以降低误差 值,训练普遍使用 BP 算法,核心思想是,计算出输出与标签间的损失函数值,然后计算其相 对于每个神经元的梯度,进行权值的迭代。
&emsp;&emsp;
梯度消失会造成权值更新缓慢,模型训练难度增加。造成梯度消失的一个原因是,许多激 活函数将输出值挤压在很小的区间内,在激活函数两端较大范围的定义域内梯度为 $0$。造成学 习停止。
<center><img src="./img/ch13/figure_13_7_1.png" alt="sigmoid 函数与其导数"></center>
![sigmoid 函数与其导数](./img/ch13/figure_13_7_1.png)
<center>图 13.7 sigmoid 函数的梯度消失</center>

## 13.8 权值初始化方法有哪些?
Expand Down Expand Up @@ -348,7 +348,7 @@ $$

&emsp;&emsp;
假设损失函数的数据空间是下图这样的,我们最优的权值就是为了寻找下图中的最小值点, 对于这种数学寻找最小值问题,采用梯度下降的方法再适合不过了。
<center><img src="./img/ch13/figure_13_15_1.png"></center>
![](./img/ch13/figure_13_15_1.png)
<center>图 13.15.1 </center>

### 13.15.2 梯度消失、爆炸原因?
Expand All @@ -367,7 +367,7 @@ $$
(2)激活函数角度
&emsp;&emsp;
计算权值更新信息的时候需要计算前层偏导信息,因此如果激活函数选择不合适,比如使用 sigmoid,梯度消失就会很明显了,原因看下图,左图是sigmoid的损失函数图,右边是其倒数的图像,如果使用 sigmoid 作为损失函数,其梯度是不可能超过 $0.25$ 的,这样经过链式求导之后,很容易发生梯度消失。
<center><img src="./img/ch13/figure_13_15_2.png"></center>
![](./img/ch13/figure_13_15_2.png)
<center>图 13.15.2 sigmod函数与其导数</center>

### 13.15.3 梯度消失、爆炸的解决方案
Expand Down Expand Up @@ -454,14 +454,14 @@ LSTM全称是长短期记忆网络(long-short term memory networks),是不

&emsp;&emsp;
我发现很多机器学习团队就是这样,有一个定义明确的开发集用来测量查准率和查全率,再加上这样一个单一数值评估指标,有时我叫单实数评估指标,能让你快速判断分类器或者分类器更好。所以有这样一个开发集,加上单实数评估指标,你的迭代速度肯定会很快,它可以加速改进您的机器学习算法的迭代过程。
<center><img src="./img/ch13/figure_13_18_1.png"></center>
![](./img/ch13/figure_13_18_1.png)
<center>图 13.8.1 </center>

## 13.19 满足和优化指标(Satisficing and optimizing metrics)

&emsp;&emsp;
要把你顾及到的所有事情组合成单实数评估指标有时并不容易,在那些情况里,我发现有时候设立满足和优化指标是很重要的,让我告诉你是什么意思吧。
<center><img src="./img/ch13/figure_13_19_1.png"></center>
![](./img/ch13/figure_13_19_1.png)
<center>图 13.9.1 </center>

&emsp;&emsp;
Expand Down Expand Up @@ -668,7 +668,7 @@ ILSRVRC(ImageNet 图像分类大赛) 比赛设置如下:$1000$类图像分

&emsp;&emsp;
深度学习算法对训练数据的胃口很大,当你收集到足够多带标签的数据构成训练集时,算法效果最好,这导致很多团队用尽一切办法收集数据,然后把它们堆到训练集里,让训练的数据量更大,即使有些数据,甚至是大部分数据都来自和开发集、测试集不同的分布。在深度学习时代,越来越多的团队都用来自和开发集、测试集分布不同的数据来训练,这里有一些微妙的地方,一些最佳做法来处理训练集和测试集存在差异的情况,我们来看看。
<center><img src="./img/ch13/figure_13_36_1.png" ></center>
![](./img/ch13/figure_13_36_1.png)
<center>图 13.36 Cat app example</center>

&emsp;&emsp;
Expand Down Expand Up @@ -822,7 +822,7 @@ batch size和学习率几乎不受其他超参数的影响,因此可以放到

&emsp;&emsp;
在深度学习研究早期,人们总是担心优化算法会困在极差的局部最优,不过随着深度学习理论不断发展,我们对局部最优的理解也发生了改变。我向你展示一下现在我们怎么看待局部最优以及深度学习中的优化问题。
<center><img src="./img/ch13/figure_13_43_1.png"></center>
![](./img/ch13/figure_13_43_1.png)
<center>图 13.43.1 </center>

&emsp;&emsp;
Expand All @@ -831,40 +831,40 @@ batch size和学习率几乎不受其他超参数的影响,因此可以放到
全局最优。如果你要作图计算一个数字,比如说这两个维度,就容易出现有多个不同局部最优的图,而这些低维的图
曾经影响了我们的理解,但是这些理解并不正确。事实上,如果你要创建一个神经网络,通常梯度为零的点并不是这
个图中的局部最优点,实际上成本函数的零梯度点,通常是鞍点。
<center><img src="./img/ch13/figure_13_43_2.png"></center>
![](./img/ch13/figure_13_43_2.png)
<center>图 13.43.2 </center>

&emsp;&emsp;
也就是在这个点,这里是和,高度即成本函数的值。
<center><img src="./img/ch13/figure_13_43_3.png"></center>
![](./img/ch13/figure_13_43_3.png)
<center>图 13.43.3 </center>

&emsp;&emsp;
但是一个具有高维度空间的函数,如果梯度为$0$,那么在每个方向,它可能是凸函数,也可能是凹函数。如果你在$2$万维空间中,那么想要得到局部最优,所有的$2$万个方向都需要是这样,但发生的机率也许很小,也许是,你更有可能遇到有些方向的曲线会这样向上弯曲,另一些方向曲线向下弯,而不是所有的都向上弯曲,因此在高维度空间,你更可能碰到鞍点。
<center><img src="./img/ch13/figure_13_43_4.png"></center>
![](./img/ch13/figure_13_43_4.png)
<center>图 13.43.4 </center>

&emsp;&emsp;
就像下面的这种:
<center><img src="./img/ch13/figure_13_43_5.png"></center>
![](./img/ch13/figure_13_43_5.png)
<center>图 13.43.5 </center>

&emsp;&emsp;
而不会碰到局部最优。至于为什么会把一个曲面叫做鞍点,你想象一下,就像是放在马背上的马鞍一样,如果这是马,这是马的头,这就是马的眼睛,画得不好请多包涵,然后你就是骑马的人,要坐在马鞍上,因此这里的这个点,导数为$0$的点,这个点叫做鞍点。我想那确实是你坐在马鞍上的那个点,而这里导数为$0$。
<center><img src="./img/ch13/figure_13_43_6.png"></center>
![](./img/ch13/figure_13_43_6.png)
<center>图 13.43.6 </center>

&emsp;&emsp;
所以我们从深度学习历史中学到的一课就是,我们对低维度空间的大部分直觉,比如你可以画出上面的图,并不能应用到高维度空间中。适用于其它算法,因为如果你有$2$万个参数,那么函数有$2$万个维度向量,你更可能遇到鞍点,而不是局部最优点。

&emsp;&emsp;
如果局部最优不是问题,那么问题是什么?结果是平稳段会减缓学习,平稳段是一块区域,其中导数长时间接近于$0$,如果你在此处,梯度会从曲面从从上向下下降,因为梯度等于或接近$0$,曲面很平坦,你得花上很长时间慢慢抵达平稳段的这个点,因为左边或右边的随机扰动,我换个笔墨颜色,大家看得清楚一些,然后你的算法能够走出平稳段(红色笔)。
<center><img src="./img/ch13/figure_13_43_7.png"></center>
![](./img/ch13/figure_13_43_7.png)
<center>图 13.43.7 </center>

&emsp;&emsp;
我们可以沿着这段长坡走,直到这里,然后走出平稳段。
<center><img src="./img/ch13/figure_13_43_8.png"></center>
![](./img/ch13/figure_13_43_8.png)
<center>图 13.43.8 </center>

&emsp;&emsp;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,14 +57,14 @@ https://blog.csdn.net/nature553863/article/details/81083955
Group convolution最早出现在AlexNet中,是为了解决单卡显存不够,将网络部署到多卡上进行训练。Group convolution可以减少单个卷积1/g的参数量。
假设输入特征的的维度为H \* W \* c1;卷积核的维度为h1 \* w1 \* c1,共c2个;输出特征的维度为 H1 \* W1 \* c2。
传统卷积计算方式如下:
![image](C:/Users/zhang-pc/Desktop/tu/1.png)
![image](./img/ch17/1.png)
传统卷积运算量为:
```math
A = H * W * h1 * w1 * c1 * c2
```
Group convolution是将输入特征的维度c1分成g份,每个group对应的channel数为c1/g,特征维度H \* W \* c1/g;,每个group对应的卷积核的维度也相应发生改变为h1 \* w1 \* c1/9,共c2/g个;每个group相互独立运算,最后将结果叠加在一起。
Group convolution计算方式如下:
![image](C:/Users/zhang-pc/Desktop/tu/2.png)
![image](./img/ch17/2.png)
Group convolution运算量为:

```math
Expand All @@ -82,19 +82,19 @@ depthwise conv(DW)有效减少参数数量并提升运算速度。但是由于
pointwise conv(PW)实现通道特征信息交流,解决DW卷积导致“信息流通不畅”的问题。
假设输入特征的的维度为H \* W \* c1;卷积核的维度为h1 \* w1 \* c1,共c2个;输出特征的维度为 H1 \* W1 \* c2。
传统卷积计算方式如下:
![image](C:/Users/zhang-pc/Desktop/tu/3.jpg)
![image](./img/ch17/3.jpg)
传统卷积运算量为:
```math
A = H * W * h1 * w1 * c1 * c2
```
DW卷积的计算方式如下:
![image](C:/Users/zhang-pc/Desktop/tu/4.jpg)
![image](./img/ch17/4.jpg)
DW卷积运算量为:
```math
B_DW = H * W * h1 * w1 * 1 * c1
```
PW卷积的计算方式如下:
![image](C:/Users/zhang-pc/Desktop/tu/5.jpg)
![image](./img/ch17/5.jpg)
```math
B_PW = H_m * W_m * 1 * 1 * c1 * c2
```
Expand Down Expand Up @@ -148,16 +148,16 @@ MAC = h * w * c1 + \dfrac{B*g}{c1} + \dfrac{B}{h * w}
**模型中分支数量越少,模型速度越快**
此结论主要是由实验结果所得。
以下为网络分支数和各分支包含的卷积数目对神经网络速度的影响。
![image](C:/Users/zhang-pc/Desktop/tu/6.png)
![image](./img/ch17/6.png)
实验中使用的基本网络结构,分别将它们重复10次,然后进行实验。实验结果如下:
![image](C:/Users/zhang-pc/Desktop/tu/7.png)
![image](./img/ch17/7.png)
由实验结果可知,随着网络分支数量的增加,神经网络的速度在降低。网络碎片化程度对GPU的影响效果明显,对CPU不明显,但是网络速度同样在降低。

### 6. 减少元素级操作
**元素级操作所带来的时间消耗也不能忽视**
ReLU ,Tensor 相加,Bias相加的操作,分离卷积(depthwise convolution)都定义为元素级操作。
FLOPs大多数是对于卷积计算而言的,因为元素级操作的FLOPs相对要低很多。但是过的元素级操作也会带来时间成本。ShuffleNet作者对ShuffleNet v1和MobileNet v2的几种层操作的时间消耗做了分析,发现元素级操作对于网络速度的影响也很大。
![image](C:/Users/zhang-pc/Desktop/tu/8.png)
![image](./img/ch17/8.png)

## 17.6 常用的轻量级网络有哪些?(再琢磨下语言和排版)
* **SqueezeNet**
Expand All @@ -177,12 +177,12 @@ SqueenzeNet出自F. N. Iandola, S.Han等人发表的论文《SqueezeNet: AlexNet
* 分辨率越大的输入能够提供更多特征的信息,有利于网络的训练判断,延迟降采样可以提高网络精度。
#### 1.2 网络架构
SqueezeNet提出一种多分支结构——fire model,其中是由Squeeze层和expand层构成。Squeeze层是由s1个1\*1卷积组成,主要是通过1\*1的卷积降低expand层的输入维度;expand层利用e1个1\*1和e3个3\*3卷积构成多分支结构提取输入特征,以此提高网络的精度(其中e1=e3=4*s1)。
![image](C:/Users/zhang-pc/Desktop/tu/9.png)
![image](./img/ch17/9.png)
SqueezeNet整体网络结构如下图所示:
![image](C:/Users/zhang-pc/Desktop/tu/10.png)
![image](./img/ch17/10.png)
#### 1.3实验结果
不同压缩方法在ImageNet上的对比实验结果
![image](C:/Users/zhang-pc/Desktop/tu/11.png)
![image](./img/ch17/11.png)
由实验结果可知,SqueezeNet不仅保证了精度,而且将原始AlexNet从240M压缩至4.8M,压缩50倍,说明此轻量级网络设计是可行。

### 2. MobileNet
Expand All @@ -197,17 +197,17 @@ MobileNet 是Google团队于CVPR-2017的论文《MobileNets: Efficient Convoluti
* DW conv和PW conv
MobileNet的网络架构主要是由DW conv和PW conv组成,相比于传统卷积可以降低`$\dfrac{1}{N} + \dfrac{1}{Dk}$`倍的计算量。
标准卷积与DW conv和PW conv如图所示:
![image](C:/Users/zhang-pc/Desktop/tu/12.png)
![image](./img/ch17/12.png)
深度可分离卷积与传统卷积运算量对比:
![image](C:/Users/zhang-pc/Desktop/tu/13.png)
![image](./img/ch17/13.png)
网络结构:
![image](C:/Users/zhang-pc/Desktop/tu/14.png)
![image](./img/ch17/14.png)

* MobileNets的架构
![image](C:/Users/zhang-pc/Desktop/tu/15.png)
![image](./img/ch17/15.png)

#### 2.3 实验结果
![image](C:/Users/zhang-pc/Desktop/tu/16.png)
![image](./img/ch17/16.png)
由上表可知,使用相同的结构,深度可分离卷积虽然准确率降低1%,但是参数量减少了6/7。

### 3. MobileNet-v2
Expand All @@ -223,15 +223,15 @@ MobileNet-V2是2018年1月公开在arXiv上论文《Inverted Residuals and Linea
* Inverted residuals
ResNet中Residuals block先经过1\*1的Conv layer,把feature map的通道数降下来,再经过3\*3 Conv layer,最后经过一个1\*1 的Conv layer,将feature map 通道数再“扩张”回去。即采用先压缩,后扩张的方式。而 inverted residuals采用先扩张,后压缩的方式。
MobileNet采用DW conv提取特征,由于DW conv本身提取的特征数就少,再经过传统residuals block进行“压缩”,此时提取的特征数会更少,因此inverted residuals对其进行“扩张”,保证网络可以提取更多的特征。
![image](C:/Users/zhang-pc/Desktop/tu/17.png)
![image](./img/ch17/17.png)
* Linear bottlenecks
ReLu激活函数会破坏特征。ReLu对于负的输入,输出全为0,而本来DW conv特征通道已经被“压缩”,再经过ReLu的话,又会损失一部分特征。采用Linear,目的是防止Relu破坏特征。
![image](C:/Users/zhang-pc/Desktop/tu/18.png)
![image](./img/ch17/18.png)
* shortcut
stride=2的conv不使用shot-cot,stride=1的conv使用shot-cut
![image](C:/Users/zhang-pc/Desktop/tu/19.png)
![image](./img/ch17/19.png)
* 网络架构
![image](C:/Users/zhang-pc/Desktop/tu/20.png)
![image](./img/ch17/20.png)

### 4. Xception
Xception是Google提出的,arXiv 的V1 于2016年10月公开《Xception: Deep Learning with Depthwise Separable Convolutions 》,Xception是对Inception v3的另一种改进,主要是采用depthwise separable convolution来替换原来Inception v3中的卷积操作。
Expand All @@ -243,7 +243,7 @@ Xception是Google提出的,arXiv 的V1 于2016年10月公开《Xception: Deep

#### 4.2网络架构
feature map在空间和通道上具有一定的相关性,通过Inception模块和非线性激活函数实现通道之间的解耦。增多3\*3的卷积的分支的数量,使它与1\*1的卷积的输出通道数相等,此时每个3\*3的卷积只作用与一个通道的特征图上,作者称之为“极致的Inception(Extream Inception)”模块,这就是Xception的基本模块。
![image](C:/Users/zhang-pc/Desktop/tu/21.png)
![image](./img/ch17/21.png)

### 5. ShuffleNet-v1
ShuffleNet 是Face++团队提出的,晚于MobileNet两个月在arXiv上公开《ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices 》用于移动端前向部署的网络架构。ShuffleNet基于MobileNet的group思想,将卷积操作限制到特定的输入通道。而与之不同的是,ShuffleNet将输入的group进行打散,从而保证每个卷积核的感受野能够分散到不同group的输入中,增加了模型的学习能力。
Expand All @@ -257,14 +257,14 @@ ShuffleNet 是Face++团队提出的,晚于MobileNet两个月在arXiv上公开

#### 5.2 网络架构
MobileNet中1\*1卷积的操作占据了约95%的计算量,所以作者将1\*1也更改为group卷积,使得相比MobileNet的计算量大大减少。
![image](C:/Users/zhang-pc/Desktop/tu/22.png)
![image](./img/ch17/22.png)
group卷积与DW存在同样使“通道信息交流不畅”的问题,MobileNet中采用PW conv解决上述问题,SheffleNet中采用channel shuffle。
ShuffleNet的shuffle操作如图所示
![image](C:/Users/zhang-pc/Desktop/tu/24.png)
![image](./img/ch17/24.png)
avg pooling和DW conv(s=2)会减小feature map的分辨率,采用concat增加通道数从而弥补分辨率减小而带来信息的损失;实验表明:多多使用通道(提升通道的使用率),有助于提高小模型的准确率。
![image](C:/Users/zhang-pc/Desktop/tu/23.png)
![image](./img/ch17/23.png)
网络结构:
![image](C:/Users/zhang-pc/Desktop/tu/25.png)
![image](./img/ch17/25.png)

### 6. ShuffleNet-v2
huffleNet-v2 是Face++团队提出的《ShuffleNet V2: Practical Guidelines for Ecient CNN Architecture Design》,旨在设计一个轻量级但是保证精度、速度的深度网络。
Expand All @@ -284,9 +284,9 @@ huffleNet-v2 是Face++团队提出的《ShuffleNet V2: Practical Guidelines for

depthwise convolution 和 瓶颈结构增加了 MAC,用了太多的 group,跨层连接中的 element-wise Add 操作也是可以优化的点。所以在 shuffleNet V2 中增加了几种新特性。
所谓的 channel split 其实就是将通道数一分为2,化成两分支来代替原先的分组卷积结构(G2),并且每个分支中的卷积层都是保持输入输出通道数相同(G1),其中一个分支不采取任何操作减少基本单元数(G3),最后使用了 concat 代替原来的 elementy-wise add,并且后面不加 ReLU 直接(G4),再加入channle shuffle 来增加通道之间的信息交流。 对于下采样层,在这一层中对通道数进行翻倍。 在网络结构的最后,即平均值池化层前加入一层 1x1 的卷积层来进一步的混合特征。
![image](C:/Users/zhang-pc/Desktop/tu/26.png)
![image](./img/ch17/26.png)
网络结构
![image](C:/Users/zhang-pc/Desktop/tu/27.png)
![image](./img/ch17/27.png)

#### 6.4 ShuffleNet-v2具有高精度的原因
* 由于高效,可以增加更多的channel,增加网络容量
Expand Down
Loading

0 comments on commit 027629d

Please sign in to comment.