Softmax回归的简洁实现

偏执初始化为0没问题啊,不知道你说的进行不了梯度下降指的是什么?

1 Like

我说的权重是w和b,如果都初始化为零,那么梯度下降将会不起作用。全初始化为零的话,隐藏单元计算相同的激活函数,输出的权值会都一样,因此他们完全对称,然后每次迭代,隐含单元仍然会是一样。

1 Like


pytorch版本的Softmax concise 和 MLP concise实现都出现了绘图时loss曲线消失的问题
不管是自己运行ipynb或是d2l网站上的展示都有此问题

3 Likes

推理没有问题,但是在代码中如果全部初始化为0,训练依然可以完成,而且效率还更高。这个不知道是为什么。
大概思考了一下,因为实际计算过程中,梯度是由损失方程的导数得出。当权重被初始化为0时,损失方程loss(net(X,w,b), y)=loss(0,y), 而求导过程(假设线性回归)

由此可见,尽管权重都被初始化为0,但每个元素的梯度下降跟输入变量相关,所以梯度并不一样。这个也可以简单实验如下

import numpy as np
X=np.array([-1.6037177 , -0.81341785])
y=np.array([ 3.7554219 ])
w=np.zeros((2,1))
b=np.zeros((1,1))
#假设mse loss
y_hat = w*X+b
loss = (y_hat - y)**2/2
# refer to 3.1.10
w+=(y*X).reshape(w.shape)
# next w
print(w)
# [[-6.02263657]
# [-3.05472721]]
4 Likes

def init_weights(m):
if type(m) == nn.Linear:
nn.init.normal_(m.weight, std=0.01)

这个函数是没有默认参数值,在调用时没有为参数m指定值,整个3.7节一直没有未初始化函数指定m,能说说吗?


请问一下大家 图像没有出来,只有十行<Figure size 350x250 with 1 Axes> 是怎么回事

去掉nn.Softmax(-1)之后,我们的输出就不满足和为1了,甚至会出现负数,请问在预测的时候还是按照所谓的argmax来选择这个样本类别么? 也就是说我们的一系列softmax还有tensor.log,tensor.exp操作都是为了计算损失来优化模型的,这个理解对么? :grimacing:

这个需要在JupyterNotebook里面跑才能出图像

问题已经解决啦 !好像是matplotlib包和d2l里面的包发生了一些冲突,具体也不太清楚,重新安装了一下就解决了

怎么可以在pycharm中跑出动态图呀,在pycharm就只是可以得到最终的图像?

1 Like

这个错误怎么处理,同时train loss曲线没有显示。

2 Likes

softmax归一并没有自己手写,Module中也没有,因为也不需要,argmax 对 未归一化前的 O向量和归一化后的 Y_hat向量结果一致。 其实Softmax操作应该是在CrossEntropyLoss中实现了,其满足了反向传播的需要,也通过特殊的技巧避免了溢出的问题

3 Likes

同问,一样的错误,一样没有train loss

我去对比了一下,d2l包中的train_epoch_ch3函数和这个网页教材上实现的train_epoch_ch3函数不同

教材上是使用了mean():
· if isinstance(updater, torch.optim.Optimizer):
# 使用PyTorch内置的优化器和损失函数
updater.zero_grad()
l.mean().backward()
updater.step()
而在d2l包内实现的方法,使用了sum():
if isinstance(updater, torch.optim.Optimizer):
# Using PyTorch in-built optimizer & loss criterion
updater.zero_grad()
l.sum().backward()
updater.step()

可以从找到d2l包文件里面的torch.py,找到train_epoch_ch3的定义,并将它其中的sum()改为mean()
就应该正常显示train loss

求和的话会导致train loss过大,应该改为教材中的求均值,超出train_ch3中assert的范围

6 Likes

Good catch, minibatch的平均损失,所以应该loss求mean 而不是sum, custom sgd应该用sum 因为 custom sgd 里面写了除以 batch_size

def ini_weights(m):
if isinstance(m, torch.nn.Linear):
torch.nn.init.normal(m.weight, std = 0.01)
m.bias.data.fill_(0)
可以自己添加一下 都是0

1 Like

增加迭代周期的数量:


测试精度一段时间后无明显下降?

2 Likes

想请问一下我复制书上的代码train_ch3()总是报错,spawn.py这里面的错误,出好几行报错,想问一下有大家有遇到过吗。 :grinning:

3 Likes

不知道有没有人和我遇到一样的问题

简洁实现我直接复制代码然后运行,提示
RuntimeError: grad can be implicitly created only for scalar outputs

查了一下应该是loss维度的问题,但我不确定应该如何改进

3 Likes

问题确定了

我导入的d2l包与教材&ppt里 train_epoch_ch3函数的写法不同

导入的包里是
if isinstance(updater, torch.optim.Optimizer):
# 使用PyTorch内置的优化器和损失函数
updater.zero_grad()
l.backward()
updater.step()
metric.add(float(l), accuracy(y_hat, y), y.numel())

没有加.mean(),所以loss维度出现了问题

7 Likes