跟着李沐老师学习深度学习(八)

server/2025/2/13 20:13:57/

数值稳定性 + 模型初始化和激活函数

数值稳定性

神经网络的梯度

  • 考虑如下d层的神经网络(t代表层)
    在这里插入图片描述
  • 计算损失 l 关于参数 Wt 的梯度:

在这里插入图片描述
这样的矩阵乘法带来的问题:
(1)梯度爆炸
(2)梯度消失

在这里插入图片描述

例子:MLP

  • 加入如下MLP(省略偏移)
    在这里插入图片描述
    进行累乘:
    在这里插入图片描述

(1) 梯度爆炸

  • 使用ReLU 作为激活函数
    在这里插入图片描述
    在这里插入图片描述
    假设W中的值都大于1,那么会得到很大的值(梯度爆炸)

  • 梯度爆炸的问题

    • 值超出值域(infinity)
      • 对于 16位浮点数尤为严重(数值区间 6e-5-6e4)
    • 学习率敏感
      • 如果学习率太大 ->大参数值 ->更大的梯度
      • 如果学习率太小->训练无进展
      • 我们可能需要在训练过程不断调整学习

(2) 梯度消失

  • 使用 sigmoid作为激活函数
    在这里插入图片描述
    在这里插入图片描述
    当输入相对较大的时候,激活函数的导数会变成0;

  • 梯度消失的问题

    • 梯度值变成 0
      • 对 16 位浮点数尤为严重
    • 训练没有进展
    • 对于底部层尤为严重
      • 仅仅顶部层训练的较好
      • 无法让神经网络更深(和一个很浅的神经网络没有区别)
        (反向传播,更新参数,w越来越小,最终趋于零,也失去了学习的必要)

总结

  • 当数值过大或者过小时会导致数值问题
  • 常发生在深度模型中,因为其会对n个数累乘

让训练更加稳定

目标:让梯度值在合理的范围内,例如[le-6,1e3]

  • 乘法变加法
    • ResNet, LSTM
  • 归一化:将梯度变成均值为0,方差为1
    • 梯度归一化,梯度裁剪
  • 合理的权重初始和激活函数

模型初始化和激活函数

让每层的方差是一个常数

  • 将每层的输出和梯度都看做随机变量
  • 让它们的均值和方差都保持一致

t: 第t层;i: 第i个变量

假设:我们想要的输出如下:所有的输出和梯度的均值、方差 都在一个常数
在这里插入图片描述

权重初始化

  • 在合理值区间里随机初始参数
  • 训练开始的时候更容易有数值不稳定
    • 远离最优解的地方损失函数表面可能很复杂
    • 最优解附近表面会比较平
  • 使用 N(0,0.01)来初始可能对小网络没问题,但不能保证深度神经网络

如何保证之前的假设成立呢?

例子:MLP

  • 假设:
    在这里插入图片描述
    i.i.d:独立同分布;均值E为0,Var方差为一个常数;当前层的权重和当前层的输入是一个独立事件。

  • 假设没有激活函数:
    在这里插入图片描述
    在这里插入图片描述

实现的目标中的 正向方差:

在这里插入图片描述

【方差公式】方差等于平方的期望减去期望的平方:方差D(X)=E(X^ 2)-E(X)^2
对于和的平方 等价于 每一项的平方+不相等的交叉项的乘积和
第二行的加号后面的累加为0的原因是:之前假设了wt_i,j是独立的同分布(即 i.i.d),那么w_t_i,j的均值就为0,即E(wti,j)=0,即 E(第二行第二项)=0
方差 = 平方的期望 - 期望的平方 现在期望的平方等于0,所以方差 = 平方的期望,可得到第四行
n_t-1:当前第t层的输入的维度

接下来看 反向的均值和方差
注意: (AB)转置=B转置xA转置
和正向类似,老师并没有细推:
在这里插入图片描述
Xavier初始化:(常用的权重初始化的方法)
基于该方式对某层权重初始化时,该层权重的初始化会根据该层的输入维度、输出维度来决定(如权重的方差),尤其是当 输入输出维度不一定、或网络变化比较大时,可以根据输入输出维度来适配权重,使得输出的方差和梯度都在恒定(合理)的范围内
在这里插入图片描述
满足正向和反向的条件很难,但可以取一个折中的方法:即 给定当前第t层的输入维度nt-1和输出维度nt的大小,那么就可以由这俩得到当前第t层的权重的方差γt。

假设 线性的激活函数(只是为了简单理论分析,实际上不可能用线性的激活函数))
在这里插入图片描述
这就说明:为了使正向的输出为均值为0、方差为固定值,则要求线性激活函数的α=1、β=0,即为 输入x本身;
反向,与正向类似:
在这里插入图片描述
也说明:激活函数必须是f(x)=x;

