一.的介绍及核心思想
2015年 , 大大吸引了人们的眼球 。实际上 , 早在分类竞赛中 , 取得胜利 , 深度残差网络(Deep)就成为过去几年中计算机视觉和深度学习领域最具突破性的工作 。使得训练深达数百甚至数千层的网络成为可能 , 而且性能仍然优异 。
由于其表征能力强 , 在图像分类任务之外的许多计算机视觉应用上也取得了巨大的性能提升 , 例如目标检测等等 。
的核心思想:
根据泛逼近定理() , 如果给定足够的容量 , 一个单层的前向网络就足够表达任何函数 。但是 , 这个层可能是非常大的 , 而且网络容易过拟合 , 因此 , 研究界有一个共同的趋势 , 就是网络结构越来越深 。
从的提出以来 , state-of-the-art的CNN经典模型都是越来越深 。虽然只有5层卷积层 , 但后来的VGG网络和分别由19层和22层 。
但是 , 如果只是简单地将层堆叠在一起 , 增加网络的深度并不会起太大的作用 。这是由于训练时会存在梯度消失( )问题 , 这使得深层网络难以训练 。下图展示了网络深度大的增加导致性能迅速下降:
为什么网络层数越深超过一定界限后网络效果就变得不好呢? 因为误差是普遍存在的 , 无论是训练集还是测试集 , 随着误差的传播 , 越往后误差越大 , 所以越深的网络效果可能并不会很好 。按照信息熵的传播原理 , 信息在传播的过程中是有损失的 , 所以越深的网络能够学到的信息就越少 , 所以就更难训练 。神经网络在求梯度的时候有个链式法则 , 求解梯度时会有累乘造成了梯度弥散或者爆炸 。
基于上述存在的问题 , 第一次提出了残差结构 , 主要用于解决上面提到的两个问题:
梯度消失的问题 。随着网络深度增加 , 性能没有提升反而下降的问题 。
如下图所示 , 我们引入一个“恒等捷径连接()” , 本来要学习 F ( x ) F(x) F(x),现在转换为 F ( x ) + x F(x) + x F(x)+x , 二者效果相同 , 但是优化难度下降 , 并且因为多了一个x , 使得求导时总有1 , 避免了梯度消失的问题 。
我们结合上图进一步解释残差指的是什么:
提出了两种:
第一种是 , 指的是上图中的“弯弯曲曲的曲线” 。第二种是 , 指的是除了“弯弯曲曲的曲线”的部分 , 所以最后的输出是 H ( x ) = y = F ( x ) + x H(x) = y = F(x) + x H(x)=y=F(x)+x 。
其中 是 x x x , 是 y ? x y - x y?x , 即F(x) 。(我想到了差分放大器)
为什么加入残差模块会有效果呢?
假设:如果不使用残差模块 , 输出为 F 1 ( x ) = 5.1 F_{1} (x)= 5.1 F1?(x)=5.1 , 期望输出为 H 1 ( x ) = 5 H_{1} (x)= 5 H1?(x)=5 , 如果想要学习H函数 , 使得 F 1 ( x ) = H 1 ( x ) = 5 F_{1} (x) = H_{1} (x) = 5 F1?(x)=H1?(x)=5 , 这个变化率比较低 , 学习起来是比较困难的 。
但是如果设计为H 1 ( x ) = F 1 ( x ) + 5 = 5.1 H_{1} (x) = F_{1} (x) + 5 = 5.1 H1?(x)=F1?(x)+5=5.1 , 进行一种拆分 , 使得 F 1 ( x ) = 0.1 F_{1} (x)= 0.1 F1?(x)=0.1 , 那么学习目标就变为让 F 1 ( x ) = 0 F_{1} (x)= 0 F1?(x)=0 , 一个映射函数学习使得它输出由0.1变为0 , 这个是比较简单的 。也就是说引入残差模块后的映射对输出变化更加敏感了 。
- CI1122离线语音模块固件升级步骤
- 5 c语言调用Linux的sleepy函数,Linux设备驱动程序学习
- 记得收藏噢~ 值得收藏的学习网站
- 机器学习之数据分布的含义理解
- 三 深度学习笔记:神经网络之九种激活函数Sigmoid、tanh、ReLU、R
- java/php/net/python软考软件设计师考试题库学习设计
- 五 花书读书笔记-深度前馈网络
- 《Qt5学习笔记1》安装Qt5并配置环境变量
- 干货:10个超经典JavaIDE插件,建议收藏!
- 十四 花书读书笔记-表示学习