Resnet
一、为什么会有Resnet
神经网络越深,训练效果一定就越好?答案是否定的。因为不断加深网络层次,模型会发生退化现象。
那么,为什么会出现退化?
1、不是过拟合
在吴恩达机器学习课中,提到过由于模型过于复杂(次数过高)导致了高方差。
过拟合是:高方差,低偏差(测试误差大而训练误差小)。而CNN退化表现为测试误差和训练误差都很大。因此不是过拟合导致。
2、不是梯度爆炸/消失
这是前向传播,一步步计算出输出。
这是反向传播,一步步求出输入的梯度。
假设输出端接收之前回传的梯度为1,则在输入端梯度的模值,经过回传扩大了3~4倍。
当输入梯度大于1,那么经过很多层回传,梯度就会指数增长,出现梯度爆炸现象。
当输入梯度小于1,则就会越变越小,直至0,出现梯度消失现象。
而我们使用BN,控制了每层输入模值,也就解决梯度爆炸/消失的问题,但是退化现象依然没有解决。
3、
假设一个比较好的浅层网络,然后堆上好几层网络什么也不做,模型的效果应该不会变差。
但是由于非线性激活函数relu的存在,每次输入到输出都会存在信息损失,很难从输出反推回完整的输入。
因此,采用残差学习,想让模型具有恒等映射的能力,不会因为网络加深而退化。
二、残差学习
前面分析得出,如果深层网络后面的层都是是恒等映射,那么模型就可以转化为一个浅层网络。那现在的问题就是如何得到恒等映射H(x) = x了。
如果把网络设计为H(x) = F(x) + x,即直接把恒等映射作为网络的一部分。就可以把问题转化为学习一个残差函数F(x) = H(x) - x。
只要F(x)=0,就构成了一个恒等映射H(x) = x。 而且,拟合残差至少比拟合恒等映射容易得多。
因此出现了残差块的结构。
Resnet使用了一种连接方式叫做“shortcut connection”。
图中右侧的曲线叫做跳接(shortcut connection),通过跳接在激活函数前,将上一层(或几层)之前的输出与本层计算的输出相加,将求和的结果输入到激活函数中做为本层的输出。
图中过程:x输入(也就是上几层的输出),经过第一层+relu得到 σ ( W 1 x ) \sigma(W_1x) σ(W