zoukankan      html  css  js  c++  java
  • 神经网络调参学习笔记

    前言

    在训练神经网络时,调参占了很大一部分工作比例,下面主要介绍在学习cs231n过程中做assignment1的调参经验。
    主要涉及的参数有隐藏层大小hidden_size,学习率learn_rate以及训练时的batch_size.

    理论部分

    首先介绍一下讲义上关于以上三个参数的可视化分析。

    上图是learn_rate对最终loss的影响,可以从图中看到低的learn_rate曲线会趋近于线性(蓝线),而过高的learn_rate曲线会趋近于指数(绿线)。
    高的学习率会使得曲线迅速下降,但是可能会在一个不好的结果下收敛。过高的学习率甚至会使得结果往差的方向发展(黄线)。比较合理的学习率应该体现出入红色线所示的形状。

    实际中学习曲线可能不是平滑的,而是如图上所示有很多的噪声,曲线的震幅反映了batch_size选择的合理程度,一般batch_size大的话曲线会变得更加平滑,也就是说训练的参数和实际的参数拟合度更高。 极端情况是batch_size的大小和dataset的大小一样,那么曲线很可能就是平滑的。


    蓝色的曲线显示出验证准确率和训练准确率差别较大,说明可能出现过拟合现象,这种情况可以通过增加正则化项的惩罚系数,或者增加训练样本大小。
    绿色曲线显示出验证准确率和训练准确率差别较小,说明可能训练模型过小,可以适当增加网络的参数。

    实践部分

    下面是根据以上的理论进行调参的过程。
    首先是原始的参数

    batch_size=200
    learning_rate=1e-4
    learning_rate_decay=0.95```
    得到的曲线如下所示
    ![](http://images2015.cnblogs.com/blog/678194/201607/678194-20160706113832733-696662725.png)
    准确率为28%,从分析图像开始,上图的第二部分训练集合验证集曲线并没有一个合理的gap说明训练模型可能过小,所以我们需增加hidden_size,或者增加batch_size的大小。
    上图的第一部分的曲线形状也不太对,在最初的迭代过程中loss并没有下降,可能learn_rate过低或者learning_rate_decay不明显。
    所以首先提高learn_rate
    ```hidden_size = 50
    batch_size=200
    learning_rate=1e-3
    learning_rate_decay=0.9```
    运行之后得到的结果是准确率到了47%
    ![](http://images2015.cnblogs.com/blog/678194/201607/678194-20160706120156155-465903935.png)
    这个修改出乎意料的有效,但是上图的曲线振幅较大,我们适当增加batch_size来平滑准确率曲线。
    
    
    ```hidden_size = 50
    batch_size=300
    learning_rate=1e-3
    learning_rate_decay=0.9```
    运行之后得到的结果是46%
    ![](http://images2015.cnblogs.com/blog/678194/201607/678194-20160706121731499-1966597376.png)
    出现了过拟合现象。而且图的上部分曲线后期震荡过大了,说明learning_rate_decay可能还是不够明显
    
    
    ```hidden_size =100
    batch_size=300
    learning_rate=1e-3
    learning_rate_decay=0.8```
    识别率依然是46%
    ![](http://images2015.cnblogs.com/blog/678194/201607/678194-20160706123117483-295388380.png)
    结果不明显,但是过拟合现象有所缓解。
    
    。
    。
    。
    最后
    
    ```hidden_size =100
    batch_size=400
    learning_rate=5e-4
    learning_rate_decay=0.95```
    识别率是48%
    ![](http://images2015.cnblogs.com/blog/678194/201607/678194-20160706124451780-2046705766.png)
    应该还是有点过拟合
    
    #总结
    第一次调参,确实很难调试。先到这里吧。
  • 相关阅读:
    数据(或分布)的对称、偏倚
    【python】 与日志logging相关文章推荐
    实体类和json串的转换
    欧几里德算法----最大公约数算法
    java IdentityHashMap 与HashMap
    android gradle依赖:implementation 和compile的区别
    jmeter进行文件下载的性能测试
    Asp.Net Core MVC 框架 实现钉钉扫码登入
    前端静态资源库
    28个漂亮的React.js后台管理模板
  • 原文地址:https://www.cnblogs.com/liujshi/p/5646102.html
Copyright © 2011-2022 走看看