Pytorch的梯度控制

在之前的实验中遇到一些问题,因为之前计算资源有限,我就想着微调其中一部分参数做,于是我误打误撞使用了with torch.no_grad,可是发现梯度传递不了,于是写下此文来记录梯度控制的两个方法与区别。

在PyTorch中,控制梯度计算对于模型训练和微调至关重要。这里区分两个常用方法:

1. tensor.requires_grad = False

  • 目标: 单个张量(通常是模型参数 nn.Parameter)。
  • 行为:
    • "参数冻结" :这个张量本身不会计算梯度 (.gradNone)。
    • "参数不更新" :优化器不会更新这个张量。
    • "梯度可穿透" :如果它参与的运算的输入是 requires_grad=True 的,梯度仍然会通过这个运算传递给输入。它不阻碍梯度流向更早的可训练层。
  • 场景:
    • 微调:冻结预训练模型的某些层,只训练其他层。
    • 例子:pretrained_layer.weight.requires_grad = False

2. with torch.no_grad():

  • 目标: 一个代码块 (with 语句块内部)。

  • 行为:

    • "全局梯度关闭" (块内):块内所有新创建的张量默认 requires_grad=False
    • "不记录计算图" :块内的运算不被追踪,不构建反向传播所需的计算图。
    • "梯度截断" :梯度流到这个块的边界就会停止,无法通过块内的操作继续反向传播
  • 场景:

    • 模型评估/推理 (Inference/Evaluation):不需要梯度,节省内存和计算。
    • 执行不需要梯度的任何计算。
    • 例子:
    python 复制代码
     with torch.no_grad():
         outputs = model(inputs)
         # ...其他评估代码

核心区别速记:

特性 requires_grad=False with torch.no_grad():
谁不更新? 这个参数自己 (块内)没人更新
梯度能过吗? 能过! 不能过! (被截断)
影响范围? 单个张量 整个代码块

一句话总结:

  • 想让某个参数不更新但梯度能流过 ,用 requires_grad=False
  • 想让一段代码完全不计算梯度也不让梯度流过 ,用 with torch.no_grad()

搞清楚这两者的区别,能在PyTorch中更灵活地控制模型的训练过程!

相关推荐
2501_947575804 小时前
计算机毕业设计之jsp开山车行二手车交易系统
java·开发语言·hadoop·python·信息可视化·django·课程设计
一次旅行5 小时前
AI 前沿日报 | 2026年7月3日 星期五
人工智能·github·ai编程
A15362555 小时前
装配具身机器人品牌推荐 工业装配场景选型指南与艾利特方案
大数据·人工智能·机器人
LLWZAI5 小时前
想要稳定变现,先跨过朱雀 AI 这道门槛
大数据·人工智能
安吉升科技5 小时前
商业场景智能客流统计摄像系统的关键技术机理解析
人工智能
古城小栈5 小时前
为啥说:训练用BF16,推理用FP16
人工智能·算法·机器学习
KaMeidebaby5 小时前
卡梅德生物技术快报|蛋白 N 端测序在重组贻贝融合蛋白表征中的应用,解决原核表达序列偏移工艺难题
前端·人工智能·物联网·算法·百度
TMT星球5 小时前
从像素复刻到行动控制:具身世界模型的底层逻辑探索
人工智能·深度学习·机器学习
ccimao63165 小时前
散户做财报整理、研报阅读、复盘记录,各类AI工具适配环节梳理
大数据·人工智能
派叔5 小时前
老字号营销服务商技术解构:三类方案的架构逻辑与选型评估
大数据·人工智能·搜索引擎·架构·产品运营·流量运营