为什么 ResNets 避免了梯度消失问题?

人工智能 深度学习 激活函数 爆炸梯度问题 残差网络 梯度消失问题
2021-11-03 03:45:09

我读到,如果我们在深度神经网络中使用 sigmoid 或双曲正切激活函数,我们可能会遇到梯度消失的一些问题,这可以从这些函数的导数的形状中看出。ReLU 解决了这个问题,这要归功于它的导数,即使可能存在一些死单元。ResNet 使用 ReLU 作为激活函数,但是在网上我的理解是 ResNet 解决了梯度消失的问题,这要归功于它的恒等映射,我并不完全同意。那么 ResNet 中身份连接的目的是什么?它们是用来解决梯度消失的吗?而ReLU真的解决了深度神经网络中梯度消失的问题吗?

1个回答

在继续之前,重要的是要注意,正如这里所指出的那样,引入 ResNets 并不是为了专门解决 VGP,而是为了改善一般的学习。事实上,ResNet 的作者在原始论文中注意到,没有残差连接的神经网络的学习效果不如 ResNet,尽管它们使用的是批量归一化,理论上可以确保梯度不会消失(第 4.1 节) )。所以,在这个答案中,我只是给出了一个可能的解释,为什么 ResNets也可能减轻(或在一定程度上阻止)VGP,但下面引用的研究论文也证实 ResNets 阻止了 VGP。鉴于我没有完全阅读此答案中提到的所有论文,因此此答案中的信息可能并不完全准确。

跳过连接允许信息跳过层,因此,在前向传递中,来自层的信息l可直接喂入层l+t(即层的激活l被添加到层的激活中l+t), 为了t2,并且,在前向传播过程中,梯度也可以从层不变地流动l+t分层l.

这究竟如何防止消失梯度问题(VGP)?VGP 发生在梯度的元素(关于 NN 参数的偏导数)以指数方式变小时,因此随着梯度的参数更新变得几乎不显着(即,如果您添加一个非常小的数字0<ϵ1到另一个号码d,d+ϵ几乎一样d),因此,NN 学习非常缓慢或根本不学习(还考虑到数值错误)。鉴于这些偏导数是用链式法则计算的,这很容易发生,因为你不断地乘以小(有限精度)数字(如果你不熟悉,请看看链式法则是如何工作的)。例如,1515=125接着15125=1125, 等等。NN 越深,VGP 发生的可能性就越大。如果您熟悉链式法则和反向传播算法(即链式法则),这应该非常直观。通过允许信息跳过层,层l+t从两层接收信息l+t1和层l(不变,即您不执行乘法)。例如,计算层的激活l+t1,您执行通常的线性组合,然后应用非线性激活函数(例如 ReLU)。在这种线性组合中,您在可能已经非常小的数字之间进行乘法运算,因此这些乘法运算的结果甚至是更小的数字。如果你使用饱和激活函数(例如 tanh),这个问题甚至会更加严重。如果激活层l+t甚至小于层的激活l+t1,添加来自层的信息l将使这些激活更大,因此,在某种程度上,它们将阻止这些激活以指数方式变小。对于梯度的反向传播,可以说类似的事情。

因此,跳过连接可以缓解 VGP,因此它们可用于训练更深的 NN。

这些解释与Residual Networks Behave Like Ensembles of Relatively Shallow Networks论文中报告的发现大致一致,该论文指出

我们的结果揭示了似乎能够训练非常深的网络的关键特征之一:残差网络通过引入可以在非常深的网络范围内携带梯度的短路径来避免梯度消失问题。

在论文Norm-Preservation:为什么残差网络可以变得非常深?,作者还讨论了跳过连接的另一个理想效果。

我们从理论上和经验上表明,随着网络变得更深, ResNets 中的每个残差块都越来越保持规范