1.背景
在看pytorch代码的时候有一段代码(如下),对其中的参数w,b值更新有些困惑,做此记录.
2.代码
def sgd(params, lr, batch_size): #@save
"""小批量随机梯度下降"""
with torch.no_grad():
for param in params:
param -= lr * param.grad / batch_size
param.grad.zero_()
lr = 0.03
num_epochs = 10
net = linreg
loss = squared_loss
for epoch in range(num_epochs):
for X, y in data_iter(batch_size, features, labels):
l = loss(net(X, w, b), y) # X和y的小批量损失
# 因为l形状是(batch_size,1),而不是一个标量。l中的所有元素被加到一起,
# 并以此计算关于[w,b]的梯度
l.sum().backward()
sgd([w, b], lr, batch_size) # 使用参数的梯度更新参数
with torch.no_grad():#torch.no_grad指定计算不会在反向传播中被记录
train_l = loss(net(features, w, b), labels)
print(f'epoch {epoch + 1}, loss {float(train_l.mean()):f}')
2.1代码解释
迭代10次,每次取batch_size大小的数据进行如下操作:
1.将数据带入线性回归函数求loss
2.求loss的梯度
3.随机梯度下降方法,更新参数
sgd
为优化函数
data_iter
为随机下批量采样函数,返回值为指定批量的features和labels数据
net
为线性回归函数
在sgd
函数中,参数的更新方式用的是param -= lr * param.grad / batch_size
,sgd
函数的param的改变会影响到外部参数w,b的变化,为什么呢?
2.2原因
不可变数据类型的值更改后其地址发生改变,可变数据类型的值更改其地址不发生改变。
tensor为可变数据类型,即
sgd
函数内部的同数据类型的赋值,会改变函数外部对应参数的值.
示例如下: