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得到,再经过第二层得到输出F=。然后右边x通过shortcut,与输出F相加,得到F+x。最后的输出就是(此时输入和输出维数相同),其中表示relu函数。
这个F就是我们的学习目标,即输入输出的残差y-x。
希望这个F等于0。
那为什么拟合残差要比拟合恒等映射要容易的多?
因为拟合H(x)=x的话,x经过**函数会被卡掉(**函数直接取值了),最后结果偏差就很大;而让F(x)=0,x是原始的x输入
【注】在有shortcut的情况下,反向传播更新参数,可以理解为在求偏导后再加上一个常数。
因此Resnet能解决退化,是因为有了跳接,浅层特征跳接到深层,深层网络可以得到一个不差于浅层网络的结果
三、残差网络结构
左边是VGG-19,中间是没有残差的PlainNet,右边是Resnet。
在Resnet中可以发现,存在一些虚线,虚线前后的BLock是维度不一致的,因为在去掉残差结构的PlainNet是每隔x层,空间上/2(下采样)但深度翻倍。
因此要处理空间和深度的不一致。
空间上不一致:给shortcut connection部分加上一个线性映射。即 。
深度(通道数)不一致:可以直接补0,或者在跳接过程中用1*1的卷积层进行升维。
引入跳接实际上让模型自身有了更加“灵活”的结构,即在训练过程本身,模型可以选择在每一个部分是选择 “更多进行卷积与非线性变换” 还是选择 “什么都不做” ,或是将两者结合。