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

如何使用TensorFlow实现坐标下降,在线性模型中先更新b再更新w?

简单线性模型按顺序更新参数的实现方法

核心逻辑

常规的梯度下降训练会一次性计算所有参数的梯度、同时更新所有参数,要实现先更新b再更新w的需求,只需要把两个参数的更新步骤拆分开,按指定顺序单独执行即可。默认情况下所有参数的梯度都基于当前批次更新前的模型状态计算,不会互相干扰。

具体实现(以PyTorch为例)

方案1:手动实现梯度更新(逻辑最直观)

直接按梯度下降公式按顺序更新参数,不需要调用封装好的优化器:

import torch

# 初始化参数、超参数
x = torch.tensor([1.0, 2.0, 3.0])
y = torch.tensor([2.0, 4.0, 6.0])
w = torch.tensor(1.0, requires_grad=True)
b = torch.tensor(0.0, requires_grad=True)
lr = 0.01
epochs = 100
criterion = torch.nn.MSELoss()

for epoch in range(epochs):
    # 前向传播计算损失
    y_pred = w * x + b
    loss = criterion(y_pred, y)
    # 反向传播计算w和b的梯度
    loss.backward()
    
    # 第一步:先更新b
    with torch.no_grad():
        b -= lr * b.grad
        # 清空b的梯度,避免累积到下一轮
        b.grad.zero_()
    
    # 第二步:再更新w
    with torch.no_grad():
        w -= lr * w.grad
        # 清空w的梯度
        w.grad.zero_()

方案2:基于封装优化器拆分更新

如果要使用SGD、Adam等官方封装的优化器,可以给两个参数分别创建优化器实例,按顺序调用更新方法:

import torch

x = torch.tensor([1.0, 2.0, 3.0])
y = torch.tensor([2.0, 4.0, 6.0])
w = torch.tensor(1.0, requires_grad=True)
b = torch.tensor(0.0, requires_grad=True)
lr = 0.01
epochs = 100
criterion = torch.nn.MSELoss()
# 分别为两个参数创建优化器,每个优化器只管理对应参数
opt_b = torch.optim.SGD([b], lr=lr)
opt_w = torch.optim.SGD([w], lr=lr)

for epoch in range(epochs):
    # 清空两个优化器的历史梯度
    opt_b.zero_grad()
    opt_w.zero_grad()
    # 前向传播+反向传播计算梯度
    y_pred = w * x + b
    loss = criterion(y_pred, y)
    loss.backward()
    
    # 先更新b
    opt_b.step()
    # 再更新w
    opt_w.step()

特殊说明:如果你的需求是要基于更新后的b重新计算w的梯度再更新w,只需要在执行完b的更新之后,重新做一次前向传播+反向传播,再执行w的更新即可。

内容的提问来源于stack exchange,提问作者luw

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 04:36:02