权重衰减 讨论区


#22

感谢,现在fix了:

@lonelykid 也把你之前说的reproduce问题fix了


#23

请问In [3] 里面的 y = nd.dot(X, true_w), 是不是没有+ true_b?
应该这样: y = nd.dot(X, true_w) + true_b


#24

感谢指正,已修改


#25

请问在square loss加入l2 penalty,在net里加l2 penalty,都一样吗?


#26

net里加l2 penalty是什么意思


#27

def net(X, w, b, params, lambd):
return nd.dot(X, w) + b + lambd * L2_penalty(*params)

这样子


#28

应该在loss加penalty,而不是这样


#29

好的,谢谢


#30

如果 w 与 b 的值不是接近 0 的值的话,加了正则化也起不到作用。这时应该怎么处理呢?

例如这样设置 true_wtrue_b

true_w = nd.ones((num_inputs, 1)) * 2
true_b = -4

我尝试了好几个 \lambda 的设置都达不到较好的效果。

gluon 版本也在如上设置 true_wture_b 后也达不到较好的效果。


#31

理论上,对于feature是standardized的(x-mean(x) )/ std(x),L2 norm才应该使用。即便standardized了,但实际中很难说加了正则化结果一定就好。


#32

感谢回复。这个问题我清楚了。


#33

为什么计算L2惩罚项以及平方误差的时候要除以2,不是很懂球解答:sob:


#34

惯例而已,x^2/2 对x求导后得x,就不带系数了


#35

嗯,我看正常的loss function公式是要除~Thx


#36

概率密度函数exp(…)里面少了1/(r^2), 但下面推导是对的,我感觉最后一行,入应该去倒数


#37

入取倒数


#38

老师您好,我想请教一个问题
在权重衰减的理论部分有提到$L_2$范数惩罚项是需要除以样本数量的
但在从零开始实现部分里面,有关$L_2$范数惩罚项部分的代码中貌似都没有除以样本数量


感觉比较困惑,想请教一下这样是为什么


#39

sgd()里除sbatch_size


#40

在3.12.3 从零开始实现,loss计算 = 网络的loss + l2_loss,用这个总loss来计算的梯度,最后更新参数
这个能理解因为和3.12.1中讲到的“L2 范数正则化在模型原损失函数基础上添加 L2 范数惩罚项,从而得到训练所需要最小化的函
数”相同
for _ in range(num_epochs):
for X, y in train_iter:
with autograd.record():
# 添加了 L2 范数惩罚项。
l = loss(net(X, w, b), y) + lambd * l2_penalty(w)
l.backward()
gb.sgd([w, b], lr, batch_size)

但是在3.12.4 Gluon 实现,loss计算 = 网络的loss,那这样计算出的梯度和3.12.3的不同
怎样做到参数的更新和上面的是一样的啊??理解不到gluon的实现
for _ in range(num_epochs):
for X, y in train_iter:
with autograd.record():
l = loss(net(X), y)
l.backward()
# 对两个 Trainer 实例分别调⽤ step 函数,从⽽分别更新权重和偏差。
trainer_w.step(batch_size)
trainer_b.step(batch_size)


#41

:joy::joy:怎么没有大神在啊??

在3.12.3 从零开始实现,loss计算 = 网络的loss + l2_loss,用这个总loss来计算的梯度,最后更新参数
这个能理解因为和3.12.1中讲到的“L2 范数正则化在模型原损失函数基础上添加 L2 范数惩罚项,从而得到训练所需要最小化的函
数”相同
for _ in range(num_epochs):
for X, y in train_iter:
with autograd.record():

添加了 L2 范数惩罚项。

l = loss(net(X, w, b), y) + lambd * l2_penalty(w)
l.backward()
gb.sgd([w, b], lr, batch_size)

但是在3.12.4 Gluon 实现,loss计算 = 网络的loss,那这样计算出的梯度和3.12.3的不同
怎样做到参数的更新和上面的是一样的啊??理解不到gluon的实现
for _ in range(num_epochs):
for X, y in train_iter:
with autograd.record():
l = loss(net(X), y)
l.backward()

对两个 Trainer 实例分别调⽤ step 函数,从⽽分别更新权重和偏差。

trainer_w.step(batch_size)
trainer_b.step(batch_size)