目录
一、ResNet为什么能训练出1000层的模型
1.1 Residual如何处理梯度消失?
如何避免梯度消失?
一个办法就是将乘法运算变成加法运算(ResNet就是这么做的,特别是残差连接(Residual Connection))。
那么,Residual是如何处理梯度消失的?
假设有一个预测模型:y = f(x)
- x:输入
- f:表示神经网络模型
- y:输出
- w:权重
图中的蓝色部分表示原有模型某一层的 w 的更新计算(输出 y 中省略了损失函数)
- η:学习率
y 对 w 的梯度不能太小,如果太小的话,η 无论多大都不会起作用,并且也会影响数值的稳定性。
所以希望y 对 w 的梯度不要太小。
假设我在上面再加一层,y‘ = f(x) + g( f(x) ) 表示使用堆叠的方式对原有的模型进行加深之后的模型。
后面的部分表示 y' 对w的梯度,,经过链式法则展开之后:第二项 y‘ 关于 w 的梯度和之前蓝色部分的结果是一样的,没有任何变化。
那么问题出在第一项 ,第一项是 g(y) 关于 y 的梯度,是新加的层的输出对输入的导数。
它和预测值与真实值之间的差别有关系,假设预测的值和真实值之间的差别比较小的话,第一项的值就会变得特别小(假设新加的这个层的拟合能力比较强的话,预测的比较好,假设所加的层的拟合能力比较强,第一项就会变得特别小,
在这种情况下,和第二项相乘之后,乘积的值就会变得特别小,也就是梯度就会变得比之前小很多,那么就只能增大学习率,但很可能增大也不是很有用,因为这是靠近底部数据层的更新,如果增加得太大,很有可能新加的层中的w就已经很大了,这样的话可能会导致数值不稳定)。
正是因为乘法的存在,所以如果中间有一项比较小的话,可能就会导致整个式子的乘积比较小,越到底层的话乘积就越小。
那么,Residual是怎么解决这个问题的?
y‘' = f(x) + g( f(x) ) 表示使用残差连接的方式对原有的模型进行加深之后的模型输出。
使用加法的求导对模型表达式进行展开得到两项,第一项和前面所说的一样,就是蓝色的部分。
对于这两项来说,就算第二项的值比较小,也没关系,还是有第一项的值进行补充(大数加上一个小数还是一个大数,但是大数乘以一个小数就可能变成小数),正是由于跨层数据通路的存在,模型底层的权重相比于模型加深之前不会有大幅度的缩小。
直观上看的话,
图中的块都是residual的block,难点就是在靠近数据段的W是难以训练的。那么现在由于加入了跳转,所以在计算梯度的时候,在靠近数据段的W得到的梯度就可以直接从输出Y直接两个loss可以通过跨层连接通路直接快速地传递过来,就不需要一定等到原始的路线走完。
所以说在一开始的时候,下面的两层也会拿到比较大的梯度,就是因为跳转。
靠近数据端的权重 w 难以训练,但是由于加入了跨层数据通路,所以在计算梯度的时候,上层的loss可以通过跨层连接通路直接快速地传递给下层,所以在一开始,下面的层也能够拿到比较大的梯度,使得模型能够做比较高效的更新。
从梯度大小的角度来解释,residual connection 使得靠近数据的层的权重 w 也能够获得比较大的梯度,因此,不管网络有多深,下面的层都是可以拿到足够大的梯度,使得网络能够比较高效地更新。