Skip to content

Commit 6b7b6f5

Browse files
committed
update bn/Reception Field/Resnet
1 parent e7d43ff commit 6b7b6f5

File tree

1 file changed

+125
-17
lines changed

1 file changed

+125
-17
lines changed

docs/深度学习.md

Lines changed: 125 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -155,9 +155,48 @@ if (this->layer_param_.pooling_param().pool() == PoolingParameter_PoolMethod_MAX
155155

156156
## 感受野
157157

158+
感受野($Receptive$ $Field$)的定义是卷积神经网络每一层输出的特征图($feature$ $map$)上的像素点在**原始输入图片**上映射的区域大小。再通俗点的解释是,特征图上的一个点对应**原始输入图片**上的区域,如下图所示。
159+
160+
![](https://gitee.com/lebhoryi/PicGoPictureBed/raw/master/img/20210803232626.png)
161+
162+
### 感受野的作用
163+
164+
(1)一般$task$要求感受野越大越好,如图像分类中最后卷积层的感受野要大于输入图像,网络深度越深感受野越大性能越好;
165+
166+
(2)密集预测$task$要求输出像素的感受野足够的大,确保做出决策时没有忽略重要信息,一般也是越深越好;
167+
168+
(3)目标检测$task$中设置$anchor$要严格对应感受野,$anchor$太大或偏离感受野都会严重影响检测性能。
169+
158170
### 感受野计算
159171

160-
- [ ] TODO
172+
在计算感受野时有下面几点需要说明:
173+
174+
(1)第一层卷积层的输出特征图像素的感受野的大小等于卷积核的大小。
175+
176+
(2)深层卷积层的感受野大小和它之前所有层的滤波器大小和步长有关系。
177+
178+
(3)计算感受野大小时,忽略了图像边缘的影响,即不考虑padding的大小。
179+
180+
下面给出计算感受野大小的计算公式:
181+
182+
$$
183+
RF_{l+1} = (RF_{l}-1)*stide + kernel
184+
$$
185+
186+
其中$RF_{l+1}$为当前特征图对应的感受野的大小,也就是要计算的目标感受野,$RF_{l}$为上一层特征图对应的感受野大小,$f_{l+1}$为当前卷积层卷积核的大小,累乘项$strides$表示当前卷积层之前所有卷积层的步长乘积。
187+
188+
举一个例子,7 * 7的输入图经过三层卷积核为3 * 3的卷积操作后得到$Out3$的感受野为7 * 7,也就是$Out3$中的值是由$Input$所有区域的值经过卷积计算得到,其中卷积核($filter$)的步长($stride$)为1、$padding$为0,,如下图所示:
189+
190+
![](https://gitee.com/lebhoryi/PicGoPictureBed/raw/master/img/20210803233301.png)
191+
192+
193+
以上面举的$sample$为例:
194+
195+
$Out1$层由于是第一层卷积输出,即其感受野等于其卷积核的大小,**即第一层卷积层输出的特征图的感受野为3**,$RF1$=3;
196+
197+
$Out2$层的感受野$RF2$ = 3 + (3 - 1) * 1 = 5,**即第二层卷积层输出的特征图的感受野为5**
198+
199+
$Out3$层的感受野$RF3$ = 3 + (5 - 1) * 1 = 7,**即第三层卷积层输出的特征图的感受野为7**
161200

162201
**参考资料**
163202

@@ -201,36 +240,78 @@ if (this->layer_param_.pooling_param().pool() == PoolingParameter_PoolMethod_MAX
201240
**参考资料**
202241

203242
- [ ] [正则化方法](https://baike.baidu.com/item/%E6%AD%A3%E5%88%99%E5%8C%96%E6%96%B9%E6%B3%95/19145625?fr=aladdin)
243+
- [ ] [你够全面了解L1与L2正则吗?](https://mp.weixin.qq.com/s?__biz=MzkzNDIxMzE1NQ==&mid=2247486609&idx=1&sn=76fc19df55a2d7f605b8203ccd5f101c&chksm=c241efddf53666cb70ebb3b44a40154778c94c2a2c2fda74418ce994805b99bd2ee644becf68&scene=178&cur_album_id=1860258784426672132#rd)
204244

205245
## Batch Normalization(BN)
206246

207247
### BN 原理
208248

209-
- [ ] TODO
249+
> 为了解决 ICS 的问题,(但是有人求证过了,ICS 的问题并不能完全解决),BN启发于白化操作。
250+
251+
因为深层神经网络在做非线性变换前的激活输入值(就是那个x=WU+B,U是输入)随着网络深度加深或者在训练过程中,其分布逐渐发生偏移或者变动,之所以训练收敛慢,所以这导致反向传播时低层神经网络的梯度消失,这是训练深层神经网络收敛越来越慢的.
252+
253+
BN就是通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布 ,其实就是把越来越偏的分布强制拉回比较标准的分布,这样使得激活输入值落在非线性函数对输入比较敏感的区域,这样输入的小变化就会导致损失函数较大的变化,
254+
255+
上面记不住没关系,记住“保持数据同分布”即可
210256

211257
**参考资料**
212258

213259
- [Batch Normalization原理与实战](https://zhuanlan.zhihu.com/p/34879333)
214260

215261
### 手写 BN
216262

217-
- [ ] TODO
263+
的简单计算步骤为:
218264

219-
### BN 可以防止过拟合么?为什么
265+
- 沿着通道计算每个batch的均值$\mu=\frac{1}{m} \sum_{i=1}^{m} x_{i}$。
220266

221-
- [ ] TODO
267+
- 沿着通道计算每个$batch$的方差$\delta^{2}=\frac{1}{m} \sum_{i=1}^{m}\left(x_{i}-\mu_{\mathcal{B}}\right)^{2}$。
268+
269+
- 对x做归一化, ![image](https://gitee.com/lebhoryi/PicGoPictureBed/raw/master/img/20210803224334.png)
270+
271+
272+
- 加入缩放和平移变量$\gamma$和$\beta$ ,归一化后的值,$y_{i} \leftarrow \gamma \widehat{x}_{i}+\beta$
273+
274+
$BN$适用于判别模型中,比如图片分类模型。因为$BN$注重对每个$batch$进行归一化,从而保证数据分布的一致性,而判别模型的结果正是取决于数据整体分布。但是$BN$对$batchsize$的大小比较敏感,由于每次计算均值和方差是在一个$batch$上,所以如果$batchsize$太小,则计算的均值、方差不足以代表整个数据分布。
275+
276+
### BN 的作用?
277+
278+
- $BN$加快网络的训练与收敛的速度
279+
280+
在深度神经网络中中,如果每层的数据分布都不一样的话,将会导致网络非常难收敛和训练。如果把每层的数据都在转换在均值为零,方差为1 的状态下,这样每层数据的分布都是一样的训练会比较容易收敛。
281+
282+
- 控制梯度爆炸防止梯度消失
283+
284+
以$sigmoid$函数为例,$sigmoid$函数使得输出在$[0,1]$之间,实际上当 输入过大或者过小,经过sigmoid函数后输出范围就会变得很小,而且反向传播时的梯度也会非常小,从而导致梯度消失,同时也会导致网络学习速率过慢;同时由于网络的前端比后端求梯度需要进行更多次的求导运算,最终会出现网络后端一直学习,而前端几乎不学习的情况。Batch Normalization (BN) 通常被添加在每一个全连接和激励函数之间,使数据在进入激活函数之前集中分布在0值附近,大部分激活函数输入在0周围时输出会有加大变化。
285+
286+
同样,使用了$BN$之后,可以使得权值不会很大,不会有梯度爆炸的问题。
287+
288+
- 防止过拟合
289+
290+
在网络的训练中,BN的使用使得一个$minibatch$中所有样本都被关联在了一起,因此网络不会从某一个训练样本中生成确定的结果,即同样一个样本的输出不再仅仅取决于样本的本身,也取决于跟这个样本同属一个$batch$的其他样本,而每次网络都是随机取$batch$,比较多样,可以在一定程度上避免了过拟合。
222291

223292
### BN 有哪些参数?
224293

225-
- [ ] TODO
294+
γ和β两个尺度变化系数
226295

227296
### BN 的反向传播推导
228297

229-
- [ ] TODO
298+
299+
![image](https://user-images.githubusercontent.com/47493620/118059082-39d1a500-b3c2-11eb-80f8-75f2bf677451.png)
300+
301+
302+
下面来一个背诵版本:
303+
304+
![image](https://user-images.githubusercontent.com/47493620/118059220-9208a700-b3c2-11eb-841f-73781fa93342.png)
230305

231306
### BN 在训练和测试的区别?
232307

233-
- [ ] TODO
308+
![image-20210803225110049](https://gitee.com/lebhoryi/PicGoPictureBed/raw/master/img/20210803225111.png)
309+
310+
- [推理时 cnn bn 折叠;基于KWS项目](https://blog.csdn.net/weixin_37598106/article/details/106825799)
311+
312+
### BN 是放在激活前面还是后面?
313+
314+
一般是放在激活层前面,但是自己做了一些实验,和网上有大佬的说法结合,放在前后的差别并不大,我做的实验是语音唤醒,非 CV 实验。但是一般使用的时候都是放在前面的。
234315

235316
## Weight Normalization(WN)
236317

@@ -250,7 +331,13 @@ if (this->layer_param_.pooling_param().pool() == PoolingParameter_PoolMethod_MAX
250331

251332
### BN、LN、WN、IN和GN的区别
252333

253-
- [ ] TODO
334+
**主要且常用**的归一化操作有**BN,LN,IN,GN**,示意图如图所示。
335+
336+
337+
![](https://files.mdnice.com/user/6935/7842ce3e-a60f-4c37-b520-98851537f16d.png)
338+
339+
340+
图中的蓝色部分,表示需要归一化的部分。其中两维$C$和$N$分别表示$channel$和$batch$ $size$,第三维表示$H$,$W$,可以理解为该维度大小是$H*W$,也就是拉长成一维,这样总体就可以用三维图形来表示。可以看出$BN$的计算和$batch$ $size$相关(蓝色区域为计算均值和方差的单元),而$LN$、$BN$和$GN$的计算和$batch$ $size$无关。同时$LN$和$IN$都可以看作是$GN$的特殊情况($LN$是$group$=1时候的$GN$,$IN$是$group=C$时候的$GN$)。
254341

255342
**参考资料**
256343

@@ -563,9 +650,10 @@ PS:有的文章称:发现这些全连接层即使被去除,对于性能也
563650
**1.ResNet意义**
564651

565652
随着网络的加深,出现了训练集准确率下降的现象,我们可以确定这不是由于Overfit过拟合造成的(过拟合的情况训练集应该准确率很高);所以作者针对这个问题提出了一种全新的网络,叫深度残差网络,它允许网络尽可能的加深,其中引入了全新的结构如图1;
566-
这里问大家一个问题
567653

568-
残差指的是什么?
654+
![image](https://cdn.nlark.com/yuque/0/2021/png/1160322/1617289648432-57691f7b-dd0e-4442-a755-5a76add9a582.png)
655+
656+
这里问大家一个问题,残差指的是什么?
569657

570658
其中ResNet提出了两种mapping:一种是identity mapping,指的就是图1中”弯弯的曲线”,另一种residual mapping,指的就是除了”弯弯的曲线“那部分,所以最后的输出是 y=F(x)+x
571659
identity mapping顾名思义,就是指本身,也就是公式中的x,而residual mapping指的是“差”,也就是y−x,所以残差指的就是F(x)部分。
@@ -578,6 +666,8 @@ identity mapping顾名思义,就是指本身,也就是公式中的x,而res
578666

579667
它使用了一种连接方式叫做“shortcut connection”,顾名思义,shortcut就是“抄近道”的意思,看下图我们就能大致理解:
580668

669+
![image](https://gitee.com/lebhoryi/PicGoPictureBed/raw/master/img/20210803221515.png)
670+
581671
**ResNet的F(x)究竟长什么样子?**
582672

583673
**参考资料**
@@ -612,7 +702,7 @@ identity mapping顾名思义,就是指本身,也就是公式中的x,而res
612702

613703
先上一下paper里的图例:
614704

615-
![](F:/Projects/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0%E9%9D%A2%E8%AF%95%E5%AE%9D%E5%85%B8%E8%B5%84%E6%96%99%E5%A4%A7%E5%85%A8/GitHub/Deep-Learning-Interview-Book/docs/imgs/DLIB-0023.jpg)
705+
![img](https://gitee.com/lebhoryi/PicGoPictureBed/raw/master/img/20210803221520.jpeg)
616706

617707
原因: 7x7卷积实际上是用来直接对**输入图片**降采样(early downsampling), 注意像7x7这样的大卷积核一般只出现在**input layer**
618708

@@ -650,7 +740,7 @@ identity mapping顾名思义,就是指本身,也就是公式中的x,而res
650740

651741
## ResNet v2
652742

653-
![resnetv2.png](F:/Projects/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0%E9%9D%A2%E8%AF%95%E5%AE%9D%E5%85%B8%E8%B5%84%E6%96%99%E5%A4%A7%E5%85%A8/GitHub/Deep-Learning-Interview-Book/docs/imgs/DLIB-0013.png)
743+
![image](https://gitee.com/lebhoryi/PicGoPictureBed/raw/master/img/20210803221710.png)
654744

655745
**参考资料**
656746

@@ -662,19 +752,22 @@ identity mapping顾名思义,就是指本身,也就是公式中的x,而res
662752

663753
### ResNet v1 与 ResNet v2的区别
664754

665-
- [ ] TODO
755+
​ ResNet V2和 ResNet V1 的主要区别在于,作者通过研究 ResNet 残差学习单元的传播公式,发现前馈和反馈信息可以直接传输,因此 skip connection 的非线性激活函数(如ReLU)替换为 Identity Mappings(y = x)。同时,ResNet V2在每一层中都使用了Batch Normalization。这样处理之后,新的残差学习单元将比以前更容易训练且泛化性更强。
756+
757+
- [tensorflow学习笔记——ResNet](https://www.cnblogs.com/wj-1314/p/11519663.html)
666758

667759
### ResNet v2 的 ReLU 激活函数有什么不同?
668760

669761
- [ ] TODO
670762

671763
## ResNeXt
672764

673-
- [ ] TODO
765+
`ResNet`提出`deeper`可以带来网络性质提高的同时,`WideResNet`则认为`Wider`也可以带来深度网络性能的改善。为了打破或`deeper`,或`wider`的常规思路,ResNeXt则认为可以引入一个新维度,称之为`cardinality`
674766

675-
**参考资料**
767+
![Image](https://gitee.com/lebhoryi/PicGoPictureBed/raw/master/img/20210803222454.webp)
676768

677769
- [ResNeXt算法详解](https://blog.csdn.net/u014380165/article/details/71667916)
770+
- ResNet 的其他变种:WRNS(Wide Residual Networks)、Res2Net、ReXNet
678771

679772
## Inception系列(V1-V4)
680773

@@ -701,7 +794,22 @@ identity mapping顾名思义,就是指本身,也就是公式中的x,而res
701794

702795
## DenseNet
703796

704-
- [ ] TODO
797+
在以往的网络都是从
798+
799+
- 要么深(比如`ResNet`,解决了网络深时候的梯度消失问题)
800+
- 要么宽(比如`GoogleNet``Inception`)的网络,
801+
802+
而作者则是从`feature`入手,通过对`feature`的极致利用达到更好的效果和更少的参数。
803+
804+
`DenseNet`网络有以下优点:
805+
806+
- 由于密集连接方式,DenseNet提升了梯度的反向传播,**使得网络更容易训练**
807+
- **参数更小且计算更高效**,这有点违反直觉,由于DenseNet是通过concat特征来实现短路连接,实现了特征重用,并且采用较小的growth rate,每个层所独有的特征图是比较小的;
808+
- 由于**特征复用**,最后的分类器使用了低级特征。
809+
810+
为了解决随着网络深度的增加,网络梯度消失的问题,在`ResNet`网络 之后,科研界把研究重心放在通过更有效的跳跃连接的方法上。`DenseNet`系列网络延续这个思路,并做到了一个极致,就是直接将所有层都连接起来。`DenseNet`层连接方法示意图如图所示。![Image](https://gitee.com/lebhoryi/PicGoPictureBed/raw/master/img/20210803222850.webp)
811+
812+
![Image](https://gitee.com/lebhoryi/PicGoPictureBed/raw/master/img/20210803222924.webp)
705813

706814
### 为什么 DenseNet 比 ResNet 好?
707815

0 commit comments

Comments
 (0)