最后,检查真正的激活函数(因为激活函数都是非线性的,而上面是以线性激活函数举例的),如使用泰勒展开:
可以发现下图中tanh和relu在原点处基本都是f(x)=x,虽然sigmoid不过原点,但经过调整后的sigmoid(如下图中蓝线,即 乘四再减二后)也是过原点且在原点处近似为f(x)=x(即 经过调整后的sigmoid函数也能解决以前原sigmoid存在的问题)
请添加图片描述
为何只关注在0点附近的表现是否能满足f(x)=x的要求:因为一般神经网络的权重w的取值都是在0附近的。

QA

  • 问题:nan、inf如何产生,以及怎么解决?
    inf:就是太大,即一般是lr太大权重初始化时太大
    nan一般是 除0

    • 解决:
      合理初始化权重(权重的初始 一般均值为0,方差小一点,当能出现正确的值之后 再慢慢调大权重(的方差)使得训练有进展)
      选择合适的激活函数、选择合适大小的lr(一般是把lr一直往小调 直到inf、nan不出现)
  • 问题:使用ReLU激活函数是如何做到拟合x平方或者三次方这种曲线的?
    不是单独的relu来拟合,而是relu+学习到的权重w 共同作用(只是基于relu提供非线性的特性)

  • 问题:梯度消失可以说是因为使用了sigmoid激活函数引起的对吗?所以我们可以用ReLU替换sigmoid解决梯度消失的问题?
    梯度消失产生的原因有很多种,sigmoid只是其中的一种可能
    用ReLU替换 可以降低 产生梯度消失的概率,但不确保一定能完全解决

  • 问题:梯度爆炸是由什么激活函数引起的吗?
    爆炸的产生和激活函数无关,一般都是由每层的输出太大 然后多个层累乘引起的

  • 问题:resnet还是会出现数值稳定性?
    各种技术都是在缓解、减轻问题,但不是完全解决,用ResNet只是会让数值稳定性更好一点(整个深度学习的进展都是在 让数值更加稳定)

总结

  • 合理的权重初始值和激活函数的选取可以提升数值稳定性

http://www.ppmy.cn/server/167414.html

相关文章

计算机网络-八股-学习摘要

一:HTTP的基本概念 全称: 超文本传输协议 从三个方面介绍HTTP协议 1,超文本:我们先来理解「文本」,在互联网早期的时候只是简单的字符文字,但现在「文本」的涵义已经可以扩展为图片、视频、压缩包等&am…

jenkins自动化部署,环境搭建,应用部署

Jenkins 是一款开源的自动化服务器,用于实现持续集成(CI)和持续交付/部署(CD)。它通过自动化构建、测试和部署流程,帮助团队快速、可靠地发布软件。 CI/CD 是软件开发中的核心实践: 持续集成(CI):频繁将代码合并到主分支,并自动运行测试,确保每次提交的代码质量。…

当 VSCode 遇见 DeepSeek:AI 赋能未来编程

更多内容可以加入Linux系统知识库套餐(教程+视频+答疑) 文章目录 一、简介二、ContinueDeepseek实现AI编程辅助2.1 安装Continue2.2 创建Deepseek API密钥2.3 修改Continue配置2.4 使用相关AI编程辅助功能 沉淀、分享、成长&#…

【C语言】二分查找

文章目录 二分查找Tips 二分查找 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target&#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0c;否则返回 -1。 #include <stdio.h> #include &l…

git 提示 fatal: The remote end hung up unexpectedly

我在 git push 的时候遇到报错 fatal: The remote end hung up unexpectedly 解决方法如下&#xff1a; 1. 调整缓存限制&#xff08;大文件推送&#xff09; git config --global http.postBuffer 524288000 # 设置缓存为500MB git config --global https.postBuffer 52428…

机器学习数学基础:22.对称矩阵的对角化

一、核心概念详解 &#xff08;一&#xff09;内积 定义与公式&#xff1a;在 n n n维向量空间中&#xff0c;对于向量 x ⃗ ( x 1 , x 2 , ⋯ , x n ) \vec{x}\ (x_1,x_2,\cdots,x_n) x (x1​,x2​,⋯,xn​)和 y ⃗ ( y 1 , y 2 , ⋯ , y n ) \vec{y}\ (y_1,y_2,\cdots,y_…

基于 Docker 搭建 Elasticsearch + Kibana 环境

一、Elasticsearch 1. 下载镜像 elasticsearch镜像不支持latest标签&#xff0c;必须指定版本号 % docker pull elasticsearch:8.17.2 2. 启动容器 参考官方文档 https://www.elastic.co/guide/en/elasticsearch/reference/7.5/docker.html % docker run -p 9200:9200 -p 9…

Windows11+PyCharm利用MMSegmentation训练自己的数据集保姆级教程

系统版本&#xff1a;Windows 11 依赖环境&#xff1a;Anaconda3 运行软件&#xff1a;PyCharm 一.环境配置 通过Anaconda Prompt(anaconda)打开终端创建一个虚拟环境 conda create --name mmseg python3.93.激活虚拟环境 conda activate mmseg 4.安装pytorch和cuda tor…