【MindSpore易点通】深度学习系列-如何调参
【MindSpore易点通】深度学习系列-如何调参
今天小编给大家带来各种调参的技巧,废话不多说,我们开始吧~
1 调试步骤
通过前面一系列优化算法的学习,我们已经认识了不少超参数,比如学习速率
、动量梯度下降法的
、Momentum或Adam优化算法的参数
、以及不同层中隐藏单元的数量,学习率衰减等等。
那么对于超参的设置而言,有什么可以我们直接借鉴的原则呢?
- 学习速率是需要调试的最重要的超参数;
- Momentum参数
通常设定为0.9; - 调试mini-batch的大小,以确保最优算法运行有效;
- 需经常调试隐藏单元;
- 层数和学习率衰减有时也会产生很大的影响;
可以不用调试,直接分别设置为0.9,0.999和10-8。
这个时候是不是大家就觉得很疑惑了,如何证明某个超参数是影响很大的,而有的超参数则无需改变呢?我们可以各种数值的选取尝试,然后系统地研究这些数值。
比如,假设超参数1是
(学习速率),超参数2是Adam算法中分母的
。如果在下图的网格中取点,试验
的5个不同数值,最终我们发现无论
取何值,结果基本上都是一样的。

当然也可能超参数不止两个,假如有三个超参数的时候,网格就变成了一个立方体,超参数3代表第三维。

更有可能,在实际操作时,甚至超过了三个超参数,而哪个是最重要的超参数以及如何取值需要采用由粗略到精细的策略。

比如在二维的网格中进行取值,首先找出效果最好的某个点,同时这个点周围的其他一些点效果也很好,那在接下来要做的是放大这块小区域(蓝色小方框内),然后在这个区域内重新随机取值。通过试验超参数的不同取值,可以选择对训练集目标而言的最优值,或对于开发集而言的最优值,或在超参搜索过程中最想优化的东西。
2 超参的范围
参数的取值范围又是如何确定的呢?假设选取隐藏单元的数量n[l],范围是从50到100中的某个点,或者选取神经网络的层数,层数为2~4中的某个值,我们首先考虑的就是在范围内随机均匀取值,但是这对于某些超参数来说是完全不适用的。
假设超参数
(学习速率)的搜索范围是0.0001~1,使用对数的方法,分别依次取0.0001,0.001,0.01,0.1,1,在对数轴上均匀随机取点。

Python代码可以写为:使r=-4*np.random.rand(),然后
随机取值,
=10r,
,那么
。
更加公式化地来看,我们应该在10a和10b之间取值,取最小值的对数就得到a的值,取最大值的对数就得到b值,在a,b间随意均匀的选取r值。
还有一个例子是给
取值,用于计算指数的加权平均值。假设
是0.9到0.999之间的某个值,当计算指数的加权平均值时,取0.9就像在10个值中计算平均值,有点类似于计算10天的温度平均值,而取0.999就是在1000个值中取平均。
所以最好的方法就是研究
,此值在0.1到0.001区间内,那么r的范围就是[-3,-1],设定
。

因此当
接近1时,因为
,即使
有微小的变化,也会对细微的变化变得很敏感。
3 调试实践
其实在实践中有不少很巧妙的方法,比如计算机视觉领域中的Confonets或ResNets,比如最初起源于语音识别的想法成功应用于NLP等等。
现在主要有两种主流方法可以给大家作为参考。
******3.**1 只修改一个模型
比如一个模型有庞大的数据组,但没有足够的CPU和GPU,正常我们只能一次只负责一小批模型。比如,第1天,我们将随机参数初始化,通过观察学习曲线或者损失函数J或者数据设置误差等进行调节;在第2天我们可以试着增加一点学习速率;第三天可以填充下Momentum或者减少变量...所以只要观察模型的表现,耐心地调试学习率就可以慢慢调试出一个还不错的模型。
******3.**2 多个模型并行

另一种方法就是同时试验多种模型,设置一些超参数,尽管让它自己运行,获得上图中的学习曲线,可以是损失函数J也可以是是实验误差等,最后选择工作效果最好的那个。所以这两种方式的选择,是由拥有的计算资源决定的。
好啦,今天给大家的介绍就到这里啦,后续就要开始给大家一一介绍框架啦!是不是很激动!我们下期见!