文章目录
- 第一部分:现代 CNN 结构的演变
- 第二部分:CNN 中的一些重点知识
- 2.1 Dropout 技术
- 2.2 ReLU 激活函数及其变种
- 2.2.1 所有激活函数概览
- 2.2.2 补充资料
- 2.3 梯度爆炸、梯度消失
- 2.3.1 核心部分
- 2.3.2 补充资料
- 2.4 Batch Normalization
- 2.4.1 深入剖析 batch normalization
- 2.4.2 Beyond batch normalization
- 2.5 各种不同的优化算法
第一部分:现代 CNN 结构的演变
第二部分:CNN 中的一些重点知识
2.1 Dropout 技术
核心知识提炼:
- 在机器学习模型中,如果模型参数太多,而训练样本又太少,就容易产生过拟合。
- 过拟合的表现:模型在训练数据上损失函数较小,预测准确率较高;而在测试数据上损失函数较大,预测准确率较低。
- dropout 可以比较有效地缓解过拟合的发生。
- dropout 地直观解释:在前向传播的时候,让一部分神经元以概率 p 停止工作,从而使模型的泛化性能更强。
2.2 ReLU 激活函数及其变种
2.2.1 所有激活函数概览
ReLU、Leaky ReLU、PReLU 及 RReLU的介绍和比较:
核心知识摘录如下:
- Sigmoid 函数和 tanh 函数共同的两个缺点:(1) 梯度消失;(2) 指数函数的计算消耗计算资源。
- ReLU:
- 优点:(1) 解决了梯度消失问题;(2) ReLU 属于非饱和激活函数,能够使模型快速收敛;(3) 不需要指数计算,计算速度快。
- 缺点:随着训练的进行,可能会出现神经元死亡,权重无法更新的情况。如果发生这种情况,那么流经神经元的梯度从这一点开始将永远是 0,也就是说这种死亡是不可逆转的死亡。因此,在使用 ReLU 时,必须要设置一个合理的学习率。
- Leaky ReLU:2013 年在声学模型中首次被提出,它解决了 “dead ReLU” 的问题。但它的缺点是,必须要非常小心谨慎地重复训练,选取出合适的 (
- PReLU:是对 Leaky ReLU 的改进,它将 Leaky ReLU 中
- RReLU:是 Leaky ReLU 的一个变体。在 RReLU 中,负半部分的斜率在训练中是随机的 (它是从一个均匀分布中随机抽取的),而在之后的测试中就变成固定的了。
- ELU (指数线性单元):激活函数的输出均值是接近零的,但由于计算的时候需要计算指数,因此计算资源消耗较大。
2.2.2 补充资料
核心知识提炼:
- ReLU 激活函数不存在梯度消失问题,因此可以训练非常深的神经网络;
- 使用 ReLU 激活函数可以简化计算过程,没有了其他复杂的激活函数中诸如指数函数的计算带来的影响;
- ReLU 函数本质上是一种单侧抑制,因而它能够使神经元具有稀疏性。通过ReLU 稀疏后的模型能够更好地挖掘相关特征,拟合训练数据。
2.3 梯度爆炸、梯度消失
2.3.1 核心部分
关于梯度消失、梯度爆炸问题的深层剖析:
重点部分摘录:
- 梯度消失、梯度爆炸问题多出现在深层神经网络中;
- 梯度消失、梯度爆炸的根本原因在于基于反向传播的训练规则。神经网络中不同层的梯度是通过链式法则一层层地乘过来的,如果每一层的梯度值都大于 1,那么当层数增多的时候,最终求出来的梯度值将以指数形式增长,从而引发梯度爆炸;而如果每一层的梯度值都小于 1,那么随着层数的增多,求出来的梯度值将以指数形式衰减,从而导致梯度消失。
从直观上来讲,就是不同层的学习速度差别很大,网络中靠近输出的层学习的情况很好,而靠近输入的层学习的很慢。
在深度神经网络中,梯度消失出现的更多一些。 - 另外一个引发梯度消失的原因就在于激活函数本身。比如 Sigmoid 函数,它的导数值最大不超过 0.25(而且这个 0.25 只在 x=0 这一个点处取到);即使是 tanh 函数,它的梯度值也不超过 1(而且这个 1 只在 x=0 这一个点处取到)。如果用这两种函数作为激活函数,那么显然经过链式求导之后,很容易发生梯度消失。
- 那么梯度消失和梯度爆炸的解决方案有哪些呢?
- 首先是选用更好的激活函数,如 ReLU 函数。在正半轴上,ReLU 的导数始终为 1,这样每个层都可以得到相同的更新速度,而且不容易发生梯度消失或梯度爆炸的现象。
- 第二种解决方法是 batch normalization (BN)。在反向传播中,梯度的因式项中有输入 的存在,所以 也会影响到梯度的消失和爆炸。如何消除 带来的影响呢?batch normalization 就是通过对每一层的输出进行归一化,来消除
- 第三种方法是利用权重的正则化(见本博客 2.3.2 节的补充资料)。
- 第四种方法是利用梯度截断(见本博客 2.3.2 节的补充资料)。
2.3.2 补充资料
核心知识提炼:
- 梯度爆炸是指神经网络训练过程中大的误差梯度不断累积,导致模型的权重出现大幅度的更新。在极端情况下,权重的值变得非常大,以至于溢出,导致 NaN 值。
- 梯度爆炸会导致模型不稳定,最好的结果是无法从训练数据中学习,最坏的结果是出现无法再更新的 NaN 权重值。
- 如何解决梯度爆炸问题?
- a. 使用 ReLU 激活函数;
- b. 利用权重正则化 (Weight Regularization):例如使用 L1 惩罚项(权重绝对值)或 L2 惩罚项(权重平方),惩罚产生较大权重值的损失函数;
- c. 使用梯度截断:设置一个阈值,检查梯度值是否超过阈值。如果超过,则截断梯度,并将梯度设置为阈值;
- d. 重新设计层数更少的网络模型或使用更小的 batch size。
2.4 Batch Normalization
2.4.1 深入剖析 batch normalization
一篇非常优秀的讲解:知乎. Batch Normalization原理与实战
核心知识总结:
- BN 的提出是为了解决 Internal Covariate Shift 的问题。也就是:在深层神经网络的训练过程中,网络中参数的变化会引起内部结点的数据分布发生变化,从而使后面的层需要不断地进行调整来适应这种输入数据分布带来的变化,导致模型的训练变得困难。
- 另一方面,当我们使用饱和激活函数 (saturated activation function,例如 Sigmoid, tanh函数) 时,很容易使模型训练进入梯度饱和区,从而会使参数的更新速度减慢,减缓模型的收敛速度。(关于梯度饱和问题有两种解决思路:一种是改用非饱和激活函数,如 ReLU;另一种是想办法让激活函数的输入分布保持在一个稳定状态,从而尽可能避免它陷入梯度饱和区。BN 采用的就是这种思路。)
- Internal Covariate Shift 产生的原因是参数更新带来的网络中每一层输入值分布的改变,并且随着网络层数的加深而变得更加严重,因此可以通过固定每一层网络输入值的分布来减缓 Internal Covariate Shift (ICS)问题。
- 白化操作有助于缓解 ICS 问题(关于这一点要多看看上面那个链接),但是由于白化过程计算成本太高,而且白化过程丢失了网络中数据本身的表达能力,因而便演化出了改进版的白化,即 BN。
- BN 的两大思路:
- 首先,为了减小白化过程中的计算量,BN 尝试单独对每个特征进行 normalization,让每个特征的均值都为 0,方差都为 1;
- 其次,为了解决白化操作减弱网络中每一层输入数据表达能力的问题,BN 在进行白化之后,又添加了一个线性变换操作:
- 注意:BN 是基于 mini-batch 来进行计算的,因此它不适合用在处理变长 Sequence 的 RNN 中。此外,基于一个 mini-batch 来计算均值和方差的做法本身就会引入一定的噪声,因而 BN 不适合用在对噪声敏感的强化学习中。
- 关于 BN 公式的推导(非常重要),一定要多看看上述链接中的 2.2.2 节和 2.2.3 节。
- 另外一个问题是 BN 中为什么要引入 和 ?这样做的原因就是刚才所提到的——为了恢复数据本身的表达能力,具体做法就是对规范化后的数据进行线性变换: ,这里 和
- 关于测试阶段如何使用 BN,参见上面链接中的第 3 节。
- 关于 BN 的优点,见上述链接中的第 4 节。大体来讲就是使网络中每层输入数据的分布变得更加稳定,从而加速模型收敛;使训练过程变得更加稳定;BN 由于引入了随机噪声,所以还具有一定的正则化效果;如果使用的是饱和性激活函数(Sigmoid, tanh),BN 还可以缓解梯度消失问题。
2.4.2 Beyond batch normalization
Batch Normalization 的缺点及部分解决方案:
- 知乎. 深度学习加速策略BN、WN和LN的联系与区别,各自的优缺点和适用的场景?
(主要是 BN 不适用于 RNN 以及在 RNN 中有什么替代的解决方案。)
2.5 各种不同的优化算法
综合:
- (总结得非常好,优先看!)