动手学深度学习14 数值稳定性+模型初始化和激活函数

本文探讨了深度学习中的数值稳定性问题,涉及矩阵乘法中的学习率调整、权重初始化的重要性(如Xavier初始化)、激活函数选择(如ReLU与sigmoid),以及批标准化等手段来确保模型训练的稳定性。文章还提到如何通过调整学习率、初始权重分布和使用合适的激活函数来防止梯度爆炸和消失现象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

动手学深度学习14 数值稳定性+模型初始化和激活函数


**视频:**https://www.bilibili.com/video/BV1u64y1i75a/?spm_id_from=autoNext&vd_source=eb04c9a33e87ceba9c9a2e5f09752ef8
**电子书:**https://zh-v2.d2l.ai/chapter_multilayer-perceptrons/numerical-stability-and-init.html
**课件:**https://courses.d2l.ai/zh-v2/assets/pdfs/part-0_18.pdf

这一章不好理解,数学推理较多。

1. 数值稳定性

在这里插入图片描述

向量关于向量的导数是矩阵
在这里插入图片描述
数值问题:做了太多次的矩阵乘法
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
学习率比较难调,要在很小的范围内调整,过大过小都会给模型训练带来麻烦
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2. 模型初始化和激活函数

如何让训练更稳定
在这里插入图片描述
归一化:强行把梯度值到一定范围内的值
不论那一层做多深,均值方差都是固定的,保证数据都在一定范围内。
越陡的地方梯度越大
均值为0,方差为0.01的正太分布随机初始权重,对小网络可以,对很深的网络可能方差过大或过小。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

