loss_based_bwe_v2简单分析

本文分析了loss_based_bwe_v2算法,该算法通过建模丢包的联合概率分布来估计合适的loss_limited_bandwidth。算法首先固定loss_limited_bandwidth,然后使用二阶牛顿方法更新inherent_loss。丢包概率由GetLossProbability计算,基于inherent和超带宽因素。目标函数采用对数形式,通过牛顿方法而非梯度下降法更新。 LossBasedBweV2::UpdateBandwidthEstimate函数负责选择使目标函数最大化的参数。

算法思想

loss_based_bwe_v2 中对丢包情况的联合概率分布进行建模,其中包括两个参数inherent_loss和loss_limited_bandwidth,在计算过程中先固定loss_limited_bandwidth,然后通过最大化联合概率函数来更新inherent_loss(二阶牛顿方法更新,非梯度下降方法)。

当然我们注意到算法本身不是为了计算inherent_loss的,而是估计合适的loss_limited_bandwidth。LossBasedBweV2::UpdateBandwidthEstimate函数中有一组候选的loss_limited_bandwidth,和上面描述的一样,每次先固定loss_limited_bandwidth,然后更新inherent_loss(这里所有候选者对应的inherent_loss的初始值均为current_estimate_.inherent_loss),在更新完inherent_loss后,则会计算目标函数,使目标函数最大的loss_limited_bandwidth、inherent_loss则是当前的最终结果,记录在current_estimate_中。

算法细节

每个包丢包的概率为 GetLossProbability()结果,里面将丢包原因分为两部分,其一是inherent其二是超带宽,observations_[]中为从tcc中得到的统计信息,对应我们要处理的样本集合,样本中包含丢包数 num_lost_packets ,收包数 num_received_packets。其联合概率为:
$$J(loss\_pro) = \prod_i{loss\_{pro}^{N\_{loss}(i)}(1-loss\_{pro})^{N\_{recv}(i)}}$$
这里每个包的丢包率记作$loss\_pro$,丢包数记作$N\_{loss}(i)$,收包数记作$N\_{recv}(i)$,为了计算方便,这里取对数后作为目标函数:
$$J(loss\_pro) = \sum_i{ {N\_{loss}(i)}\log

Loss scale 原理主要是为了解决在混合精度训练中,使用 float16 数据格式进行精度计算时,因数据动态范围降低而导致梯度计算出现浮点溢出,部分参数更新失败的问题。通过在前向计算所得的 loss 乘以 loss scale 系数 S,在反向梯度计算过程中放大梯度,最大程度规避浮点计算中较小梯度值无法用 FP16 表达而出现的溢出问题。在参数梯度聚合之后以及优化器更新参数之前,将聚合后的参数梯度值除以 loss scale 系数 S 还原 [^3]。 在使用方面,打开 loss scale 有以下主要修改点: - 增加 NPULossScaleOptimizer 优化器。 - 在创建 NPULossScaleOptimizer 之前,实例化一个 FixedLossScaleManager 类进行指定 Loss Scale 的值,或者实例化一个 ExponentialUpdateLossScaleManager 类进行动态 Loss Scale 的配置 [^3]。 在开启 Loss Scaling 后,需要丢弃 Loss Scaling 溢出的 step(具体需要看使用的优化器的更新 step 逻辑)。在 sess.run 模式下,可以通过 get_tensor_by_name,通过 tensor 名称获取需要打印数据的 tensor,然后把 tensor 作为 sess.run 的入参传进去,计算得到具体 loss_scale 值。loss scale 值是根据算子名称打印的,如果用户使用了 scope 等指定网络中部分算子的名称,则该 hook 需要相应更改为需要获取的算子名称 [^3]。 以代码示例说明,在某些框架中可能有如下使用方式: ```python from timm.utils import NativeScaler loss_scaler = NativeScaler() # 假设 loss_G 是计算得到的损失,optimizer 是优化器,model_restoration 是模型 loss_scaler(loss_G, optimizer, parameters=model_restoration.parameters()) ``` 上述代码等价于: ```python loss_G.backward() optimizer.step() ``` 这里展示了使用 `NativeScaler` 类实现 loss scale 的一种方式 [^2]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值