> For the complete documentation index, see [llms.txt](https://baozoulin.gitbook.io/neural-networks-and-deep-learning/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://baozoulin.gitbook.io/neural-networks-and-deep-learning/di-si-men-ke-juan-ji-shen-jing-wang-luo-convolutional-neural-networks/convolutional-neural-networks/deep-convolutional-models-case-studies/24-can-cha-wang-luo-wei-shi-yao-you-yong-ff1f-ff08-why-resnets-work.md).

# 2.3 残差网络为什么有用？（Why ResNets work?）

[![](https://github.com/fengdu78/deeplearning_ai_books/raw/master/images/e1106db40c78c2e384305d6474c40d69.png)](https://github.com/fengdu78/deeplearning_ai_books/blob/master/images/e1106db40c78c2e384305d6474c40d69.png)

输入$$X$$ 经过一个大型神经网络输出激活值$$a^{\[l]}$$，再给这个网络额外添加两层作为一个**ResNets**块，输出$$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]})
$$

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

[![](https://github.com/fengdu78/deeplearning_ai_books/raw/master/images/f60f5ca514d4bad1288fc7cbd666dd99.png)](https://github.com/fengdu78/deeplearning_ai_books/blob/master/images/f60f5ca514d4bad1288fc7cbd666dd99.png)

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

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

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

如果Residual blocks中$$a^{\[l+2]}$$与$$a^{\[l]}$$的维度不同，可以引入矩阵$$W\_s$$与$$a^{\[l]}$$相乘，使得$$W\_s\*a^{\[l]}$$的维度与$$a^{\[l+2]}$$一致

[\
![](https://github.com/fengdu78/deeplearning_ai_books/raw/master/images/cefcaece17927e14eb488cb52d99aaef.png)](https://legacy.gitbook.com/book/baozou/neural-networks-and-deep-learning/edit#)

参数矩阵$$W\_s$$有来两种方法得到：

* 将$$W\_s$$作为学习参数，通过模型训练得到
* 固定$$W\_s$$值（类似单位矩阵），不需要训练，$$W\_s$$与$$a^{\[l]}$$的乘积仅使得$$a^{\[l]}$$截断或者补零

CNN中ResNets的结构：

[\
![](https://github.com/fengdu78/deeplearning_ai_books/raw/master/images/70062fa97916ab79c7ad37282ba1a5f4.png)](https://legacy.gitbook.com/book/baozou/neural-networks-and-deep-learning/edit#)

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