线性回归的简洁实现

https://zh-v2.d2l.ai/chapter_linear-networks/linear-regression-concise.html

练习1的问题应该改成“如果我们用nn.MSELoss(reduction=‘sum’)替换 ,nn.MSELoss()”为了使代码的行为相同,需要怎么更改学习速率?为什么?
答:应该把学习率除以batch_size,因为默认参数是’mean’,换成’sum’需要除以批量数,一般会采用默认,因为这样学习率可以跟batch_size解耦(老师直播讲了~~

5 Likes

我测试了几次简洁实现和从零开始的代码,为什么基本上都是从零开始的损失更小呢?大部分从零开始的损失都是0.000050左右,而简洁实现大部分是0.000100左右

net[0].weight.grad是不是可以用来得到梯度?

Hi @dongming, 一般我们先call .backward() 再call .grad。详见https://zh-v2.d2l.ai/chapter_preliminaries/autograd.html

我也是得到同样结果,epoch相同的情况下从零开始更优,请您有找到什么比较好的解释吗?

关于练习1,以下两种方式理论上等价,为何loss function取mean显著由于取sum的方式?

loss function reduction= ‘mean’ , lr=0.03:
epoch 1, loss 0.000361
epoch 2, loss 0.000095
epoch 3, loss 0.000095
w的估计误差: tensor([-0.0002, -0.0002])
b的估计误差: tensor([8.6784e-05])

loss function reduction = ‘sum’, lr =0.03/batch_size=0.003
epoch 1, loss 0.176310
epoch 2, loss 0.091707
epoch 3, loss 0.092358
w的估计误差: tensor([0.0007, 0.0012])
b的估计误差: tensor([0.0005])

mean意味着所有样本损失的平均值,即loss会除以样本数,sum没有除这个样本数,所以会放大1000倍(这里样本数为1000)

1 Like

1.我刚才试验了几遍,由于按batch_size=10抽样本进行训练并计算损失,所以sum方式时应该用lr/10来弥补,即在optim中除10来替代loss fuction中除10,这个思路应该是没有问题的。
2.按mini batch方式训练,样本数并不为1000, 若用lr除1000得到的结果更离谱