如何使用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
相关产品推荐
相关产品推荐

