用神经网络进行回归预测 weight_decay为异常值(大于1 的值)模型效果好的原因解析

weight_decay越大越好的原因

研究发生的问题特此记录

之前在用神经网络来做一个回归问题,回归的数值范围是0~1之间。然后进行网格搜参(搜索最好的weight_decay和学习率)的时候发现一个不合常理的现象,就是一般往往最好的weight_decay 一般是很小的一个数值(0.001或者0.0001),但是我的最优weight_decay反而很大,这就给我造成很大的困扰,还好经过一番探索,最终锁定了问题,下面我将一一道来

现象

发现weight_decay 取得一个比较大的值的时候 模型效果最好

请添加图片描述

分析

这显然是不合理的 weight _decay 往往是小于1, 一般取10^-3 这种数量级 没道理这么大,而且最好的结果出现在这里显然是不合常理的

原因

首先weight _decay本质上是一个L2正则化系数

请添加图片描述

可以理解为加上这个L2正则化,会限制模型的权重都会趋近于0(理解就是当w趋近与0时, w平方和 会小, 模型损失也会变小),而weight_decay的大小就是公式中的λ,可以理解为λ越大,优化器就越限制权重变得趋近与0

这里重点注意

由于我模型最后输出的是一个0~1的结果,而神经网络的最后一次输出是一个 权重之和,这就要求我们得到的权重必然是要比较小的才能符合输出结果

img

也就是图中的w1 w2 w3 w4 要趋近于0, 这样加权值才会比较小

实验分析

经过上面的原理分析, 于是我做了下面两组实验

当weight_decay 设置为1时, 模型的参数迭代如下

请添加图片描述

当weight_decay 设置为0.001时, 模型的参数迭代如下

请添加图片描述

可以明显看出 weight_decay 越大, 模型权重则会在训练地越小,这说明在我们模型中确实需要设置这么大的weight_decay

但是我查看发现竟然需要是的权重变成10^-4 次方,是不是有点过于小了, 我通过全连接层计算,理论上也就是只有1500个权重和,乘上10的-4次方的权重 范围反而应该小于0.15。而且其他这样做也没有出现这么大的weight_decay。

经过查找。我最终发现了原因,原因是在真实值输入的时候,为了使得loss更大一点,我将每个真实值都放大100倍,也就是说输出的范围是0~100, 这就更加加重了我模型需要学习到更趋近于0的权重, 也可以和我前面分析出权重为什么过于小对于上来, 问题解决!

请添加图片描述

总结

最终问题是解决了 ,将模型放缩100取消后,weight_decay也成为了一个正常值

请添加图片描述

教训是

  • 瞎改改输出格式

  • 从公式根源出发 寻找问题

  • 学会打印模型参数来查问题

  • 神经网络不好做回归, 使得权重很小

  • 或许多加几层 由于层数的增加使得输出变小,可能会缓解这种问题

其实也是一种启发: 神经网络做回归,需要考虑权重问题,不能像做传统分类问题一样,因为传统分类会经过sigmoid函数来进行概率变换,

Sigmoid 曲线

就算很大或者很小的输出值, 也会被合理的放缩到0~1之间,不用考虑权重值过大或过小的问题

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
【资源介绍】 基于python实现两层神经网络分类器用于手写数字识别源码+使用说明(深度学习课程作业).zip 该项目是个人课程作业项目,答辩评审分达到95分,代码都经过调试测试,确保可以运行!欢迎下载使用,可用于小白学习、进阶。 该资源主要针对计算机、通信、人工智能、自动化等相关专业的学生、老师或从业者下载使用,亦可作为期末课程设计、课程大作业、毕业设计等。 项目整体具有较高的学习借鉴价!基础能力强的可以在此基础上修改调整,以实现不同的功能。 神经网络与深度学习课程作业1:一个进行手写数字识别的两层神经网络分类器 这是一个使用NumPy构建的简单两层神经网络分类器,用于分类MNIST数据集。 这里分为三部分:训练、参数查找和测试。 1. 训练 - 首先定义了sigmoid函数和softmax函数用做激活函数,并且计算了激活函数的梯度。然后利用L2正则化定义了loss函数 - 利用反向传播算法计算梯度,进行了具体推导和代码实现 - 学习率下降策略使用指数衰减:每经过epochs个epoch后学习率乘以一个衰减率decay_rate,通过实际训练最后确定epochs=100,decay_rate=0.9可以得到较好的效果 - 具体实现模型训练,其中采用SGD优化器,随机选取batch_size个样本计算梯度,更新参数。 - 保存模型参数到文件“params.npz” 2. 超参数查找: - 通过网格搜索,大致搜寻合适的学习率、隐藏层大小、正则化强度和batch_size - 学习率设置[0,001,0.01,0.1] - 隐藏层设置[50,100,200] - 正则化强度设置[0.0001,0.001,0.01] - batch_sizes设置[64,128,256] - 由于SGD优化存在一定随机性,所以每次训练过程采用五折交叉验证,四份当训练集,一份当测试集,取五次准确率的平均作为对应参数所相应的准确率 - 最后基于寻找到的合适超参数,根据发现规律进行微调,得到一个最佳的参数结果,并进行训练,得到模型并存储,绘制loss和accuracy曲线,并可视化每层网络参数 3. 测试: 导入模型,用经过参数查找后的模型进行测试,输出分类精度 homewrok_network2.ipynb:包含完整构建过程,包含代码以及输出结果 hyperparameter_selection.json:包含模型利用网格搜索时的输出结果 params_best.npz:最优模型参数 notebook上运行,自建的两层神经网络实现的。 notebook上运行,自建的两层神经网络实现的。 notebook上运行,自建的两层神经网络实现的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值