深度学习笔记之残差网络[ResNet]
引言
本节将介绍残差网络( Residual Network,ResNet \text{Residual Network,ResNet} Residual Network,ResNet),本篇不是论文解读,仅针对论文种提到的问题进行描述,并介绍残差网络的原理。
引子:深度神经网络的性能问题
我们不否认,深度神经网络相比浅层,能够学习到更深层次的、更加丰富的特征信息。
但是一个神经网络模型层数越深,并不代表神经网络的性能越优秀。神经网络隐藏层数量越多,意味着反向传播过程中针对深层神经元(距离输入层更近的部分)梯度消失的可能性越高。为了预防/缓解这种情况,我们通常会使用:
- 在模型训练之前,随机初始化权重的分布 要稳定,尽量避免出现个别初始化权重过大/过小的情况;
与权重初始化相关的一篇文章:
权重初始化方式——零初始化 - 使用批标准化( Batch Normalization \text{Batch Normalization} Batch Normalization)。通过增加一些 Normalization Layers \text{Normalization Layers} Normalization Layers来约束各隐藏层输出关于权重梯度的偏差和方差。
其次,深度神经网络使得网络的复杂程度增大,在训练过程中容易出现过拟合 ( Overfitting ) (\text{Overfitting}) (Overfitting)。
这里观察论文中的图 1 1 1,它描述的是不同深度的神经网络对于同一数据集 ( CIFAR-10 ) (\text{CIFAR-10}) (CIFAR-10)训练和测试过程中错误率 ( Error Rate ) (\text{Error Rate}) (Error Rate)的变化情况:
题外话:错误率像‘阶梯形式’的下降过程,主要是通过减小学习率得到的效果。
通过上述图像观察可知,深层网络(红色线)的错误率下降情况明显不如浅层网络(黄色线),这里我们并不排除过拟合产生的影响,但也不全是过拟合产生的效果:
- 如果仅是过拟合现象导致的结果,那么无论是深层网络 ( 56-Layer ) (\text{56-Layer}) (56-Layer)还是浅层网络 ( 20-Layer ) (\text{20-Layer}) (20-Layer),它的训练过程产生的错误率应该是相近的;而仅在测试过程中存在较大差距。
- 但实际情况是:无论在训练过程还是测试过程深层网络与浅层网络之间 均存在较大差距。这只能说明:在针对该数据集的学习过程中,深层网络模型在性能方面劣于浅层网络模型。
核心问题:深层神经网络训练难
分析上述示例,为什么神经网络层数增加后,精度反而会变差 ? ? ?
-
暂时抛开神经网络的学习过程,仅从逻辑角度思考:如果某浅层网络对于数据集存在一个比较不错的拟合效果,那么对应深层网络(向浅层网络中插入一些新的层)的拟合效果也不应该变得很差。观察下图:
其中左图表示浅层网络 ( Shallow Network ) (\text{Shallow Network}) (Shallow Network)的某部分 ( Buliding Block ) (\text{Buliding Block}) (Buliding Block);而右图表示在对应浅层网络位置插入一个新的网络层而构成的深层网络 ( Deep Network ) (\text{Deep Network}) (Deep Network)。
当然,整个网络并非仅加入了这一层,这仅仅描述网络某部分的变化;并且图中添加层的位置也不唯一,任意位置均可。
以上图中这种插入方式为例,我们可以将这个新网络层 ( AddLayer ) (\text{AddLayer}) (AddLayer)看作成未插入之前两隐藏层之间的恒等映射 ( Identity Mapping ) (\text{Identity Mapping}) (Identity Mapping)。也就是说,它仅仅是对原始网络层做了一个简单的传递工作—— AddLayer \text{AddLayer} AddLayer插入之后,其输出与浅层网络的对应输出几乎没有变化。从而也不影响后续的传递过程。
-
逻辑角度观察该情况时是过于理想的。实际情况下,由于神经网络的反向传播过程,它只会将更多有效梯度传递到较浅的网络层(距离输出层近的那些网络层),而较深的网络层梯度的传递效果较差(梯度变化的效果较小 / / /过小)。见下图:
对应那些较深的网络,它们获取的梯度很小,甚至是几乎没有变化。这意味着:有没有这个层影响不大。而满足这种条件的无效层就可看作是逻辑角度中的恒等映射。
第二种情况仅仅说明‘神经网络’学习过程中的
Identity Mapping \text{Identity Mapping} Identity Mapping和逻辑角度认知的
Identity Mapping \text{Identity Mapping} Identity Mapping之间存在偏差。但它依然按照逻辑角度认知执行的。
-
但在执行真正的学习过程,使用算法对最优权重迭代的过程中(论文中使用的是随机梯度下降 ( Stochastic Gradient Descent,SGD ) (\text{Stochastic Gradient Descent,SGD}) (Stochastic Gradient Descent,SGD))基于第二种情况无法找到和浅层效果相当的精确解。
个人理解:上面说的那么多,想表达的意思是:深度模型的学习性能差绝不仅仅是因为‘过拟合/梯度消失’产生的结果:
而是在原始神经网络已经有比较不错的拟合效果的条件下,强行地增加了神经元/网络层的数量,从而使网络深层部分梯度没有有效传达导致这些层/神经元成为了
恒等映射。这个恒等映射是存在偏差的。个人认为主要原因是
模型权重初始化的问题。我们的本意想让初始化的参数通过
反向传播算法将其优化为有益的权重信息;但是这些深层网络的权重因
梯度消失的原因,并没有得到有效的优化/甚至是没有被优化。这反而使这些未优化好的权重成为了
噪声/累赘,从而导致了模型性能降低。
可以对比一下,假设将‘浅层网络’内增加一系列
对浅层网络输出完全不产生任何影响,并且不传播梯度的
0 0 0层,这么一比较自然会出现差距:
该部分有个人想法的小伙伴欢迎一起探讨。
残差网络的执行过程
残差网络提出一种通过人为构造恒等映射 的方式,使它能让更深的网络更容易地训练,并且学习效果越好。
- 首先观察正常情况下/没有执行残差连接 ( Residual Connection )