残差网络(ResNets)(Residual Networks (ResNets))

非常非常深的神经网络是很难训练的,因为存在梯度消失和梯度爆炸问题。习跳跃连接(Skip connection),它可以从某一层网络层获取激活,然后迅速反馈给另外一层,甚至是神经网络的更深层。我们可以利用跳跃连接构建能够训练深度网络的 ResNets,ResNets 是由残差块(Residual block)构建的。

 残差网络(ResNets)_卷积

这是一个两层神经网络,在L层进行激活,得到a[l+1],再次进行激活,两层之后得到a[l+2]。计算过程是从a[l]开始,首先进行线性激活,根据这个公式:z[l+1] = w[l+1]a[l] + b[l+1],通过a[l]算出z[l+1],即a[l]乘以权重矩阵,再加上偏差因子。然后通过 ReLU 非线性激活函数得到 a[l+1] , a[l+1] = g(z[l+1]) 计 算 得 出 。 接 着 再 次 进 行 线 性 激 活 , 依 据 等 式 z[l+2] =w[l+2]a[l+1] + b[l+2],最后根据这个等式再次进行 ReLu 非线性激活,即a[l+2] = g(z[l+2]),这里的g是指 ReLU 非线性函数,得到的结果就是a[l+2]

 残差网络(ResNets)_卷积_02

这是一个残差块,在残差网络中有一点变化,我们将a[l]直接向后,拷贝到神经网络的深层,在 ReLU 非线性激活函数前加上a[l],这是一条捷径,这就意味着最后这个等式(a[l+2] = g(z[l+2]))去掉了,取而代之的是另一个 ReLU 非线性函数,仍然对z[l+2] 进行 g函数处理,但这次要加上a[l],即: a[l+2] = g(z[l+2] +a[l]),也就是加上的这个a[l]产生了一个残差块。在上面这个图中,我们也可以画一条捷径,直达第二层。实际上这条捷径是在进行 ReLU非线性激活函数之前加上的,而这里的每一个节点都执行了线性函数和 ReLU 激活函数,以a[l]插入的时机是在线性激活之后,ReLU 激活之前。另一个术语“跳跃连接”,就是指a[l]跳过一层或者好几层,从而将信息传递到神经网络的更深层。ResNet 网络就是通过将很多这样的残差块堆积在一起,形成一个很深神经网络,把它变成 ResNet 的方法是加上所有跳跃连接,每两层增加一个捷径,构成一个残差块。如图所示,5 个残差块连接在一起构成一个残差网络。

 残差网络(ResNets)_神经网络_03

假设z[l+2] 与a[l]具有相同维度,所以 ResNets 使用了许多 same 卷积,所以这个a[l]的维度等于这个输出层的维度。之所以能实现跳跃连接是因为 same 卷积保留了维度,所以很容易得出这个捷径连接,并输出这两个相同维度的向量。


作者:​​zhang-X​