线性回归的从零开始实现

好问题 @SaltyFishing! 梯度是对loss的求导,如果推理一下loss的gradients,里面要除以批量大小

1 Like

Just run one time, this is demo how it looks like

1 Like

为什么损失函数里y要调用reshape函数?

def squared_loss(y_hat, y): # @save
“”“均⽅损失。”""
return (y_hat - y.reshape(y_hat.shape)) ** 2 / 2

视频里有讲,正常应该是同样的shape,但以防一个是行向量、一个是列向量。
现在reshape,可以确保shape一样

2 Likes

param -= lr * param.grad / batch_size
RuntimeError: a leaf Variable that requires grad is being used in an in-place operation.
这里报错是什么原因?

1 Like

检查下是不是没有加上“ with torch.no_grad(): "

1 Like

这本书的每节课后练习答案在哪可以找到?要不然不知道自己作业做的是对还是错。

一个很重要的问题是,x-=k 与x= x-k 不同,前者会更新变量的值,而后者不会 此时的param为None.

1 Like

因为现在的任务是掌握深度学习,其余的一切从简。

1 Like

原因有二。其一是楼上兄弟说的 x -= a 与x = x - a的区别,其二是torch.tensor的特性,缺一不可。torch.tensor或numpy.array会在执行 -= 时改变全局变量而非局部变量,(换做 x = x - a 则会改变局部变量)。而对list等python内置的数据结构, x -= a 与x = x - a在函数中是没有区别的。你可以简单地写一个函数内迭代赋值的函数,分别用1, numpy.array(1)和torch.tensor(1)输入对比一下,看看是否改变了全局变量。总而言之,x -= a 与x = x - a 在调用地址或者调用值上的区别是由具体的数据结构决定的。

2 Likes

基本正解,但第二个原因并不是torch.tensor的特性,其本质还是对象的引用问题.即只要该元素为引用类型,则对他的修改就会改变全局的变量.即可达到同样的效果.
验证代码如下:

def fun_test(a):
    for i in a:
        i-=1
def fun_test2(a):
    for i in a:
        i[0]-=1
a=torch.tensor([1,2,3,4,5])
fun_test(a)
print(a)
# tensor([0, 1, 2, 3, 4])
a = [[1], [2], [3], [4],[5]]
fun_test2(a)
print(a)
# [[0], [1], [2], [3], [4]]
a = [1, 2, 3, 4, 5]
fun_test(a)
print(a)
# [1, 2, 3, 4, 5]

可以发现,list中元素也为list时与tensor的效果一致,因为遍历时tensor的元素还是一个tensor即引用类型.因此其本质还是引用问题,而非tensor的特性.

7 Likes

如果把w和b改成全0
w = torch.tensor([0.,0.], requires_grad=True).reshape((2,1))
b = torch.tensor([0.], requires_grad=True)
训练的时候会报错吗?我的会报错

这样写就不会报错

w = torch.zeros((2,1), requires_grad=True)

如果reshape((2,1)),print(w)显示结果如下

tensor([[0.],
[0.]], grad_fn=<ViewBackward>)

1 Like

定义优化算法这里面为什么要用到: with torch.no_grad():

5 Likes

想问一下,本书的课后习题去哪里能找到答案呀,自己做的时候也不知道是对是错

我也有这个疑问,是因为求解梯度的时候param求解的是一个batch的梯度和吗?所以需要平均一下?

1 Like

我感觉这个是分子布局或者分子布局的锅,在李沐大神跑的所有梯度中,都是用的是分子布局

这个就是没有答案的,我也不知道哪里去找答案

1 Like

def net(X):
return softmax(torch.matmul(X.reshape((-1,w.shape【0】)),W)+b)
这里定义的函数为什么只有一个参数X? 那后面的W和b怎么来?

哪里能找到课后习题的答案啊?很多题都没思路。看着很吃力。