残差神经网络学习
起因
- 我们在很深的神经网络之后,效果会变差!所以深一点的网络并不一定比浅得好
- 因为到了后期,网络自动变成了恒等映射,导致最后梯度几乎没有变化,学不出东西
- 但是对于深度的网络,浅层的解空间应该是深层的子集,然后事实却不一样,因为网络的degradation问题(网络退化)
- 随着层数的增多,连乘变得很不稳定
- 因为到了后期,网络自动变成了恒等映射,导致最后梯度几乎没有变化,学不出东西
解决
- 所以我们要构造不是恒等映射的东西
- 我们采用highway的那种方式,引入恒等快捷连接
- 映射完之后是$F(x)+x$,所以$F(x)$就是所谓的残差,相当于对比之前的学到的新的东西
- 既然有残差,既然学到了新的东西,那么就说明并没有梯度等还在变化,就不会像传统的方法那样造成“全部是恒等映射,而不改变”
- 网络显然会自动趋向于把F(x)学成0,如果学成0,x则会根据恒等映射继续传递
- 显然F(x)会比x小,小有什么用呢?
- 在最后的误差传播的一样的情况,梯度对参数的影响更甚
- ==resNet明显的减少了参数的值从而让网络的参数对反向传到得分损失之更敏感,==
- 形式上来说,还产生了一定的正则化作用
- 还有也是把乘法变成了加法,改善了梯度弥散的问题
- 对恒等映射的其他理解
- 我们设最后映射出的是$\lambda x$,这个$\lambda$会作为梯度,所以会累乘,所以变成1最好
结构上要解决的问题
- 因为恒等映射的时候会有两坨图片的大小不匹配的问题
- 我们想让浅层图片降维之后不引起信息丢失,可以在用同样大小的卷积核的同时引入一些1x1的核,增加非线性,减小输出的深度以减小计算成本
- 理论上会破坏一点恒等映射
- 我们想让浅层图片降维之后不引起信息丢失,可以在用同样大小的卷积核的同时引入一些1x1的核,增加非线性,减小输出的深度以减小计算成本
残差模块设置
$y=h(x_l)+F(x,W),x_{l+1}=f(y)$
- 这个公式是残差模块的基本形式,网络通过学习对F的参数来减小loss值
- h(x)是恒等映射;
- F是网络中的变化;
- f(x)是对于叠加之后的变化,在与原始模块中是relu
原始模块的时候,是F与h相加之后再经过一个relu
1、对应图中的c:把ReLU放在参数F中,不过这样会让恒等映射中的东西全部变成正值,大大地减少了残差的表示性
2、对应图中的e:把BN和Relu放在卷积之前,保证F中的所有操作都是在与x相加之前完成的,并且不会对残差造成限制,这样让整个信息的前向后向流动没有任何阻碍,使模型的优化更加的简单方便,还增加了残差模块的正则化作用
3、对应图中的d:只把ReLU提前,这样会造成点问题,当F经过最后一个BN的时候,还要经过一个和x的相加运算,从而本来BN固定分布的作用就没了。