假设权重独立同分布,假设当前层权重和当前层输入是独立事件
所有项独立同分布,所以所有交叉项的和为0
在这里插入图片描述
在这里插入图片描述
假设均值都是0,方差都是一个常数值,要满足两个条件。 n t − 1 n_{t-1} nt1 第t层输入的维度 n t n_t nt 第t层的输出的个数,两个条件很难满足,除非输入等于输出才能满足两个条件。
γ t γ_t γt 是第t层权重的方差。
权重初始化的方差,是根据输入输出的维度来确定的。当输入输出维度不一致或者网络变化比较大的情况下,是根据输入输出的维度来适配权重shape,希望梯度和输出的方差在一定范围内。
在这里插入图片描述
输入均值为0,要使期望等于0,激活函数一定是过原点的
泰勒展开式,用一个多项式逼近,做低阶近似。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3. QA

  1. nan inf是怎么产生的以及怎么解决呢?
    inf是lr太大导致的,梯度爆炸。nan是一个数除以0了。合理初始化权重+激活函数合理选取+lr不要太大解决问题。可以先把lr往很小调,直到不出现nan或者inf,或者权重初始值,不要让方差很大,等训练有进展再调整。
  2. 使用ReLU激活函数如何做到拟合x平方或者三次方这种曲线?
    ReLU+ 权重去拟合,relu就是取max{0,x},破坏线性。
  3. 如果训练一开始,在验证集上准确率在提升,训练两个epoch后,突然验证集准确率就变成50%左右并稳定在50%,这是为什么呢?
    一般是权重紊乱掉了,数值稳定性出现了问题。可以把学习率调小。如果学习率调小不能解决问题,可能是训练数据本身不稳定。
  4. 训练过程中,如果网络的输出的中间层特征元素的值突然变成nan,是发生了梯度爆炸吗?还是有什么其他可能的原因?唤醒训练中遇到方差有nan值,是什么原因?
    一般是发生了梯度爆炸,如果太小训练曲线是平的没有什么进展。
  5. 初学者遇到一些复杂的数学公式,看文字描述没有什么感觉,怎么突破知识壁垒呢?
    深度学习的好处不懂数学也能用很多东西。数学能力–理解能力。计算机内存和cpu频率,cpu频率决定单位时间能算多少数据–代码能力。内存决定能跑多复杂的任务–数学能力。线性代数、概率论数学课。
  6. 为什么16位浮点数影响严重?32位和64位就好了嘛?那就是说所有通过fp16加速或者减小模型的方法都存在容易梯度爆炸或者消失的防线?
    32位-64位会更好一些,Python默认64位。常用32位。vfloat16 主要是训练时梯度会遇到问题。
  7. 梯度消失可以说是因为使用了sigmoid激活函数引起的吗?可以用ReLU替换sigmoid解决梯度消失的问题?
    sigmoid容易引起梯度消失,但是梯度消失可能有别的原因引起,relu会比较好解决梯度消失,但是不一定能解决。
  8. 梯度爆炸是由什么激活函数引起的?
    梯度爆炸不是由激活函数引起的,激活函数的梯度不是很大。是因为每一层输出的值很大,每一层叠加到很大引起的。
  9. LSTM这里乘法变加法,乘法说的是梯度更新的时候用的梯度的乘法吗?
    lstm通过指数和log将其变成加法。
  10. 为什么乘法变加法可以让训练更稳定?乘法本质上不就是多个加法吗?如果加法能够起作用,我们需要怎么做?训练用的网络用resNet。
    1. 5 100 = 4 ∗ 1 0 17 1.5^{100}=4*10^{17} 1.5100=41017, 乘法让数值变很大。
  11. 让每层方差是一个常数的方法,指的是batch normalization吗? 为什么bn层要有伽马和贝塔,可以去掉吗?
    没关系。batch normalization会让方差趋向一个固定值,后续会讲到。
  12. 输出或者参数符合正太分布有益于学习,是有理论依据还是经验所得?
    有理论依据, 正太分布容易算均值和方差,其他分布也可以,只是需要输出值到一个合理的范围内。
  13. 随机初始化,有没有一种最好的最推荐的概率分布来找到初始随机值呢?
    xavier是常用方案。
  14. 梯度归一化就是batch normalization吗?
    不是。
  15. 山地图是可视化出来的吗?可以把损失函数、降维度可视化成类似的图指导训练吗?有没有什么好的方法?
    对损失函数做可视化。二维比较好画,三维不好画。比较延时。
  16. 为什么在做这些假设时都需要加入前提独立同分布?非独立同分布的计算会更复杂吗?
    为了简单起见。
  17. 为什么需要假设独立同分布,有什么作用?如果是不独立同分布呢?内部协变量偏移(ics)和独立同分布如何互相影响?
    不是独立同分布,没有太大影响。batch normalization做解耦。
  18. 为什么可以假设每层的权重都遵从同一个分布呢?
    假设的是权重初始化时遵从分布的,不是假设的中间处理的结果。
  19. 正态分布假设有什么缺陷呢?为什么看起来是万能的?
    做推导容易。大数定理表示一切的一切都是正太的。
  20. 有学者用群智能算法来初始化权值阈值,例如粒子群算法等,这种方法怎么样呢?
  21. 强制使得每一层的输出特征均值为0,方差为1,是不是损失了网络的表达能力,改变了数据的特征?会降低学到的模型的准确率吗?
    数值是在一个合适的区间表达,拉到什么区间都可以,0 1是为了数学上,硬件上计算方便。
  22. 为什么4sigmoid(x)-2可以提高稳定性?4sigmoid-2和ReLU实质是一样的吗?
    4*sigmoid-2 在零点附近,曲线近似于y=x这个函数。
  23. 能否用具体的例子讲解下xavier初始化,例如,针对一个2层线性回归模型,输入层、隐藏层、输出层维度分别是10,16,1,正太分布初始化w的参数怎么结算呢?
    后续讲怎么实现。看框架的时间。
  24. 激活函数的选择有什么建议吗?比如图像分类,或者语音识别?
    relu,简单。
  25. 一般权重都是在每个epoch结束以后更新的吗?
    每次迭代一个batch–iterate就会计算更新权重的,在每个epoch-扫完一遍数据之后,权重是更新了很多次的。
  26. 用的网络是ResNet,还是会出现数值稳定性的问题,咋办?
    所有技术是为了缓解出现数值稳定性的问题,并不是解决。整个深度学习的进展,都是为了让数值更加稳定。
  27. 数值稳定性可能是模型结构引起的,孪生网络两路输入不一样,是不是很可能引起数值不稳定?实际中,降低batchsize或者调小学习率,可以缓解数值稳定性吗?
    孪生网络两路输入不一样,会引起数值不稳定。文本进一个网络,图片进入另一个网络,数值区间不一样,会引起数值问题。可以通过权重使两个数值在差不多的范围里面。
  28. 算法移植这种工程化,怎么在模型设计和模型的精度提升方面有突破呢?
    模型背后的设计思路。
  29. 通过把每一层输出的均值和方差做限制,是否可以理解为限制各层输出值出现极大或者极小的异常值?
    也可以这样认为。方差有限制,输出值会在一定范围内,出现极大值的概率就会降低,但仍会有。
