Resnet 学习笔记
前言
学了几个月的神经网络,感觉也没学到什么东西,炼丹能力倒是提升不少。。。不能只停留在应用方面,还是要掌握理论,因此就想借助博客园把我学到的理论知识都记录下来,也算是加深记忆了。
最近在看一些著名的网络模型,就从Resnet着手写下第一篇博客(主要是GoogleNet太复杂。。。)
Why Resnet
当今世界,神经网络模型越来越深,那么是不是越深的模型就越好呢?
论文中首先提出了一个问题:Degradation problem。具体来说就是随着网络深度的加深,准确率饱和(包括test_acc 和 train_acc),甚至快速下降。造成这个问题的原因显然不是过拟合(过拟合train_acc应该高),论文中也说不是梯度消失/爆炸(各种normalization包括BN能有效解决梯度消失问题)。
那么为什么会造成Degradation,论文中其实也没有详细的解释,网上也是众说纷纭,但是这不影响resnet的提出。
我们设想有两个网络\(N_1\)和\(N_2\),两个网络要拟合同一个函数\(H(x)\)。然而\(N_1\)只有10层,\(N_2\)有100层。两个网络训练出的函数我们记为\(H_{N1}(x)\),\(H_{N2}(x)\),实验表明\(N_2\)的拟合效果不如\(N_1\),即\(H_{N1}(x)\)更接近\(H(x)\)。
但是很明显,如果\(N_2\)的前10层训练出的函数刚好是\(F_{N1}(x)\),而后90层全是恒等映射,那么效果至少不会比\(N_1\)差。问题就在于现有的方法很难将多层非线性网络训练成恒等映射。因此Resnet就应运而生,利用所谓的Residue learning解决这一问题
What is Residue learning
先上图解释单个residue_unit
-
再上公式
\[ y = F(x,\{W\})+x \]图中就是一个最简单的residue_unit
假设这个unit要拟合的仍然是\(H(x)\),但现在网络兵分两路,右路直接是恒等映射,没有需要学习的参数。
那么这个时候,左路就需要拟合\(H(x)-x\),我们记为\(F(x)\),需要学习的参数都在这一路上,\(F(x)\)就是要学习的残差(residue),这就是所谓的残差学习(residue learning)
看起来是不是很简单,但这样一变的效果却很大。
回到刚刚的问题,现有多层非线性网络很难训练成恒等映射。
但是,residue_unit 要训练出恒等映射就相对容易。由于右路直接就是恒等映射,那么只需要左路学习出\(F(x) = 0\)的结构即可(比如所有权重置为0),这相对于\(F(x) = x\) 的结构更易于训练。因此就成功的将多层非线性的网络训练成恒等变换,于是也就能解决深层网络效果不如浅层网络的问题。但事实证明,带有residue unit的深层网络效果比浅层网络更好
Resnet就是在深层网络中加入shortcut(也就是上图中的右路),shortcut至少间隔两层(实验证明之间隔一层不会提高准确率),下图最右就是一个典型的Resnet网络
What does resnet solve
论文中说resnet解决的不是梯度消失,也不是过拟合。(当然网上也有其他论文证明resnet确实减弱了梯度消失)
按照论文中的说法解决的就是有效训练出恒等映射,使得深层网络不会遭受degradation problem
在另一篇论文(Identity Mappings in Deep Residual Networks)当中,作者提到了一个好处
the signal can be directly propagated from any unit to another, both forward and backward
具体推导可自行看论文。这篇论文还介绍了resnet的增强版,以及解释了为什么是
\[
y = F(x,\{W\})+x
\]
而不是
\[
y = \lambda_1 F(x,\{W\})+\lambda_2x\ \ \ \ \ \lambda_1,\lambda_2不等于1
\]
结语
Resnet 就介绍这么多吧,都是鄙人的理解,不确保正确性,如有错误还希望各位指正。下一篇计划写写复杂的GoogleNet。
Resnet真简洁!
参考文献
[1] Deep Residue Learning for Image Recognition. Kaiming He
[2] Identity Mappings in Deep Residual Networks. Kaiming He
[3] https://www.zhihu.com/question/64494691/answer/271335912