当前位置: 首页 > news >正文

【机器学习】038_梯度消失、梯度爆炸

一、原因

神经网络梯度

· 假设现在有一个 d 层的神经网络,每层的输出为一个对输入作 f_t 变换的函数结果

· 用 h^t 来表示第 t 层的输出,那么有下列公式:

h^t = f_t(h^{t-1})

· 链式法则计算损失 l 关于某一层某个参数 w_t 的梯度:

\frac{\partial l}{\partial w_t}=\frac{\partial l}{\partial h^d}\frac{\partial h^d}{\partial h^{d-1}}...\frac{\partial h^t}{\partial w_t}

· 注意到,h^t 为向量,这相当于一个 d-t 次的矩阵乘法

这个传递可能造成以下问题:

· 假设每次的梯度为1.5,但随着神经网络的规模变大,往后传递过去可能就有 1.5^{100}=4*10^{17} 这么大,从而产生梯度爆炸。

· 假设每次的梯度为0.8,同样的道理,传递过去可能有 0.8^{100}=2*10^{-10} 这么小,从而使模型最后的变化幅度很小,出现梯度消失。

二、梯度消失

假设用sigmoid函数作为激活函数

· 导数的问题是,当输入相对较大或者较小时,求导计算之后,每次向上传递的梯度会变得很小

· 累乘起来之后,这个值可能就会变得更小

可能造成的问题:

· 梯度值非常接近0,使得模型无法训练,每次训练改变幅度非常小

· 在神经网络较深时,对于底部层尤为严重

        · 反向传播时,顶部的训练可能较好,拿到的梯度较正常

        · 越到底部,梯度越小,底部层无法训练,使得神经网络无法变深

三、梯度爆炸

假设我们使用ReLU函数作为隐藏层的激活函数

· ReLU激活函数的导数会使大于0的输出求导后都是1,小于等于0的输出求导后都是0

· 首先将链式法则的求导公式代入ReLU激活函数转化一下,得到下式

· 这时,h^{t-1} 与 w_t 相乘后再在ReLU函数里求导的结果就是0或1,那么每次传递的就是 w_t 转置值

· 如果中间层 d-t 很大,那么最后累乘的结果就会很大,最终导致梯度爆炸

可能造成的问题:

· 值超过上限(如16位浮点数,可能数值上溢)

· 对学习率非常敏感

        · 若学习率较大—大参数值—更大的梯度

        · 若学习率较小—训练效果小

        · 需要不断调整学习率

http://www.lryc.cn/news/239612.html

相关文章:

  • 【转】OAK-D双目相机进行标定及标定结果说明
  • whip和whep
  • SpringBoot集成jjwt和使用
  • RedisConnectionFactory is required已解决!!!!
  • redis的高可用之持久化
  • onnx模型转换opset版本和固定动态输入尺寸
  • 远程运维如何更高效的远程管理?向日葵的这几项功能会帮到你
  • python BDD 的相关概念
  • 【Exception】Error: Dynamic require of “path“ is not supported
  • 【蓝桥杯选拔赛真题25】C++两个数比大小 第十三届蓝桥杯青少年创意编程大赛C++编程选拔赛真题解析
  • C++学习——C++运算符重载(含义、格式、示例、遵循的规则)
  • 【unity实战】unity3D中的PRG库存系统和换装系统(附项目源码)
  • 编程语言发展史:C语言的诞生及其影响
  • (二)pytest自动化测试框架之添加测试用例步骤(@allure.step())
  • 【用unity实现100个游戏之16】Unity程序化生成随机2D地牢游戏2(附项目源码)
  • 潮玩宇宙大逃杀游戏开发源码说明
  • UE5 操作WebSocket
  • Linux文件
  • 素短语的定义
  • 【华为OD题库-033】经典屏保-java
  • clang+llvm多进程gdb调试
  • PHP反序列化简单使用
  • 专业课140+总分420+东南大学920专业综合考研,信息学院通信专业考研分享
  • 数据结构与算法编程题11
  • 【LeetCode刷题】--40.组合总和II
  • mysql面试内容点
  • msvcp140.dll是什么?msvcp140.dll丢失的有哪些解决方法
  • 数字图像处理(冈萨雷斯)学习笔记
  • MES系统管理范围及标准
  • vscode运行dlv报错超时