讲师中心 微信公众号

工具推荐

视频效率加速
剧云
剧云

中文短剧剧本制作平台

Seko
Seko

AI短剧一键生成成片

updream

一键生成高质量推广成片

AniShort
AniShort

AI短剧协同制作平台

JAX 中多输出模型的梯度下降训练:如何正确构造标量损失函数

秋枫君_1097

秋枫君_1097

发布时间:2026-02-26 10:31:19

|

868人浏览过

|

来源于php中文网

原创

JAX 中多输出模型的梯度下降训练:如何正确构造标量损失函数

在 jax 中训练具有多个输出的模型时,必须将多分量损失(如每个输出对应的 rmse)聚合为单个标量值,因为 optax 等优化器仅支持标量损失的自动微分与参数更新。

在 jax 中训练具有多个输出的模型时,必须将多分量损失(如每个输出对应的 rmse)聚合为单个标量值,因为 optax 等优化器仅支持标量损失的自动微分与参数更新。

JAX 的函数式与纯函数特性要求所有可微分目标必须是标量(即 float 或 shape 为 () 的 jnp.ndarray)。当你定义返回 (loss_a, loss_b) 的 my_loss 函数并对其求梯度时,grad(my_loss, argnums=1) 会因输出非标量而报错:ValueError: grad requires real-valued function output。这是因为 jax.grad 内部调用的是 标量输出的反向传播(即 vjp),不支持向量值或元组值输出。

✅ 正确做法是:始终将多任务/多输出损失设计为单一标量。最常用且数学上合理的方式是加权平方和(weighted sum of squares),尤其当各子损失同为 RMSE 类型时:

import jax.numpy as jnp
from jax import jit, grad, random
import optax

@jit
def my_model(forz, params):
    a, b = params
    a_vect = a + forz ** b
    b_vect = b + forz ** a
    return a_vect, b_vect * 50.

@jit
def rmse(predictions, targets):
    return jnp.sqrt(jnp.mean((predictions - targets) ** 2))

# ✅ 标量损失:各 RMSE 的平方和(等价于联合 L2 损失)
@jit
def my_loss(forz, params, true_a, true_b):
    sim_a, sim_b = my_model(forz, params)
    loss_a = rmse(sim_a, true_a)
    loss_b = rmse(sim_b, true_b)
    return loss_a ** 2 + loss_b ** 2  # ← 关键:单标量输出

# 梯度计算与优化流程(保持不变)
grad_myloss = jit(grad(my_loss, argnums=1))

# 数据生成(略去重复部分)
key = random.PRNGKey(758493)
forz = random.uniform(key, shape=(1000,))
true_params = [8.9, 6.6]
true_a, true_b = my_model(forz, true_params)
model_params = random.uniform(key, shape=(2,))
optimizer = optax.adabelief(1e-1)
opt_state = optimizer.init(model_params)

for i in range(1000):
    grads = grad_myloss(forz, model_params, true_a, true_b)  # ✅ 现在可正常执行
    updates, opt_state = optimizer.update(grads, opt_state)
    model_params = optax.apply_updates(model_params, updates)

? 为什么是 loss_a² + loss_b²,而不是 loss_a + loss_b?

  • loss_a 和 loss_b 本身已是开方后的 RMSE(量纲为 target_a 和 target_b 的单位),直接相加会导致量纲混杂、梯度尺度失衡;
  • 而 loss_a² 和 loss_b² 分别对应原始 MSE(均方误差),物理意义统一(均为“平方误差均值”),天然可加;
  • 更进一步,该形式等价于最小化联合残差向量的 L2 范数平方:
    # 等价写法(显式拼接)
    residuals = jnp.concatenate([(sim_a - true_a), (sim_b - true_b)])
    return jnp.mean(residuals ** 2)  # 与 loss_a² + loss_b² 成比例(权重由长度隐含)

⚠️ 注意事项与进阶建议:

  • 归一化与加权:若 true_a 与 true_b 量级差异极大(如 O(1) vs O(1000)),建议引入任务权重或标准化因子,例如:
    weight_a = 1.0 / (jnp.std(true_a) + 1e-6)
    weight_b = 1.0 / (jnp.std(true_b) + 1e-6)
    return weight_a * loss_a ** 2 + weight_b * loss_b ** 2
  • 避免 Jacobian(jacrev)误用:jacrev 计算的是输出对参数的雅可比矩阵(shape (2, 2)),虽可手动构建梯度,但既低效又违背 JAX 的声明式优化范式——optax 期望的是 params → loss: float 的梯度,而非逐任务梯度向量。
  • 调试技巧:使用 jnp.isfinite(loss) 和 jnp.all(jnp.isfinite(grads)) 在训练循环中插入检查,防止 NaN 梯度扩散。

总结:JAX 多输出训练的核心约束是损失函数必须标量化;推荐优先采用 MSE 形式的加权平方和,兼顾数学一致性、实现简洁性与数值稳定性。任何试图绕过该原则(如尝试对元组求梯度或滥用高阶导数)都将导致不可维护的代码与潜在错误。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
css中float用法
css中float用法

css中float属性允许元素脱离文档流并沿其父元素边缘排列,用于创建并排列、对齐文本图像、浮动菜单边栏和重叠元素。想了解更多float的相关内容,可以阅读本专题下面的文章。

7707

2024.04.28

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

904

2025.10.23

function是什么
function是什么

function是函数的意思,是一段具有特定功能的可重复使用的代码块,是程序的基本组成单元之一,可以接受输入参数,执行特定的操作,并返回结果。本专题为大家提供function是什么的相关的文章、下载、课程内容,供大家免费下载体验。

3700

2023.08.04

js函数function用法
js函数function用法

js函数function用法有:1、声明函数;2、调用函数;3、函数参数;4、函数返回值;5、匿名函数;6、函数作为参数;7、函数作用域;8、递归函数。本专题提供js函数function用法的相关文章内容,大家可以免费阅读。

614

2023.10.07

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

20

2026.11.12

Go-Zero安装与goctl环境配置教程
Go-Zero安装与goctl环境配置教程

本专题围绕Go-Zero的安装与工具链配置展开,讲清Go版本要求、goctl安装方式、代理镜像、protoc依赖与环境变量设置,说明多版本共存、升级回退与CI流水线安装的做法,并整理安装阶段的常见报错与验证步骤。

20

2026.11.12

Go-Zero零基础入门教程
Go-Zero零基础入门教程

本专题整理Go-Zero的入门知识,从框架定位、环境准备到跑通第一个API服务,讲清目录分层、配置加载、日志与中间件的基本用法,并对比Gin、Kratos的差异,帮助Go开发者建立整体认知,判断它是否适合当前项目。

20

2026.11.12

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

120

2026.11.06

Postman请求头Headers怎么设置
Postman请求头Headers怎么设置

围绕Postman HTTP请求头配置展开,讲解Headers选项的具体使用方式,包括Key和Value参数填写、请求头信息添加、常见Header字段设置及请求头修改方法,帮助用户解决接口调试过程中遇到的请求头配置问题。

100

2026.11.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn