ResNet(Deep Residual Network)
ryan_fan
2018-05-30 22:04:30
745
0
0
[TOC] ---------- ##1、背景 >- 最棒的资料:https://www.jianshu.com/p/e58437f39f65 >- 为什么需要添加更多的网络层数? - CNN能够提取low/mid/high-level的特征,网络的层数越多,意味着能够提取到不同level的特征越丰富。 - 并且,越深的网络提取的特征越抽象,越具有语义信息。 >- 为什么不能简单地增加网络层数? - 对于原来的网络,如果简单地增加深度,会导致梯度弥散或梯度爆炸。对于该问题的解决方法是**正则化初始化**和**中间的正则化层**(Batch Normalization),这样的话可以训练几十层的网络。 - 虽然通过上述方法能够训练,但是又会出现另一个问题,就是退化问题,网络层数增加,但是在训练集上的准确率却饱和甚至下降了。**这个不能解释为overfitting**,因为overfit应该表现为在训练集上表现更好才对。 - 退化问题说明了深度网络不能很简单地被很好地优化。。 >- 关于退化问题的解释: - 网络越深,梯度消失的现象就越明显,所以在后向传播的时候,无法有效的把梯度更新到前面的网络层,靠前的网络层参数无法更新,导致训练和测试效果变差。 >- 怎么解决退化问题? - 解决退化问题的本质,在于怎样在增加网络深度的情况下有可以有效解决梯度消失的问题。 - 深度残差网络。如果深层网络的后面那些层是恒等映射,那么模型就退化为一个浅层网络。那现在要解决的就是学习恒等映射函数了。 但是直接让一些层去拟合一个潜在的恒等映射函数H(x) = x,比较困难,这可能就是深层网络难以训练的原因。但是,如果把网络设计为H(x) = F(x) + x,如下图。我们可以转换为学习一个残差函数F(x) = H(x) - x. 只要F(x)=0,就构成了一个恒等映射H(x) = x. 而且,**拟合残差肯定更加容易。** >- 为什么拟合残差更加容易? - **引入残差后的映射对输出的变化更敏感**。 - F是求和前网络映射,H是从输入到求和后的网络映射。比如把5映射到5.1,那么引入残差前是F'(5)=5.1,引入残差后是H(5)=5.1, H(5)=F(5)+5, F(5)=0.1。这里的F'和F都表示网络参数映射。 - 如果输出从5.1变到5.2,映射F'的输出增加了1/51=2%,而对于残差结构输出从5.1到5.2,映射F是从0.1到0.2,增加了100%。 - 明显后者输出变化对权重的调整作用更大,所以效果更好。 - **残差的思想都是去掉相同的主体部分,从而突出微小的变化,类似差分放大器。** >- ResNet中解决深层网络梯度消失的问题的核心结构是残差网络: - ![图片标题](https://leanote.com/api/file/getImage?fileId=5b0eb9b1ab64415546003205) - 残差网络增加了一个identity mapping(恒等映射),把当前输出直接传输给下一层网络(全部是1:1传输,不增加额外的参数),相当于走了一个捷径,跳过了本层运算,这个直接连接命名为“skip connection”,同时在后向传播过程中,也是将下一层网络的梯度直接传递给上一层网络,这样就解决了深层网络的梯度消失问题。 - **残差学习结构可以通过前向神经网络+shortcut连接实现**。shortcut连接相当于简单执行了同等映射,不会产生额外的参数,也不会增加计算复杂度。 而且,**整个网络可以依旧通过端到端的反向传播训练。** ##2、ResNet 的内在“世界观” - **退化角度** - 在不考虑overfitting的前提下,增加net的数量一定不会比浅层网络差。因为浅层网络只是深层网络的一个子集,多出来的网络至多可以做恒等映射,以维持效果在某一个“水平”。 - 如果出现了深层网络比浅层网络差,那么一定是深层网络在train的时候出现问题,即寻找最优解的方式出现问题。 - 如果直接寻找最优解比较困难,何不换一种思路呢:寻找何时深层网络开始做等价映射。 - 前面已经提到,当深层网络开始做等价映射时,即已经找到了最优解,模型的效果已经收敛平稳。 - So,将loss function改造为何时做等价映射,会更棒?至于原因和数学原理,后来有详述。 - **收敛平稳角度** - 假设增加网络层数,可以无限的逼近最优解,那何时才是最优呢? - 很简单,当第(l+1)层的输入和输出一致时,表明无论怎么增加网络层数,都无法提高模型的效果。 - 可以类比于化学里的饱和度:当前的这么多水(数据)只能达到这个浓度(拟合残差的程度),即使再加多少物质(网络层数),也是溶解不了。 - **梯度下降角度** - 增加net层数导致误差升高的原因是网络越深,梯度消失的现象就越明显。 - 在后向传播的时候,无法有效的把梯度更新到前面的网络层,靠前的网络层参数无法更新,导致训练和测试效果变差。 - ResNet面临的问题是**怎样在增加网络深度的情况下有可以有效解决梯度消失的问题。** ##3、ResNet 在学习上的优势 - 基于残差学习的深度学习的架构 - 对于一个堆积层结构(几层堆积而成)当输入为 x 时其学习到的特征记为 H(x) ,现在我们希望其可以学习到残差 F(x)=H(x)-x ,这样其实原始的学习特征是 F(x)+x 。 - 当残差为0时,此时堆积层仅仅做了恒等映射,至少网络性能不会下降。 - 实际上残差不会为0,这也会使得堆积层在输入特征基础上学习到新的特征,从而拥有更好的性能。 - 残差学习的结构【即残差学习单元】如图所示。这有点类似与电路中的“短路”,所以是一种短路连接(shortcut connection)。 - ![图片标题](https://leanote.com/api/file/getImage?fileId=5b0eb9b1ab64415546003205) - 为什么基于残差的学习比直接基于期望的学习要更容易? - 先看看残差单元的**数学表达**: $y_l=h(x_l)+F(x_l,W_l)$ $x_{l+1}=f(y_l)$ - $其中,x_l和x_{l+1}是第l个残差单元的输入和输出,F是一个残差函数。h(x_l)=x_l是一个恒等映射, f是ReLU函数。$ - 递推可以得到: $x_L=x_l+\sum_{i=l}^{L-1}F(x_i,w_i)$ - 也就是,第L个残差单元的输入可以表示为某一浅层残差单元的输入和其中间所有复杂映射之和,记损失函数为 ϵ,从而我们计算反向传播得到: $\frac{\partial{\epsilon}}{\partial{x_l}}=\frac{\partial{\epsilon}}{\partial{x_L}}\frac{\partial{x_L}}{\partial{x_l}}=\frac{\partial{\epsilon}}{\partial{x_L}}(1+\frac{\partial}{\partial{x_l}}\sum_{i=l}^{L-1}F(x_i,w_i))$ - $如果基于MBGD进行参数学习,那么\frac{\partial}{\partial{x_l}}\sum_{i=l}^{L-1}F(x_i,w_i)不可能每个batch的采样值都是-1,这也就是说梯度消失的本源已不存在。$ - 小括号中的1表明短路机制可以无损地传播梯度,而另外一项残差梯度则需要经过带有weights的层,梯度不是直接传递过来的。 - 论文已经证明,h(x_l)=x_l的恒等映射是最优的。 - 这种显式修改网络结构,加入残差通路,让网络更容易学习到恒等映射。学习到恒等映射,等价于找到最优解。 - 残差网络ResNets的特点 - 残差网络在模型表征方面并不存在直接的优势,ResNets并不能更好的表征某一方面的特征,但是ResNets允许逐层深入地表征更多的模型。 - 残差网络使得前馈式/反向传播算法非常顺利进行,在极大程度上,残差网络使得优化较深层模型更为简单 - “shortcut”快捷连接添加既不产生额外的参数,也不会增加计算的复杂度。快捷连接简单的执行身份映射,并将它们的输出添加到叠加层的输出。通过反向传播的SGD,整个网络仍然可以被训练成终端到端的形式。
立即体验
x