• 梯度爆炸问题和梯度消失问题的一种解释和相应的解决方案


    1.梯度消失是指随着神经网路的层数增加,前向传播过程种梯度渐渐缩减为0,较低的连接层的参数已经无法再更新了;梯度爆炸是指梯度越来越大,逼近饱和,各层需要更新较大的权值,这可能是因为激活函数和初始化方法配合有问题,比如使用sigmoid和标准正态分布的初始化方案,导致输入的方差与输出的方差越来越大,最后输出层会发生梯度爆炸现象,sigmoid的期望值应该是0.5,而使用标准正态分布的初始化方案,总归是不太好的。


    2.我们需要信号在两个方向正确流动,进行预测的时候,信号为正向,在反向调整的时候,信号反向,输入的方差等于输出的方差,除非有相等的输入和神经元,否则一般是不相等的,有一个折中的方案,使用一种随机初始化的办法,要求初始化满足:

    正态分布,均值为0,方差为:1/(输入节点+输出节点)

    或者为均匀分布,分布函数半径r^2=3/(输入节点+输出节点)


    3.介绍非饱和激活函数

    sigmoid和tanh是饱和激活函数,而ReLU函数是非饱和激活函数,为什么把他们分为饱和和非饱和呢?就是因为梯度消失问题,对于饱和激活函数,容易倒是梯度消失,这是因为输入到达了激活函数的上边界,梯度几乎为0了,ReLU很好的解决了这个问题。

    ReLU = max(0, x),他的梯度只有0和1两种,他比饱和函数多了几个好处,一个是不会有反向的负值,神经网络的负值代表了噪声和一些无法解释的东西,另一个是不会导致梯度消失。他的一个不好的地方是,可能会导致神经元死亡,比如输入的是负值,神经元就会一直输出0,没有梯度传播。这时就需要ReLU的变体了。

    变体1:leakyReLU = (alhph*z,z),alpha一般取0.01(0.2可能更好),这样有负数的时候,也能够继续传播梯度。

    变体2:PReLU,alpha是一个可以训练的值,在大型图像数据集上表现得更好,但是对于小型数据集,可能存在过拟合风险

    变体3:ELU = alpha*(exp(z)-1) z<0,z,z>0,他避免了梯度消失问题,同时也避免了神经元死亡,神经元得输出均值也为0

    变体4:SELU,他在ELU之上得扩展,所以叫做SELU,它是自归一化的,倾向于使得神经元输出均值为0,标准差为1,它有几个前提条件:

    (1)输入必须满足标准正态分布

    (2).隐藏层权重必须用LeCun正态初始化

    (3).网络的架构必须是顺序的

    差点忘了将SELU是什么样子的了,其实就是对ELU多了一个lambda值,这个值还是一个固定值,保留小数点十多位,看的人莫名其妙,像是在胡说八道,但是这是科学家规规矩矩算出来的,大概是1.05.....后面不记得了。

  • 相关阅读:
    Mysql根据经纬度查询半径多少以内的数据,画个圈圈查数据库
    基于Javaweb的超市管理系统毕业设计项目源码+数据库+详细设计文档
    记录一次用Navicat的保存表结构的sql文件的功能,运行后造成整个表数据丢失
    【HDU No. 1224】 免费DIY之旅
    分布式全局唯一ID生成方案(附源码)
    DNS协议
    浏览器事件机制详解
    Dubbo服务提供者如何优雅升级?
    pytorch在GPU上运行模型实现并行计算
    Ubuntu20.04同时安装ROS1和ROS2
  • 原文地址:https://blog.csdn.net/weixin_42581560/article/details/133257012