<think>嗯,用户现在想了解数值稳定性模型初始化。之前他们问过暂退法,现在这个问题也是深度学习中的重要概念。我需要先理清楚这两个概念的关系以及各自的作用。 首先,数值稳定性。在神经网络训练中,尤其是深层网络,梯度可能会在反向传播时变得非常大或非常小,导致数值问题,比如梯度爆炸或消失。这会使得模型无法有效训练,参数更新不稳定或者根本无法更新。数值稳定性就是确保在前向传播反向传播过程中,各层的输出梯度保持在一个合理的范围内,避免极端值出现。 然后是模型初始化。正确的初始化方法对模型的训练至关重要。如果权重初始化为全零,可能导致对称性问题,神经元之间无法差异化学习。而随机初始化如果方差过大或过小,也会导致梯度问题。比如,Xavier初始化或者He初始化就是根据激活函数的类型来调整权重的方差,确保各层的输入输出方差保持一致,从而维持数值稳定性。 用户可能想知道这两个概念如何相互关联。比如,好的初始化方法有助于维持数值稳定性,避免梯度消失或爆炸。反过来,数值稳定性问题也促使研究者设计更合理的初始化策略。需要举例子说明,比如使用Sigmoid激活函数时,如果权重初始化不当,容易导致梯度消失,而使用He初始化可以缓解这个问题。 另外,可能需要对比不同的初始化方法,比如XavierHe的区别,以及它们适用的激活函数。比如Xavier适合tanh,He适合ReLU。这有助于用户在实际应用中选择合适的初始化方法。 还要考虑用户可能的实际应用场景,比如在搭建神经网络时,应该如何选择初始化方法,以及初始化对训练过程的具体影响。可能需要提到一些代码示例,比如在PyTorch中如何设置初始化,或者使用哪些库函数。 另外,数值稳定性还涉及其他技术,比如批量归一化(Batch Normalization),但用户的问题集中在初始化,所以可能需要简要提到其与初始化的互补作用,但主要聚焦在初始化上。 需要确保解释清晰,结构合理,用类比帮助理解。比如,把神经网络的前向传播比作信号在多级放大器中的传递,如果每一级的增益不合适,信号可能会被放大到失真或衰减到消失,初始化就是设置合适的初始增益,保持信号在合理范围内。 还要注意数学表达,比如方差一致性原则,用公式表示Xavier初始化的方差计算,但保持简单易懂。例如,对于全连接层,输入维度为n,则权重方差应设为1/n,或者2/(n_in + n_out)等,根据激活函数调整。 最后,总结数值稳定性模型初始化的关系,强调正确初始化是维持数值稳定性的基础,而数值稳定性模型有效训练的前提。可能还要提到常见的错误初始化案例及其后果,比如导致训练初期loss为NaN等,帮助用户识别问题。</think>### 一句话本质 **数值稳定性模型初始化 = 确保神经网络训练时信号传递不爆炸(数值过大)不消失(数值过小),如同在多米诺骨牌中控制每一块的力量传递** --- ### 类比场景 想象训练神经网络像**多米诺骨牌接力**: 1. **初始化力量过大**:第一块牌用力过猛 → 后续骨牌被击飞(梯度爆炸,数值溢出) 2. **初始化力量过小**:第一块牌轻轻触碰 → 骨牌纹丝不动(梯度消失,参数无法更新) 3. **理想初始化**:每块牌间距推力刚好 → 完美连锁反应(数值稳定,有效学习) --- ### 数学角度(关键问题) 1. **梯度爆炸**:权重矩阵$W$的最大特征值$>1$ → 连乘后梯度$\nabla$指数增长 $$ \|\nabla W^L\| \propto \lambda_{max}^L $$ 2. **梯度消失**:权重矩阵$W$的最大特征值$<1$ → 连乘后梯度$\nabla$趋近于零 3. **初始化目标**:保持前向传播激活值方差反向传播梯度方差一致 $$ \text{Var}(h^{l}) = \text{Var}(h^{l-1}) $$ --- ### 经典初始化方法对比 | 方法 | 公式 | 适用场景 | 数学原理 | |---------------|--------------------------|------------------|-----------------------| | **Xavier初始化** | $W_{ij} \sim \mathcal{N}(0, \frac{2}{n_{in}+n_{out}})$ | tanh/sigmoid | 保持输入输出方差一致 | | **He初始化** | $W_{ij} \sim \mathcal{N}(0, \frac{2}{n_{in}})$ | ReLU及其变体 | 修正ReLU的零区域特性 | | **零初始化** | $W_{ij} = 0$ | ❌ 绝对禁止使用 | 导致神经元对称性破坏 | --- ### 实际代码演示(PyTorch初始化对比) ```python import torch.nn as nn # 危险的全零初始化(导致梯度消失) def bad_init(m): if isinstance(m, nn.Linear): nn.init.constant_(m.weight, 0) # 权重全零 nn.init.constant_(m.bias, 0.1) # 偏置轻微扰动 # 正确的He初始化(适配ReLU) def he_init(m): if isinstance(m, nn.Linear): nn.init.kaiming_normal_(m.weight, mode='fan_in', nonlinearity='relu') # 初始化效果对比(观察第一层输出的标准差) layer = nn.Linear(256, 512) bad_init(layer) print("Bad init std:", layer.weight.data.std()) # 输出接近0 he_init(layer) print("He init std:", layer.weight.data.std()) # 接近√(2/256)≈0.088 ``` --- ### 典型故障案例 1. **梯度爆炸现象**:训练时出现`NaN`损失值 → 检查权重初始化范围 2. **梯度消失现象**:模型准确率始终不提升 → 改用He/Xavier初始化 3. **激活值饱**:使用sigmoid时所有输出接近0.5 → 初始化权重过大致使输入进入sigmoid饱区 --- ### 与批量归一化的关系 - **互补作用**:批量归一化(BatchNorm)通过标准化激活值增强稳定性 → 允许使用更大的学习率 - **组合策略**:先用He初始化,再添加BatchNorm层 → 形成双保险(如ResNet标准配置) --- ### 特殊场景处理技巧 1. **Transformer模型**:使用$\sqrt{d}$缩放的点积注意力(防止softmax输入过大) 2. **LSTM网络**:采用正交初始化(保持长程依赖中的梯度流动) 3. **GAN对抗训练**:生成器判别器使用差异化初始化(避免模式崩溃) --- ### 历史启示 2010年前:神经网络被称为"难以训练的黑箱" → 本质是初始化方法不当导致数值不稳定 2012年后:Xavier/He初始化+ReLU+BN → 深度学习爆发式发展的三大支柱
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值