You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何避免optax的LBFGS实现导致的NaN问题?

如何避免optax的LBFGS实现导致的NaN问题?

刚接触optax的时候确实会遇到这类数值稳定性的小坑,针对你遇到的scale_by_lbfgs里除以极小值导致NaN的问题,我给你几个实用的解决思路:

  • 给除数添加数值稳定的epsilon缓冲
    直接修改weight计算的逻辑,避免除以接近0的数。核心思路是给点积值设置一个最小阈值,保证除数不会过小。你可以把原来的代码改成这样:

    epsilon = 1e-12  # 这个值可以根据你的任务精度调整,比如1e-10或1e-15
    weight = jnp.where(
        jnp.abs(vdot_diff_params_updates) < epsilon,
        0.0,
        1.0 / vdot_diff_params_updates
    )
    

    或者更严谨一点,用jnp.maximum保留原始符号的同时避免绝对值过小:

    epsilon = 1e-12
    weight = jnp.where(
        vdot_diff_params_updates == 0.0,
        0.0,
        1.0 / (jnp.maximum(jnp.abs(vdot_diff_params_updates), epsilon) * jnp.sign(vdot_diff_params_updates))
    )
    

    这样既保留了原始的符号信息,又不会因为除以极小值产生数值爆炸进而出现NaN。

  • 在LBFGS之前添加梯度裁剪
    梯度的极端值可能会导致vdot_diff_params_updates变得极小,你可以在LBFGS变换之前先对梯度做裁剪,限制梯度的整体规模。用optax.chain把梯度裁剪和LBFGS结合起来就行:

    optimizer = optax.chain(
        optax.clip_by_global_norm(1.0),  # 这里的1.0是裁剪阈值,根据任务调整
        optax.scale_by_lbfgs(...)  # 传入你的LBFGS参数
    )
    

    这样可以从源头减少出现极小点积值的概率,提升整个优化过程的数值稳定性。

  • 触发安全更新的状态重置逻辑
    你还可以在update_fn里加入状态判断,当vdot_diff_params_updates低于阈值时,重置LBFGS的历史状态,回到类似初始更新的模式,避免错误累积:

    def update_fn(
        updates, state, params
    ):
        # ... 保留原有前置计算代码 ...
        epsilon = 1e-12
        is_unstable = jnp.abs(vdot_diff_params_updates) < epsilon
        # 当不稳定时重置状态,比如清空历史更新记录
        new_state = jax.tree_util.tree_map(
            lambda init_val, curr_val: jnp.where(is_unstable, init_val, curr_val),
            init_state,  # 需要提前定义LBFGS的初始状态
            state
        )
        # 计算weight时使用安全分支
        weight = jnp.where(
            is_unstable,
            0.0,  # 或者用一个小的默认权重,比如1e-6
            1.0 / vdot_diff_params_updates
        )
        # ... 执行后续的更新逻辑 ...
    

    这个方法稍微复杂一点,但能在数值不稳定时自动“重启”优化状态,防止NaN扩散。

备注:内容来源于stack exchange,提问作者That Frank Guy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 11:04:29