谈到机器学习中的正则化,大部分谈论的都是L1正则化和L2正则化,下面谈论一下其中的原理,只有明白原理才能更好的应用。
首先应该看一下这个知乎上的高赞回答:
机器学习中常常提到的正则化到底是什么意思? - 陶轻松的回答 - 知乎 https://www.zhihu.com/question/20924039/answer/131421690
从他的回答中可以得到结论:
1.参数(w1 w2......)越多越容易过拟合。
2.我们引入L0范数:这样可以限制参数非0的个数,让模型倾向于简单化,别出那些前期古怪的线。
3.0范数是NP问题,我们可以推导得到基本上可以用1范数代替:即绝对值。
然后再看这个回答:
机器学习中的正则化(Regularization) - 简书文中部分图片摘自吴恩达deeplearning课程的作业,代码及课件在我的github:DeepLearning 课件及作业 关于本篇正则化的具体路径是:正则化作业 正则...https://www.jianshu.com/p/569efedf6985这个回答中说明了这么几点:
L1范数通过推导发现梯度下降后,w要是正数就减小,要是负数就增大即往0靠拢(理解L1范数的时候可以当作L0范数),导致系数变为0.最终可能导致某个特征的权重为0:这就是所谓的特征选择也就是他们说的特征稀疏(稀疏就是0比较多)
而L2范数只是缩放,这是会直接减轻过拟合。其实L1看上面介绍也是减少过拟合,不过最后变成了特征的筛选了。所以说L1是在一定程度上减少了过拟合,毕竟缩放比直接减为0合理的多。
下面是关于pytorch实现,这里先说明,看上面我给的简书的那个链接我们明白了,其实正则化是对于权重进行处理,对于bias没有影响所以不要动它。
为什么说这呢,因为pytorch的内置函数是把所有的参数都给动了。下面看我的解决方案吧。
我这里只演示L2正则化:
n=lstm(15,128,1,1).cuda()
weight_p, bias_p = [],[]
for name, p in n.named_parameters():
if 'bias' in name:
bias_p += [p]
else:
weight_p += [p]
inputs=np.random.normal(size=(1,220,3,5))
inputs= (torch.from_numpy(inputs)).float().cuda()
labels=np.random.normal(size=(1,200,1))
labels= (torch.from_numpy(labels)).float().cuda()
criterion = nn.MSELoss()
logit = n(inputs)
loss = criterion(input=logit, target=labels)
opt = torch.optim.SGD([{'params': weight_p, 'weight_decay':1e-5},
{'params': bias_p, 'weight_decay':0}],
lr=1e-2,
momentum=0.9)
## update
opt.zero_grad()
loss.backward()
opt.step()
看具体代码怎么回事,不要直接去用先理解一下,我的这个是参考的:
pytorch中的L2和L1正则化,自定义优化器设置等操作 - 徐土豆的文章 - 知乎 https://zhuanlan.zhihu.com/p/259159952
如果有什么问题,欢迎大家评论区留言
1826

被折叠的 条评论
为什么被折叠?



