本文主要基于各大公司的面试题目,经典论文,学习过程中的常见问题进行总结,以期达到进一步务实深度学习基础部分,和面试复习。
文章目录
- 1 深度学习经典网络架构发展总结
- 2 各种算法的作用分析
- 3 各种问题的分析
- 4 常用的激活函数及优化函数
- 4.1 [常见激活函数](https://blog.csdn.net/weixin_42327752/article/details/125980571?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22125980571%22%2C%22source%22%3A%22weixin_42327752%22%7D&ctrtid=lGity)
- 4.2 [常见损失函数](https://blog.csdn.net/weixin_42327752/article/details/122223143?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22122223143%22%2C%22source%22%3A%22weixin_42327752%22%7D)
- 4.3 [常见的优化算法](https://blog.csdn.net/weixin_42327752/article/details/122433761)
1 深度学习经典网络架构发展总结
本章主要总结深度学习经典网络发展,以及其作用特点所在
1.1 总览全局
1.2 CNN深度模型的发展历程
1. LeNet 1998年
创新
:
首次提出卷积神经网络
内容
:
虽然LeNet在20世纪90年代就被提出,但由于有限的计算能力和存储容量,该算法直到2010左右才得以实现。
LeNet-5 的输入为包含数字或字母的灰度图像,经过卷积和池化后产生特征图像,即图像模态的矩阵表示,特征图像经过维度变化后获得全连接层的输入,即图像模态的向量表示。
结构
:
LeNet-5的基本结构为:2个卷积(conv)层,2个子采样层,2个全连接层,一个高斯连接的输出层。
2. AlexNet 2012年
创新
:
- 交叠池化 (Overlapping Pooling) 防止过拟合
- Local response Normalization,局部响应归一化,后被认为无效。
- dropout函数,防止过拟合
- Relu函数加速收敛,防止梯度消失爆炸。
内容
具有开创性意义,开启了深度学习时代。
结构
AlexNet 共包含 8 个可学习的层,其中前 5 层为卷积层+pooling,后为全连接层,最后接一个 1000 路的 softmax 层,用于分类。
4. VGG 2014年
创新
- 使用连续多个卷积核代替了较大的卷积核,保证具有相同感知野的条件下,提升了网络的深度
- 验证了不断加深模型结构会有更好的效果
内容
与AlexNet 增加神经网络深度的方式不同,VGG通过构建含有多个卷积子层的卷积层实现网络深度的拓展,它每层都有 2~4 个卷积子层,用较小的卷积核和多个卷积层实现了对图片特征的精细抓取。
VGG 的结构使得其能深度提取图像中的精细的语义特征,获得更好的图像模态表示。 为获得更好的图像模态表示,研究者不断地尝试增加网络的深度,但是发现当网络深度增加到一定程度后网络性能逐渐变差,获得的图像模态表示反而不能更好地提取图像模态信息
结构
5 GoogleNet 2014年
创新
- 提出 Inception 模块系列
- 兼顾稀疏网络和高性能
内容
Inception 模块具有高效表达特征的能力,它包含 1x1、3x3、5x5 三种尺寸的卷积核,以及一个 3x3 的下采样,不同尺寸的卷积核赋给 Inception 模块提取不同尺寸的特征的能力。
Inception 模块从纵向和横向上,增加了卷积层 的深度,使得 GoogLeNet 能够产生更抽象的图像模态的矩阵 表示。
结构
6 ResNet 2015年 何凯明
创新
- 里程碑模型,解决了深度网络退化问题
- 残差连接和恒等映射
内容
在此之前(2015),网络层数只有20多层,使用更深的层数就到导致网络退化(即使有了BN)。resnet实现了152层。
是在增加网络深度的研究方向上进行了突破性探索的深度卷积网络,由融合了恒等映射和残差映射的构造性模块堆栈后构成。当在网络已经到达最优情况下继续向深层网络运算时,构造性模块中的残差映射将被置 0,只剩下恒等映射,这样使网络在更深的网络层上也处于最优。
结构
残差连接:
ResNet:
1.3 RNN深度模型的发展历程
1.4 GAN的发展历程
1. GAN 2014年
创新
- 提出了左右互搏之术
内容
GAN的基本思想是串联训练两个网络-生成器和鉴别器。生成器的目标是生成使鉴别器蒙蔽的样本,该样本经过训练可以区分真实图像和生成的图像。随着时间的流逝,鉴别器将在识别假货方面变得更好,但生成器也将在欺骗鉴别器方面变得更好,从而生成看起来更逼真的样本。GAN的第一次迭代会产生模糊的低分辨率图像,并且训练起来非常不稳定。但是随着时间的推移,变化和改进。
结构
1.5 NLP深度模型的发展历程
2 各种算法的作用分析
2.1 Normalization
参考:详解深度学习中的Normalization,BN/LN/WN
Normalization出现的原因——难训练、收敛慢
Internal Covariate Shift
内部协方差转移:深度网络中,每一层的参数更新导致上一层输入数据的分布发生改变,通过层层的累加,高层的输入分布变化会非常剧烈,这就使得高层需要不断去重新适应底层的参数更新。为了训好模型,我们需要非常谨慎地去设定学习率、初始化权重、以及尽可能细致的参数更新策略。
深度网络随着网络深度的增加,出现以下两个问题:
- 训练起来越发复杂
- 收敛速度变慢
-
训练复杂的原因
因为ICS的存在,打破了机器学习模型的假设:独立同分布假设,训练数据和测试数据是满足相同分布的。
一旦输入的分布老是变化,不符合独立同分布的假设,因此网络模型很难稳定的去学习。 -
收敛变慢的原因:
随着网络深度加深或者在训练过程中,其分布逐渐发生偏移或者变动,之所以训练收敛慢,一般是整体分布逐渐往非线性函数的取值区间的上下限两端靠近,所以这导致反向传播时低层神经网络的梯度消失或者梯度爆炸,这是训练深层神经网络收敛越来越慢的本质原因。
需要将数据分布重新纠正独立同分布的道路上来:以下是Normalization的通用公式
1 Batch Normalization,2015年
Batch Normalization,BN,批标准化,是2015年提出的,如今在进行深度学习训练时,一般将其作为基础结构。
论文地址:Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
BN层的原理
BatchNorm就是在深度神经网络训练过程中使得每一层神经网络的输入保持相同分布的。
通过将输入数据的分布映射到均值为0,方差为1的正态化分布,使得激活函数输入值落在非线性函数对输入比较敏感的区间(之前是向两端偏移),这样就可以得到一个较合适的梯度,不会消失也不会爆炸。
算法原理:
BN层的作用
- 加快网络的训练和收敛的速度
在深度神经网络中中,如果每层的数据分布都不一样的话,将会导致网络非常难收敛和训练,而如果把 每层的数据都在转换在均值为零,方差为1 的状态下,这样每层数据的分布都是一样的训练会比较容易收敛。 - 控制梯度爆炸防止梯度消失
- 防止过拟合
在网络的训练中,BN的使用使得一个minibatch中所有样本都被关联在了一起,因此网络不会从某一个训练样本中生成确定的结果,即同样一个样本的输出不再仅仅取决于样本的本身,也取决于跟这个样本同属一个batch的其他样本,而每次网络都是随机取batch,这样就会使得整个网络不会朝这一个方向使劲学习。一定程度上避免了过拟合
BN层的位置
BN层一般用在全连接层和卷积层后面,而不是放在非线性单元(激活函数)之后。
原文解释:
因为非线性单元的输出分布形状会在训练过程中变化,归一化无法消除他的方差偏移。
相反的,全连接和卷积层的输出一般是一个对称,非稀疏的一个分布,更加类似高斯分布,对他们进行归一化会产生更加稳定的分布。
例如像relu这样的激活函数,如果你输入的数据是一个高斯分布,经过他变换出来的数据能是一个什么形状?小于0的被抑制了,也就是分布小于0的部分直接变成0了,这样不是很高斯了。
BN的限制
-
每个 mini-batch 比较大,要求数据分布比较接近。在进行训练之前,要做好充分的 shuffle. 否则效果会差很多。
-
由于 BN 需要在运行过程中统计每个 mini-batch 的一阶统计量和二阶统计量,因此不适用于 动态的网络结构 和 RNN 网络
2 Layer Normalization,LN
LN原理
如果说上面的BN对batch进行操作是一种纵向的归一化方式的话,那么LN可以看做是横向的Norm。就是为了克服BN的上述缺陷。
层规范化就是针对 BN 的上述不足而提出的。与 BN 不同,LN 是一种横向的规范化,如图所示。它综合考虑一层所有维度的输入,计算该层的平均输入值和输入方差,然后用同一个规范化操作来转换各个维度的输入。
LN优点
-
LN 针对单个训练样本进行,不依赖于其他数据,因此可以避免 BN 中受 mini-batch 数据分布影响的问题
-
可以用于 小mini-batch场景、动态网络场景和 RNN,特别是自然语言处理领域。
-
此外,LN 不需要保存 mini-batch 的均值和方差,节省了额外的存储空间。
但是,BN 的转换是针对单个神经元可训练的——不同神经元的输入经过再平移和再缩放后分布在不同的区间,而 LN 对于一整层的神经元训练得到同一个转换——所有的输入都在同一个区间范围内。如果不同输入特征不属于相似的类别(比如颜色和大小),那么 LN 的处理可能会降低模型的表达能力。
2.3 Dropout层
在2012年,Hinton在其论文《Improving neural networks by preventing co-adaptation of feature detectors》中提出Dropout。
在2012年,Alex、Hinton在其论文《ImageNet Classification with Deep Convolutional Neural Networks》中用到了Dropout算法,用于防止过拟合。
Dropout出现的原因——过拟合
在深度网络中,如果模型的寻训练数据不足,而模型的参数很多导致复杂的模型很容易产生过拟合的现象,也就是在训练集效果很好,在测试集一塌糊涂。
Dropout的原理
对于一个神经网络,输入是x输出是y,正常的流程是:我们首先把x通过网络前向传播,然后把误差反向传播以决定如何更新参数让网络进行学习。
使用Dropout之后,过程变成如下:
(1)首先随机(临时)删掉网络中一部分的隐藏神经元,输入输出神经元保持不变(图3中虚线为部分临时被删除的神经元)
(2) 然后把输入x通过修改后的网络前向传播,然后把得到的损失结果通过修改的网络反向传播。一小批训练样本执行完这个过程后,在没有被删除的神经元上按照随机梯度下降法更新对应的参数(w,b)。
(3)然后继续重复这一过程:
- 恢复被删掉的神经元(此时被删除的神经元保持原样,而没有被删除的神经元已经有所更新)
- 从隐藏层神经元中随机选择一个一半大小的子集临时删除掉(备份被删除神经元的参数)。
- 对一小批训练样本,先前向传播然后反向传播损失并根据随机梯度下降法更新参数(w,b) (没有被删除的那一部分参数得到更新,删除的神经元参数保持被删除前的结果)。
一直重复以上过程
Dropout的实现
具体怎么让某些神经元以一定的概率停止工作(就是被删除掉)?
(1)每个神经元增加一个概率参数
没有Dropout的网络计算公式:
z
i
(
l
+
1
)
=
w
i
(
l
+
1
)
y
l
+
b
i
(
l
+
1
)
,
y
i
(
l
+
1
)
=
f
(
z
i
(
l
+
1
)
)
.
\begin{aligned} z_{i}^{(l+1)} &=\mathbf{w}_{i}^{(l+1)} {\mathbf{y}}^{l}+b_{i}^{(l+1)}, \\ y_{i}^{(l+1)} &=f\left(z_{i}^{(l+1)}\right) . \end{aligned}
zi(l+1)yi(l+1)=wi(l+1)yl+bi(l+1),=f(zi(l+1)).
采用Dropout的网络计算公式:
r
j
(
l
)
∼
Bernoulli
(
p
)
,
y
~
(
l
)
=
r
(
l
)
∗
y
(
l
)
,
z
i
(
l
+
1
)
=
w
i
(
l
+
1
)
y
~
l
+
b
i
(
l
+
1
)
,
y
i
(
l
+
1
)
=
f
(
z
i
(
l
+
1
)
)
.
\begin{aligned} r_{j}^{(l)} & \sim \operatorname{Bernoulli}(p), \\ \widetilde{\mathbf{y}}^{(l)} &=\mathbf{r}^{(l)} * \mathbf{y}^{(l)}, \\ z_{i}^{(l+1)} &=\mathbf{w}_{i}^{(l+1)} \widetilde{\mathbf{y}}^{l}+b_{i}^{(l+1)}, \\ y_{i}^{(l+1)} &=f\left(z_{i}^{(l+1)}\right) . \end{aligned}
rj(l)y
(l)zi(l+1)yi(l+1)∼Bernoulli(p),=r(l)∗y(l),=wi(l+1)y
l+bi(l+1),=f(zi(l+1)).
上面公式中Bernoulli函数是为了生成概率r向量,也就是随机生成一个0、1的向量。
Dropout的作用——如何防止过拟合
(1) 从Ensemble learning的角度
随机杀死一部分神经元,使得每次都是一个新的模型,每次的模型结果进行投票平均,也就是另一个random forest模型。
(2)减少神经元之间复杂的共适应性
随机使得两个神经元不一定共同出现在一个神经网络里面,这样权值更新不再依赖于有固定关系的隐含节点的共同作用,阻止了某些特征仅仅在其它特定特征下才有效果的情况 。迫使网络去学习更加鲁棒的特征。
换句话说假如我们的神经网络是在做出某种预测,它不应该对一些特定的线索片段太过敏感,即使丢失特定的线索,它也应该可以从众多其它线索中学习一些共同的特征。从这个角度看dropout就有点像L1,L2正则,减少权重使得网络对丢失特定神经元连接的鲁棒性提高。
Dropout的代码实现
通过以下代码可以单独实现dropout效果:
# coding:utf-8
import numpy as np
# dropout函数的实现
def dropout(x, level):
if level < 0. or level >= 1: #level是概率值,必须在0~1之间
raise ValueError('Dropout level must be in interval [0, 1[.')
retain_prob = 1. - level
# 我们通过binomial函数,生成与x一样的维数向量。binomial函数就像抛硬币一样,我们可以把每个神经元当做抛硬币一样
# 硬币 正面的概率为p,n表示每个神经元试验的次数
# 因为我们每个神经元只需要抛一次就可以了所以n=1,size参数是我们有多少个硬币。
random_tensor = np.random.binomial(n=1, p=retain_prob, size=x.shape) #即将生成一个0、1分布的向量,0表示这个神经元被屏蔽,不工作了,也就是dropout了
print(random_tensor)
x *= random_tensor
print(x)
x /= retain_prob
return x
#对dropout的测试,大家可以跑一下上面的函数,了解一个输入x向量,经过dropout的结果
x=np.asarray([1,2,3,4,5,6,7,8,9,10],dtype=np.float32)
dropout(x,0.4)
[1 1 1 1 1 0 1 1 0 1]
[ 1. 2. 3. 4. 5. 0. 7. 8. 0. 10.]
array([ 1.6666666, 3.3333333, 5. , 6.6666665, 8.333333 ,
0. , 11.666666 , 13.333333 , 0. , 16.666666 ],
dtype=float32)
3 各种问题的分析
3.1 梯度消失和梯度爆炸现象
在深度网络中,如下
损失函数对w的梯度表示为 多个激活函数偏导数的连乘和多个权重参数的连乘。
如果激活函数求导后与权重相乘的积大于1,那么随着层数增多,求出的梯度更新信息将以指数形式增加,即发生梯度爆炸;如果此部分小于1,那么随着层数增多,求出的梯度更新信息将会以指数形式衰减,即发生梯度消失。
而在随着网络深度加深或者在训练过程中,其数据分布逐渐发生偏移,一般是整体分布逐渐往非线性函数的取值区间的上下限两端靠近,所以激活函数求导值靠近0或者1。
所以这导致反向传播时低层神经网络的梯度消失或者梯度爆炸