深度学习之残差网络原理深度刨析

为什么要加深网络?

深度卷积网络自然的整合了低中高不同层次的特征,特征的层次可以靠加深网络的层次来丰富。
从而,在构建卷积网络时,网络的深度越高,可抽取的特征层次就越丰富。
所以一般我们会倾向于使用更深层次的网络结构,以便取得更高层次的特征。
但是在使用深层次的网络结构时我们会遇到两个问题,梯度消失,梯度爆炸问题和网络退化的问题。

也就是我们需要不断加深网络,因为网络越深,那么特征的层次也就越高,那么特征也就越丰富,
所以需要加深,但是加深后会带来两个问题,梯度消失或者爆炸、网络退化
通过标准的初始化和正则化层来基本解决,这样可以确保几十层的网络能够收敛,
但是随着网络层数的增加,梯度消失或者爆炸的问题仍然存在,为什么?

之前说了,梯度消失的根本原因,是因为链式求导中包含很多个对激活层的求导结果在0到1之间,原因是因为sigmod函数导致的,如果换成relu函数可以解决由于激活层的求导导致梯度消失的问题,那么为什么换成了relu函数,还是会有梯度消失的问题呢?别忘了,链式求导中不光包含对激活层的求导结果,它还包含了其它的求导结果,当网络很深的时候,这些求导结果如果都很小接近0的话,那么也有可能导致梯度消失,上一篇梯度消失原因公式推导最终的梯度如下:

Loss对w1的求导为
在这里插入图片描述
这若干个w的值如果都很小的话,那么連乘起来也会越来越小,所以也会导致梯度消失,这部分值如果都很大的话,那就会导致梯度爆炸

那么网络退化又是什么呢?

还有一个问题就是网络的退化,举个例子,假设已经有了一个最优化的网络结构,是18层。当我们设计网络结构的时候,我们并不知道具体多少层次的网络时最优化的网络结构,假设设计了34层网络结构。那么多出来的16层其实是冗余的,我们希望训练网络的过程中,模型能够自己训练这五层为恒等映射,也就是经过这层时的输入与输出完全一样。但是往往模型很难将这16层恒等映射的参数学习正确,那么就一定会不比最优化的18层网络结构性能好,这就是随着网络深度增加,模型会产生退化现象。它不是由过拟合产生的,而是由冗余的网络层学习了不是恒等映射的参数造成的。

一句话来说就是:
因为我们不知道最优的网络是多少层,只知道越深可能会越优,所以我们不断加深网络,将它加到100层,但其实最优的层数是60层,那么其实还有40层是多余的,那么理想中我们肯定希望这40层的输入等于输出,即希望这40层做的全是恒等映射,但是实际中这40层的输入等于输出概率非常小,它们学习的参数并不能使输入等于输出或者很难做到恒等映射,因此这40层就学习了一些实际没用的参数,导致最终100层的效果比最优层数的效果要差一些,也就是上面说的冗余的网络层学习了不是恒等映射的参数导致的

在这里插入图片描述

所以为了解决梯度消失和网络退化这两个问题,我们的残差网络也就诞生了,它可以说是一个里程碑吧,之前的网络像google-net也只能达到22层,但是resnet出来后,网络可以达到成百上千层

残差的精髓

我们令x经过冗余层映射后输入到下一层的值是h(x),x经过冗余层映射后的值为F(x)
在没加短链接之前,h(x) = F(x),我们希望输入到下一层的值h(x)=x, 但是学习x = h(x)很难,
所以我们就换个法子:
令h(x) = F(x) + x ,即让输入下一层的值 = 原来x的值 + x经过冗余层映射后的值F(x)
我们的目的还是一样希望x = h(x),也就是希望F(x) + x = x,所以也就是希望F(x) = 0,说白了就是希望x经过冗余层映射后的值F(x)=0,因为学习它比学习原来没加短链接的x = h(x)要简单很多,所以短链接就诞生了,或者残差就诞生了,这个残差就是F(x),也就是x经过冗余层映射后的值F(x),我们希望这个残差为0,也就是希望x经过冗余层映射后为0,也就能找到哪些是冗余层

那么残差网络究竟是如何防止梯度消失的呢?推导如下:
在这里插入图片描述
看到没这里有个x2,对x2求偏导,看到没,虽然在w1这一层,是对w1求偏导,但是x1经过非线性映射后输出为x2,所以在反向对w1求偏导的时候,需要对x2,x3,…xn求偏导,
又因为
在这里插入图片描述

在这里插入图片描述

所以在反向对w1求偏导的时候,需要对包含了对x2,x3,…xn求偏导的連乘,它们计算中都会加上1,所以最终的结果肯定会离0原来越远,所以可以有效防止梯度消失

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值