这个net有点多余,直接用linreg多好
还是没太理解,是因为这里的loss对所有批量求和了,所以要求单个批量内loss的梯度吗?那么进一步为什么不可以求解所有批量内loss的梯度和?
为什么需要把损失函数求和在求导呢?直接求导好像不需要求和吧?还是说我们假设y与X向量的函数关系是没有确定的,但是那又怎么知道与X的关系是线性的还是平方或者其他关系。
向大佬求教
一个向量是不进行backward操作的,而sum()后,由于梯度为1,所以对结果不产生影响。反向传播算法一定要是一个标量才能进行计算。
大概是这个原因
sgd([w, b], lr, batch_size) # 使用参数的梯度更新参数
在获取batch数据的时候,假如batch_size不能被整除,那么最后一个batch中的样本数量肯定不是batch-size尺寸的。在训练模型部分,上面的梯度下降更新参数的时候,传入batch-size是不是不太合理呢?理论上应该是len(y)。(上面这样做是为了减少len的开销耗时吗?)
edit: 之前理解错误 我看到 有人详解https://blog.csdn.net/IMchg/article/details/110235369
有的tensor 不需要求导 不需要require_grad true 来存储 需要grad_fn =None 为了节省内存, 用with no grad()限制。简言之移除计算图pytorch 是动态图
不一定要答案呀,有时候无监督学习效果更好
我认为(loss.sum()/batch_size).backward()效果更好理解,这样之后用sgd()函数就不用再引入参数batch_size了。 之前上吴恩达的machine learning的时候在求loss function或者cost function的就除了batch_size,感觉这样方便理解一些,不过效果是一样的
这好像是python的特性,x-=k(“-=”符号)不会改变变量内容的地址,但是x= x-k(只有一个“=”)回改变变量内容的地址
对,也要看是否为可变对象的
一个批量的loss,除以batch_size就能得到每一个样本的loss,即得到平均损失函数值。我是这么认为的。
b = torch.zeros(1, requires_grad=True)
print(b.shape) #b是只有一个元素的向量
b1 = torch.tensor(1., requires_grad=True)
print(b1.shape) #b1是一个标量
书里面的b其实不是标量,是一个只有一个元素的一维向量,但也可以进行广播,所以不影响计算
因为是为了print loss值出来给我们看而已,这一步不需要进行backward()计算梯度以更新w和b参数
在最后训练的时候,如果train_l的计算不跟在with torch.no_grad后面的话对结果是不是也没有影响啊。train_l的梯度计不计算也无所谓啊
你好,请问这个问题解决了吗
你好,tensor张量区分应该是没有区分行向量和列 向量的吧。
a = torch.tensor([1,2])
a,a.T
(tensor([1, 2]), tensor([1, 2]))
- 如果我们将权重初始化为零,会发生什么。算法仍然有效吗?
神经网络权重初始化为零,SGD不应该会失效嘛
我的电脑上跑,结果和随机初始化一样的
直接使用linreg可以,赋值给net变量,可能是约定俗成。因为后面的net大家都会默认当作是一个模型(模型容器),这样就不仅单指一个线性回归模型了吧
貌似之所以在后面除是有一个trick在的,在实际应用中,sklearn包有个类似的操作都是在后面除的,可以加速计算,但是具体为什么我忘记了。但是好像pytorch更新之后直接在loss这里进行均值了而不用在后面做了,所以确实在损失这里求平均便于理解。
至于l l.sum() l.mean()各种形式混乱,一个是因为书上文档的更新和代码库不一致,阅读起来和实践起来有出入;
一个是用d2l里的sgd是后除batch_size,前面loss就要求和,而用了torch里的sgd就又不用了;
然后还有就是写书期间torch里crossentropyloss里面变成了默认取均值。
种种变化和不一致,就让l的形式非常混乱。但是搞清楚loss的形式以及sgd需求的形式,一一对应处理就好,不必纠结形式。