1.视频网站:mooc慕课https://mooc.study.163.com/university/deeplearning_ai#/c
2.详细笔记网站(中文):http://www.ai-start.com/dl2017/
3.github课件+作业+答案:https://github.com/stormstone/deeplearning.ai
2.4 残差网络为什么有用? Why ResNets work?
为什么ResNets能有如此好的表现,我们来看个例子,它解释了其中的原因,至少可以说明,如何构建更深层次的ResNets网络的同时还不降低它们在训练集上的效率。
希望你已经通过第三门课了解到,通常来讲,网络在训练集上表现好,才能在Hold-Out交叉验证集或dev集和测试集上有好的表现,所以至少在训练集上训练好ResNets是第一步。
先来看个例子。
上节课我们了解到,一个网络深度越深,它在训练集上训练的效率就会有所减弱,这也是有时候我们不希望加深网络的原因。而事实并非如此,至少在训练ResNets网络时,并非完全如此,举个例子。
如上图。假设有一个大型NN,用Big NN表示,其输入为 x x x,输出激活值 a [ l ] a^{[l]} a[l]。
假如你想增加这个NN的深度,再给这个网络额外添加两层,依次添加两层,最后输出为 a [ l + 2 ] a^{[l+2]} a[l+2]。
可以把这两层看作一个ResNets块,即具有捷径连接的残差块。为了方便说明,假设我们在整个网络中使用ReLU激活函数,所以激活值都大于等于0,包括输入 x x x的非零异常值。因为ReLU激活函数输出的数字要么是0,要么是正数。
我们看一下 a [ l + 2 ] a^{[l+2]} a[l+2]的值,也就是上节课讲过的表达式。即 a [ l + 2 ] = g ( z [ l + 2 ] + a [ l ] ) a^{[l+2]}=g(z^{[l+2]}+a^{[l]}) a[l+2]=g(z[l+2]+a[l])其中添加项 a [ l ] a^{[l]} a[l]是刚添加的跳跃连接的输入。
展开这个表达式。
a [ l + 2 ] = g ( W [