2.3 残差网络为什么有用?(Why ResNets work?)
Last updated
Last updated
输入 经过一个大型神经网络输出激活值,再给这个网络额外添加两层作为一个ResNets块,输出:
假设在整个网络中使用ReLU激活函数,所以激活值都大于等于0,包括输入的非零异常值。因为ReLU激活函数输出的数字要么是0,要么是正数
如果使用L2正则化或权重衰减,会压缩的值。是关键项,如果,方便起见,假设,假定使用ReLU激活函数,并且所有激活值都是非负的,是应用于非负数的ReLU函数,所以
可以看出,即使发生了梯度消失,,,也能直接建立与的线性关系,且,这就是identity function(恒等函数)。直接连到,相当于直接忽略了之后的这两层神经层。这样看似很深的神经网络,由于许多Residual blocks的存在,弱化削减了某些神经层之间的联系,实现隔层线性传递,而不是一味追求非线性关系,模型本身也就能“容忍”更深层的神经网络了。从性能上来说,这两层额外的Residual blocks也不会降低Big NN的性能,所以给大型神经网络增加两层,不论是把残差块添加到神经网络的中间还是末端位置,都不会影响网络的表现
如果Residual blocks确实能训练得到非线性关系,那么也会忽略short cut,跟Plain Network起到同样的效果
如果Residual blocks中与的维度不同,可以引入矩阵与相乘,使得的维度与一致
参数矩阵有来两种方法得到:
将作为学习参数,通过模型训练得到
固定值(类似单位矩阵),不需要训练,与的乘积仅使得截断或者补零
CNN中ResNets的结构:
ResNets同类型层之间,例如CONV layers,大多使用same类型,这也解释了添加项(维度相同所以能够相加)。如果是不同类型层之间的连接,例如CONV layer与POOL layer之间,如果维度不同,则引入矩阵