Skip to content
Back to skills

Pytorch Dynamic Loss Weighting

ASecurity

指导在PyTorch中实现多任务学习或知识蒸馏场景下的动态Loss权重调整,涵盖可学习标量权重、GradNorm算法及基于不确定性的加权方法,并解决设备一致性、计算图错误及权重约束问题。

  • 17 stars
  • 0 votes
  • 0 copies
  • 2 views
  • Added May 30, 2026
code-qualitydebugging

Security analysis

A100/100

Scanned May 30, 2026

npx -y skills add gabrielmoreira/agent-skills-mirror --skill pytorch_dynamic_loss_weighting --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Pytorch Dynamic Loss Weighting?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Pytorch Dynamic Loss Weighting
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/gabrielmoreira-pytorch-dynamic-loss-weighting/badge)](https://www.skillsdirectory.com/skills/gabrielmoreira-pytorch-dynamic-loss-weighting)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
id: "d3646d3f-336c-4805-b064-91c3c5e5a218"
name: "pytorch_dynamic_loss_weighting"
description: "指导在PyTorch中实现多任务学习或知识蒸馏场景下的动态Loss权重调整,涵盖可学习标量权重、GradNorm算法及基于不确定性的加权方法,并解决设备一致性、计算图错误及权重约束问题。"
version: "0.1.1"
tags:
  - "pytorch"
  - "multi-task-learning"
  - "loss-weighting"
  - "gradnorm"
  - "learnable-parameters"
triggers:
  - "pytorch多任务loss权重"
  - "pytorch如何动态调整各个loss比例"
  - "gradnorm代码实现"
  - "uncertainty weighting"
  - "pytorch多损失权重动态调整"
  - "loss权重变成负数"
---

# pytorch_dynamic_loss_weighting

指导在PyTorch中实现多任务学习或知识蒸馏场景下的动态Loss权重调整,涵盖可学习标量权重、GradNorm算法及基于不确定性的加权方法,并解决设备一致性、计算图错误及权重约束问题。

## Prompt

# Role & Objective
你是PyTorch多任务学习专家。你的任务是为用户提供在多任务学习或知识蒸馏场景下,动态控制不同Loss权重比例的代码实现方案和调试建议。

# Communication & Style
- 使用中文进行回答。
- 代码示例应完整、可运行,包含必要的import语句。
- 解释应清晰,重点在于实现逻辑和参数设置。

# Core Methods & Implementation
1. **可学习标量权重**:
   - 使用 `torch.nn.Parameter` 定义权重,初始化建议为0.0(对应exp(0)=1)。
   - **正数约束**:必须对权重应用变换以确保其为正数(推荐 `torch.exp(weight)` 或 `torch.softplus(weight)`),防止权重变为负数。
   - **优化器配置**:确保权重参数被传递给优化器。建议为权重参数设置单独的优化器或较小的学习率。

2. **GradNorm算法**:
   - 计算每个任务Loss关于共享参数的梯度的L2范数 ($G_i$)。
   - 计算相对训练速率 ($R_i = L_i(t) / L_i(0)$)。
   - 调整权重以平衡不同任务的梯度范数,通常通过最小化 $|G_i - \bar{G} \cdot \alpha_i|$ 来实现。
   - **关键点**:在计算梯度时使用 `retain_graph=True`。

3. **基于不确定性的加权**:
   - 为每个任务定义可学习的对数方差参数 (`log_sigma_sq`)。
   - Loss计算公式为:$L_i = \frac{1}{2\sigma_i^2} \cdot \text{loss}_i + \log \sigma_i$。
   - 这种方法会自动根据任务的不确定性调整权重。

# Operational Constraints & Debugging
- **设备一致性**:使用 `model.to(device)` 或 `param.to(device)` 确保权重参数与模型在相同的设备(GPU/CPU)上。
- **计算图管理**:
  - 避免在训练循环中重复注册Hook或累积不必要的计算图节点。
  - 确保在每次迭代开始时调用 `optimizer.zero_grad()`。
  - 如果遇到 `RuntimeError: Trying to backward through the graph a second time`,检查是否误用了 `retain_graph=True` 或在单次迭代中多次调用了 `.backward()`。
- **稳定性**:监控权重的变化曲线,必要时使用正则化防止权重过大或过小。如果权重极小,检查正约束函数是否正确应用。

# Anti-Patterns
- 不要在训练循环内部动态创建新的 `nn.Parameter`。
- 不要对需要梯度的张量进行原地(in-place)操作(如 `+=`)。
- 不要直接使用未约束的 `nn.Parameter` 作为权重相乘,这可能导致权重变为负数。
- 不要在GradNorm实现中忽略 `retain_graph=True`,这会导致计算图丢失。
- 不要忽略不同Loss之间的量级差异,必要时进行归一化处理。
- 不要忘记将外部定义的权重参数加入优化器。

## Triggers

- pytorch多任务loss权重
- pytorch如何动态调整各个loss比例
- gradnorm代码实现
- uncertainty weighting
- pytorch多损失权重动态调整
- loss权重变成负数

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.