• 04.8. 数值稳定性和模型初始化


    4.8. 数值稳定性和模型初始化

    4.8.1. 梯度消失和梯度爆炸

    4.8.1.1. 梯度消失

    由于早期的人工神经网络受到生物神经网络的启发, 神经元要么完全激活要么完全不激活(就像生物神经元)的想法很有吸引力。
    然而,它却是导致梯度消失问题的一个常见的原因, 让我们仔细看看sigmoid函数为什么会导致梯度消失。

    %matplotlib inline
    from mxnet import autograd, np, npx
    from d2l import mxnet as d2l
    
    npx.set_np()
    
    x = np.arange(-8.0, 8.0, 0.1)
    x.attach_grad()
    with autograd.record():
        y = npx.sigmoid(x)
    y.backward()
    
    d2l.plot(x, [y, x.grad], legend=['sigmoid', 'gradient'], figsize=(4.5, 2.5))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GvPxxY42-1662888873988)(https://zh.d2l.ai/_images/output_numerical-stability-and-init_e60514_3_1.svg)]

    正如你所看到的,当sigmoid函数的输入很大或是很小时,它的梯度都会消失。
    此外,当反向传播通过许多层时,除非我们在刚刚好的地方, 这些地方sigmoid函数的输入接近于零,否则整个乘积的梯度可能会消失。
    当我们的网络有很多层时,除非我们很小心,否则在某一层可能会切断梯度。
    事实上,这个问题曾经困扰着深度网络的训练。 因此,更稳定的ReLU系列函数已经成为从业者的默认选择(虽然在神经科学的角度看起来不太合理)。

    4.8.1.2. 梯度爆炸

    相反,梯度爆炸可能同样令人烦恼。 为了更好地说明这一点,我们生成100个高斯随机矩阵,并将它们与某个初始矩阵相乘。 对于我们选择的尺度(方差),矩阵乘积发生爆炸。 当这种情况是由于深度网络的初始化所导致时,我们没有机会让梯度下降优化器收敛。

    M = np.random.normal(size=(4, 4))
    print('一个矩阵 \n', M)
    for i in range(100):
       M = np.dot(M, np.random.normal(size=(4, 4)))
    
    print('乘以100个矩阵后\n', M)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    一个矩阵
     [[ 2.2122064   1.1630787   0.7740038   0.4838046 ]
     [ 1.0434403   0.29956347  1.1839255   0.15302546]
     [ 1.8917114  -1.1688148  -1.2347414   1.5580711 ]
     [-1.771029   -0.5459446  -0.45138445 -2.3556297 ]]
    乘以100个矩阵后
     [[ 3.4459747e+23 -7.8040759e+23  5.9973355e+23  4.5230040e+23]
     [ 2.5275059e+23 -5.7240258e+23  4.3988419e+23  3.3174704e+23]
     [ 1.3731275e+24 -3.1097129e+24  2.3897754e+24  1.8022945e+24]
     [-4.4951091e+23  1.0180045e+24 -7.8232368e+23 -5.9000419e+23]]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    4.8.1.3. 打破对称性

    注意,虽然小批量随机梯度下降不会打破这种对称性,但暂退法正则化可以。

    4.8.2. 参数初始化

    解决(或至少减轻)上述问题的一种方法是进行参数初始化, 优化期间的注意和适当的正则化也可以进一步提高稳定性

    4.8.2.1. 默认初始化

    如果我们不指定初始化方法, 框架将使用默认的随机初始化方法,对于中等难度的问题,这种方法通常很有效。

    4.8.2.2. Xavier初始化

    尽管在数学推理中,“不存在非线性”的假设在神经网络中很容易被违反, 但Xavier初始化方法在实践中被证明是有效的。

    4.8.3. 小结

    • 梯度消失和梯度爆炸是深度网络中常见的问题。在参数初始化时需要非常小心,以确保梯度和参数可以得到很好的控制。

    • 需要用启发式的初始化方法来确保初始梯度既不太大也不太小。

    • ReLU激活函数缓解了梯度消失问题,这样可以加速收敛。

    • 随机初始化是保证在进行优化前打破对称性的关键。

    • Xavier初始化表明,对于每一层,输出的方差不受输入数量的影响,任何梯度的方差不受输出数量的影响。

  • 相关阅读:
    WPF常用mvvm开源框架介绍 vue的mvvm设计模式鼻祖
    Jekyll 语句语法、功能的实现方法和结构介绍小手册
    面试题: LEAD 和 LAG 求每个用户的页面停留时长
    TSRFormer:复杂场景的表格结构识别新利器
    Apache Jmeter测压工具快速入门
    杰理之MIC 免电容方案需要设置【篇】
    C++信号量机制
    【Unity入门计划】基本概念(6)-精灵渲染器 Sprite Renderer
    【云原生 | Kubernetes 系列】---Prometheus的服务发现机制
    重构学习(四):代码的坏味道
  • 原文地址:https://blog.csdn.net/weixin_45063703/article/details/126807396