2.3 残差网络为什么有用?(Why ResNets work?)

输入XX 经过一个大型神经网络输出激活值a[l]a^{[l]},再给这个网络额外添加两层作为一个ResNets块,输出a[l+2]a^{\left\lbrack l + 2 \right\rbrack}

a[l+2]=g(z[l+2]+a[l])=g(W[l+2]a[l+1]+b[l+2]+a[l])a^{[l+2]}=g(z^{[l+2]}+a^{[l]})=g(W^{[l+2]}a^{[l+1]}+b^{[l+2]}+a^{[l]})

假设在整个网络中使用ReLU激活函数,所以激活值都大于等于0,包括输入XX的非零异常值。因为ReLU激活函数输出的数字要么是0,要么是正数

如果使用L2正则化或权重衰减,会压缩W[l+2]W^{\left\lbrack l + 2\right\rbrack}的值。WW是关键项,如果W[l+2]=0W^{\left\lbrack l + 2 \right\rbrack} = 0,方便起见,假设b[l+2]=0b^{\left\lbrack l + 2 \right\rbrack} = 0,假定使用ReLU激活函数,并且所有激活值都是非负的,g(a[l])g\left(a^{[l]} \right)是应用于非负数的ReLU函数,所以a[l+2]=a[l]a^{[l+2]} =a^{[l]}

可以看出,即使发生了梯度消失,W[l+2]0W^{[l+2]}\approx0b[l+2]0b^{[l+2]}\approx0,也能直接建立a[l+2]a^{[l+2]}a[l]a^{[l]}的线性关系,且a[l+2]=a[l]a^{[l+2]}=a^{[l]},这就是identity function(恒等函数)。a[l]a^{[l]}直接连到a[l+2]a^{[l+2]},相当于直接忽略了a[l]a^{[l]}之后的这两层神经层。这样看似很深的神经网络,由于许多Residual blocks的存在,弱化削减了某些神经层之间的联系,实现隔层线性传递,而不是一味追求非线性关系,模型本身也就能“容忍”更深层的神经网络了。从性能上来说,这两层额外的Residual blocks也不会降低Big NN的性能,所以给大型神经网络增加两层,不论是把残差块添加到神经网络的中间还是末端位置,都不会影响网络的表现

如果Residual blocks确实能训练得到非线性关系,那么也会忽略short cut,跟Plain Network起到同样的效果

如果Residual blocks中a[l+2]a^{[l+2]}a[l]a^{[l]}的维度不同,可以引入矩阵WsW_sa[l]a^{[l]}相乘,使得Wsa[l]W_s*a^{[l]}的维度与a[l+2]a^{[l+2]}一致

参数矩阵WsW_s有来两种方法得到:

  • WsW_s作为学习参数,通过模型训练得到

  • 固定WsW_s值(类似单位矩阵),不需要训练,WsW_sa[l]a^{[l]}的乘积仅使得a[l]a^{[l]}截断或者补零

CNN中ResNets的结构:

ResNets同类型层之间,例如CONV layers,大多使用same类型,这也解释了添加项z[l+2]+a[l]z^{[l+2]}+a^{[l]}(维度相同所以能够相加)。如果是不同类型层之间的连接,例如CONV layer与POOL layer之间,如果维度不同,则引入矩阵WsW_s

Last updated