1.学习模型的理解
对于一类神经网络模型(更多指完备的模型,而非cnn、rnn等类型,如resnet、vgg等),他可以拟合一定范围之内的函数,所有函数构成集合F。其中任意f是我们通过训练得到的,f*是我们所期望得到的函数,但是f*可能在模型函数集合F之中,也可能在F之外。
训练是求解以下优化问题:
X、Y为训练集中的输入输出,argmin表示返回Loss()函数最小的参数值
2.如何保证模型加深能够使结果更优?
怎样得到更近似真正f∗的函数呢?唯⼀合理的可能性是,我们需要设计⼀个更强⼤的架构F′,我们要保证更大的构架完全包含之前的构架,即嵌套函数类,复杂的函数类F_复杂完全包含较小的函数类F_简单,才能确保复杂的模型能够提高简单模型的性能,所以深度学习不一定是越深越好。
加深层数并希望实现恒等映射的目标:
对于深度神经⽹络,我们将其加深一层,如果我们能将新添加的层训练成恒等映射(identity function) f(x) = x,新模型和原模型将同样有效,即新模型完全包含旧模型。同时,由于新模型更深,可能得出更优的解来拟合训练数据集,因此添加层似乎更容易降低训练误差,因此在恒等映射基础上更有助于接近理想映射f*(x)。
3.那么resnet是如何实现嵌套函数类的呢?
残差块!
resnet的核心思想在于每个附加层都应该更容易地将之前的层包含其中,也就是每个附加函数都将原始函数作为参数之一。
假设我们的原始输⼊为x,⽽希望学出的理想映射为f*(x)(作为图7.6.2上⽅激活函数的输⼊)。 图7.6.2左图虚线框中的部分需要直接拟合出该映射f(x),⽽右图虚线框中的部分则需要拟合出残差映射f(x) - x。
在残差块中残差映射很容易实现恒等映射,只需要将所有所有权重与偏差设置为零。而在正常块中,权重偏差没有固定值实现恒等映射,因此正常块1)不能保证完全包含上一层的范围,2)更难以训练,3)会出现梯度消失现象
实际中,当理想映射f*(x)极接近于恒等映射时,残差映射也易于捕捉前一层的细微波动。即反向传播时,可以避免梯度消失,灵敏捕捉到优化反向。所以残差块具备优点:
1)能够在训练后期更精确地进行优化,得到更精确的结果。
2)输入可以通过跨层数据线路前向传播更多层。
4.resnet中的残差块
ResNet沿⽤了VGG完整的3 × 3卷积层设计。
通过跨层数据通路,跳过这2个卷积运算,将输⼊直接加在最后的ReLU激活函数前。分为两种类型:
- 这样的设计要求2个卷积层的输出与输⼊形状⼀样,具有相同的输入和输出通道数、宽度、高度,从⽽使它们可以相加。如左图
- 如果想改变通道数,就需要引⼊⼀个额外的1 × 1卷积层来将输⼊变换成需要的形状后再做相加运算。如右图
- 如果想要改变宽度、高度,可以调整残差块中卷积层的步长stride及填充padding,此时也需要1*1的卷积层,否则无法正常相加,如右图
ResNet18的结构,共有18层构成,其中包含4个残差块。
小结
-
学习嵌套函数(nested function)是训练神经网络的理想情况。在深层神经网络中,学习另一层作为恒等映射(identity function)较容易(尽管这是一个极端情况)。
-
残差映射可以更容易地学习同一函数,例如将权重层中的参数近似为零。
-
利用残差块(residual blocks)可以训练出一个有效的深层神经网络:输入可以通过层间的残余连接更快地向前传播。
-
残差网络(ResNet)对随后的深层神经网络设计产生了深远影响。