计算机视觉教程核心版(七)神经网络动态学习参数调整

前面学习了如何建立神经网络网络连接,数据预处理和损失函数,优化方法。下面介绍学习的过程即,可视化学习过程并在训练中调试这些参数。

内容

训练之前:理智检查技巧

监视训练过程

 

 

训练之前:理智检查技巧

  1. 寻找正确的可能的损失。当你用小的参数初始化时候,确保你得到你期望的损失值。在设置正则化为零的基础上,单独检测损失函数。例如,在CIFAR10中,使用softmax分类器进行分类,我们会期望初始的损失2.302左右,因为我们期望每个类别的弥散概率为0.1。softmax损失是负的正确类别概率,因此-In(0.1)=2.302。对于SVM损失,我们希望所有分数扥分为零,因此我们期望损失为9.如果你并没有看到你的初始损失在初始状态在这些值附近,你的初始化可能有些问题。

2.当你的初始化损失达到你的期望值,加入正则化则损失应该会提高一些。

3.在小的训练子集上实现过拟合。另一个重要的地方时,在基于所有的训练集训练之前,先在一个小的训练集,例如20个样本的训练集上训练。确保你可以实现过拟合,即零误差,当然在此过程中你需要禁止正则化操作,否则它将阻止你进入过拟合状态。除非您使用小数据集通过此完整性检查,否则不值得继续使用完整数据集。注意:有可能会发生你可以非常好的你和一个小的数据集,但你依然无法有一个正确的结果。例如,由于一些错误你的数据特征变成随机的,可能你会对小的训练集你和但是当用于所有的训练集上,绝不会有任何泛化。

监视训练过程

在神经网络训练的过程中,你应该监视多个变量。你应该画出在训练过程中,这些超参数的初始值和它们在训练过程中的变化。了解这些,更加有利于有效训练。

在如下图中,x轴一般是训练的epoch数目,其测量着每一个输入已经被训练过几轮。一般情况下,更倾向于记录epochs值而不是迭代次数,因为迭代次数依赖于训练时候的batch_size设置。

损失函数

通常在训练中第一个被跟踪的变量是损失值,因为它衡量着单独前向传播中,单独批次的损失。下图是一副卡通图画,展示损失函数随着时间变化,以及使用不同学习率损失函数的变化。

如上图中左边展示,如果学习率是low,则损失函数难以达到较低的值。如果学习率是high,则初始看来学习率下降较快,但是很快就卡在一个较为差的值。这是因为优化过程中由太多的能量,参数在混乱中弹跳,无法找到一个好的优化位置。黄色的现显示了更高的学习率将导致过拟合,损失函数变得极大。红色的线表示较好的学习率,损失平稳下降,知道收敛。

右图展示了一个典型的损失函数下降的过程,其实在CIFAR-10上训练。损失函数看起来并没有太大问题(可能学习率有些小,因为衰减有点慢,但也难说),并且可能batch size设置有些小,因为损失函数有较多的噪声。

通常损失函数上下摆动的数量和batch size有关。当batch size设置为1时候,摆动相对来说较高。当batch size是整个数据集,摆动最小。

很多人喜欢使用log来画损失函数。由于学习进度通常采用指数形式,因此情节显示为稍微可解释的直线,而不是曲棍球棒。此外,如果在同一损失图上绘制了多个交叉验证模型,则它们之间的差异将变得更加明显。

训练或者验证精度

第二个应该追踪的重要变量是训练集和验证集的精确度。下图可以给你一些直观上过拟合的展示。

上图中,训练集准确度与验证集准确度之间的鸿沟大小表明了过拟合的程度。当你验证数据呈现蓝色状态时候,你应该使用更强的L2权重惩罚项,更多的dropout或者收集更多数据。另一个绿色的线表明,你的模型能力欠缺,通过提升模型中参数的数量增强模型的能力。

权重更新率

最后一个想要跟踪的是权重更新幅度比,其为learning_rate *dw/w,也可以标准化后再比。你可能想独立地跟踪每一个参数集合。一个建议地比值约为1e-3。如果比值低于这个值,可能学习率过低。如果高于这个值,学习率可能太大。如下由具体代码示例:

# assume parameter vector W and its gradient vector dW
param_scale = np.linalg.norm(W.ravel())
update = -learning_rate*dW # simple SGD update
update_scale = np.linalg.norm(update.ravel())
W += update # the actual update
print update_scale / param_scale # want ~1e-3

每层激活/梯度分布

一个不正确的激活花可以减速甚至完全阻碍学习过程。幸运的是。这种问题很容易就被检测出来。一种办法是画出所有神经层激活函数或者梯度的直方图。直观上,不会看见任何奇怪的分布,例如使用tanh神经元,我们可能看见一个神经元激活分布在[-1,1]之间,吐过你看到输出全是零或者所有的输出都是在饱和状态要么是-1要么是1。

第一层可视化

下图展示第一层网络的可视化

上面两张图展示了神经网络第一层权重可视化的例子。第一张含有较多噪声点的例子显示病症可能是:网络为收敛,不合适的学习率,非常低的权重正则化惩罚项。

第二张图平滑干净,并且多样化的特征表示着训练过程进行顺利。

如何选择最佳的参数?

一般的策略是 ,对任何超参数(比如学习率)执行交叉验证。交叉验证实在训练集上训练,然后在验证集上验证,观察实验结果。步骤如下:

  1. 选择相当分散的参数,这些参数的范围要足够广泛,一般学习率是最重要的,然后仅仅使用几个epoch的迭代学习,你可以很好地知道哪些值较好,例如某些值出现Nan,某些值什么变化也没有,从而得到一个大概的区间。
  2. 在第一步的基础上,使用更长时间的训练,精炼参数。必要时可循环第二步。如果损失突变大于三倍,那么表明这不是一个好的方向。

举例

参数的选择最好是在lg空间。第一步精细化后的

 

随机采样vs网格采样

 

在对超过一个超参数进行预测时候,使用随即搜索比使用网格搜索更加合理。

注意:尽量不要同时使用对两个以上超参数搜索,一般先确定影响最大的学习速率。 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值