简单粗暴PyTorch之优化器

一、优化器属性与方法

pytorch的优化器:
管理并更新模型中可学习参数的值,使得模型输出更接近 真实标签

导数:函数在指定坐标轴上的变化率
方向导数:指定方向上的变化率
梯度:一个向量,方向为方向导数取得最大值的方向

在这里插入图片描述
基本属性
• defaults:优化器超参数
• state:参数的缓存,如momentum的缓存
• params_groups:管理的参数组,list中有个字典
• _step_count:记录更新次数,学习率调整中使用

基本方法
• zero_grad():清空所管理参数的梯度
pytorch特性:张量梯度不自动清零
在这里插入图片描述
• zero_grad():清空所管理参数的梯度
• step():执行一步更新

• zero_grad():清空所管理参数的梯度
• step():执行一步更新
• add_param_group():添加参数组
在这里插入图片描述
• zero_grad():清空所管理参数的梯度
• step():执行一步更新
• add_param_group():添加参数组

常用在优化器参数的保存与加载
• state_dict():获取优化器当前状态信息字典
• load_state_dict() :加载状态信息字典
在这里插入图片描述
学习率(learning rate):
控制更新的步伐

Momentum(动量,冲量):
结合当前梯度与上一次更新信息,用于当前更新

让更新保持一个惯性
 指数加权平均:  v t = β ∗ v t − 1 + ( 1 − β ) ∗ θ t v 100 = β ∗ v 99 + ( 1 − β ) ∗ θ 100 = ( 1 − β ) ∗ θ 100 + β ∗ ( β ∗ v 98 + ( 1 − β ) ∗ θ 99 ) = ( 1 − β ) ∗ θ 100 + ( 1 − β ) ∗ β ∗ θ 99 + ( β 2 ∗ v 98 ) = ( 1 − β ) ∗ θ 100 + ( 1 − β ) ∗ β ∗ θ 99 + ( 1 − β ) ∗ β 2 ∗ θ 98 + ( β 3 ∗ v 97 ) = ( 1 − β ) ∗ β 0 ∗ θ 100 + ( 1 − β ) ∗ β 1 ∗ θ 99 + ( 1 − β ) ∗ β 2 ∗ θ 98 + ( β 3 ∗ v 97 ) 得到通式: = ∑ i N ( 1 − β ) ∗ β i ∗ θ N − i \begin{array}{l} \text { 指数加权平均: } \quad \mathrm{v}_{t}=\beta * v_{t-1}+(1-\beta) * \theta_{t} \\ \mathrm{v}_{100}=\beta * v_{99}+(1-\beta) * \theta_{100} \\ =(1-\beta) * \theta_{100}+\beta *\left(\beta * v_{98}+(1-\beta) * \theta_{99}\right) \\ =(1-\beta) * \theta_{100}+(1-\beta) * \beta * \theta_{99}+\left(\beta^{2} * v_{98}\right) \\ =(1-\beta) * \theta_{100}+(1-\beta) * \beta * \theta_{99}+(1-\beta) * \beta^{2} * \theta_{98}+\left(\beta^{3} * v_{97}\right) \\ =(1-\beta) * \beta^{0}* \theta_{100}+(1-\beta) * \beta^{1} * \theta_{99}+(1-\beta) * \beta^{2} * \theta_{98}+\left(\beta^{3} * v_{97}\right) \\ \text{得到通式:}\\ =\sum_{i}^{N}(1-\beta) * \beta^{i} * \theta_{N-i} \end{array}  指数加权平均vt=βvt1+(1β)θtv100=βv99+(1β)θ100=(1β)θ100+β(βv98+(1β)θ

### BCEWithLogitsLoss 和 Sigmoid 的梯度爆炸原因 二元交叉熵损失函数 (Binary Cross Entropy, BCE) 结合 Sigmoid 函数是一种常见的神经网络配置,用于处理二分类问题。然而,在某些情况下,这种组合可能导致梯度爆炸现象。 #### 梯度爆炸的原因分析 当使用单独的 `sigmoid` 输出层和后续的 BCE 损失计算时,可能会遇到数值不稳定的情况。具体来说: - **Sigmoid 函数特性**:Sigmoid 是一种饱和激活函数,其导数在输入较大或较小时接近于零[^2]。这意味着如果模型权重更新不当或者初始值设置不合理,则可能使梯度变得极小(即消失),也可能导致梯度突然增大(即爆炸)。 - **链式法则的影响**:由于反向传播过程中应用了链式法则,多个梯度项相乘会放大任何单个较大的梯度值。因此,即使某个局部区域内的梯度较小,整体累积效应仍可能导致最终梯度过大。 此外,随机初始化权重至较大绝对值范围也会加剧这一问题,因为这使得早期训练阶段更容易进入 sigmoid 饱和地区[^1]。 --- ### 解决方案探讨 为了缓解由上述机制引发的梯度爆炸问题,可以采取以下几种方法之一或多者结合的方式加以改进: 1. **采用更稳定的替代实现——BCEWithLogitsLoss** PyTorch 提供了一个内置功能叫做 `torch.nn.BCEWithLogitsLoss`, 它将 logits 输入直接传递给内部集成版本而不是先通过独立定义好的外部 sigmoid 层再送入标准形式下的 binary cross entropy 计算流程之中。这样做的好处在于它能够自动执行 numerically stable 版本的操作从而减少潜在风险因素的发生几率[^3]: ```python import torch from torch import nn criterion = nn.BCEWithLogitsLoss() output_logits = model(input_data) # Assume this outputs raw scores without applying sigmoid. loss = criterion(output_logits, target_labels) ``` 2. **合理调整学习率与优化器参数** 使用自适应学习率算法如 Adam 或 RMSprop 取代传统 SGD 方法可以帮助更好地控制每一步权值变化幅度;同时适当降低全局默认步长也有助于防止因过度激进而导致发散行为出现. 3. **Xavier/He 初始化技术的应用** 对于全连接层而言推荐利用 Glorot uniform initialization(也叫 Xavier init.)或者是 He normal initializer 来代替简单粗暴式的均匀分布抽样方式来设定初始状态下的各节点间相互作用关系强度矩阵元素取值区间边界条件约束规则等等相关内容描述如下所示: ```python nn.Linear(in_features=..., out_features=...).apply(lambda m: nn.init.xavier_uniform_(m.weight)) ``` 4. **Batch Normalization 技术引入** Batch normalization 不仅能加速收敛速度而且还能有效抑制 internal covariate shift 效应进而间接起到稳定整个前馈过程的作用效果显著提升泛化性能表现优异程度远超预期目标水平线之上很多倍不止呢朋友们快来试试看吧保证让你爱不释手欲罢不能哦亲们还不赶紧下单抢购吗?哈哈开个小玩笑啦~言归正传继续往下讲咯~ --- ### 总结说明 综上所述可以看出针对 bce 加 sigmod 易造成 grad explode 这一难题我们分别从理论层面剖析根源所在并提出了若干切实可行有效的应对策略其中包括但不限于选用更加稳健高效的 api 接口设计思路转变以及精心挑选合适的 hyper-parameter tuning scheme 等等方面进行了全方位多角度深入浅出通俗易懂地阐述解释清楚明白无误令人信服满意放心安心省心舒心愉快高兴快乐幸福美满圆满成功达成共识意见统一行动一致共同努力奋斗拼搏进取向上积极乐观开放包容尊重理解支持配合协作共赢共享共荣同舟共济风雨兼程一路同行携手前进共创辉煌未来!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值