超参数调试、Batch正则化

课程为CS230

目录

调试处理(Tuning process)

超参数

调整超参数

为超参数选择合适的范围

 由计算资源决定实际的超参数调试(Pandas VS Caviar)

Batch Norm

将 Batch Norm 拟合进神经网络(Fitting Batch Norm into a neural network)

Batch Norm 为什么奏效?(Why does Batch Norm work?)

代码


调试处理(Tuning process

超参数

关于训练深度最难的事情之一是你要处理的参数的数量,从学习速率 α 到 Momentum (动量梯度下降法)的参数𝛽。如果使用 Momentum 或 Adam 优化算法的参数,𝛽1,𝛽2和𝜀,也许你还得选择层数,也许你还得选择不同层中隐藏单元的数量,也许你还想使用学习率衰减。所以,你使用的不是单一的学习率𝑎。接着,当然你可能还需要选择 mini-batch 的大小(Batch_Size)。  

结果证实一些超参数比其它的更为重要,我认为,最为广泛的学习应用是 α,学习速率是需要调试的最重要的超参数。

除了α,还有一些参数需要调试,例如 Momentum 参数𝛽,0.9 就是个很好的默认值。我还会调试 mini-batch 的大小,以确保最优算法运行有效。我还会经常调试隐藏单元,我用橙色圈住的这些,这三个是我觉得其次比较重要的,相对于 α 而言。重要性排第三位的是其他因素,层数有时会产生很大的影响,学习率衰减也是如此。当应用 Adam 算法时,事实上,我从不调试𝛽1,𝛽2和𝜀,我总是选定其分别为 0.9,0.999 和10−8,如果你想的话也可以调试它们。

但希望你粗略了解到哪些超参数较为重要,α 无疑是最重要的,接下来是我用橙色圈住的那些,然后是我用紫色圈住的那些,但这不是严格且快速的标准,我认为,其它深度学习的研究者可能会很不同意我的观点或有着不同的直觉。

调整超参数

如果你有两个超参数,这里我会称之为超参 1,超参 2,常见的做法是在网格中取样点,像这样,然后系统的研究这些数值。这里我放置的是 5×5 的网格,实践证明,网格可以是 5×5,也可多可少,但对于这个例子,你可以尝试这所有的 25 个点,然后选择哪个参数效果最好。当参数的数量相对较少时,这个方法很实用。

在深度学习领域,我们常做的,我推荐你采用下面的做法,随机选择点,所以你可以选择同等数量的点,对吗?25 个点,接着,用这些随机取的点试验超参数的效果。之所以这么做是因为,对于你要解决的问题而言,你很难提前知道哪个超参数最重要,正如你之前看到的,一些超参数的确要比其它的更重要。

举个例子,假设超参数 1 是 α(学习速率),取一个极端的例子,假设超参数 2 是 Adam 算法中,分母中的𝜀。在这种情况下,𝑎的取值很重要,而𝜀取值则无关紧要。如果你在网格中取点,接着,你试验了α 的 5 个取值,那你会发现,无论𝜀取何值,结果基本上都是一样的。所以,你知道共有 25 种模型,但进行试验的 α 值只有 5 个。

对比而言,如果你随机取值,你会试验 25 个独立的 α,似乎你更有可能发现效果做好的那个。

我已经解释了两个参数的情况,实践中,你搜索的超参数可能不止两个。假如,你有三个超参数,这时你搜索的不是一个方格,而是一个立方体,超参数 3 代表第三维,接着,在三维立方体中取值,你会试验大量的更多的值。

实践中,你搜索的可能不止三个超参数有时很难预知,哪个是最重要的超参数,对于你的具体应用而言,随机取值而不是网格取值表明,你探究了更多重要超参数的潜在值,无论结果是什么。


当你给超参数取值时,另一个惯例是采用由粗糙到精细的策略。

比如在二维的那个例子中,你进行了取值,也许你会发现效果最好的某个点,也许这个点周围的其他一些点效果也很好,那在接下来要做的是放大这块小区域(小蓝色方框内),然后在其中更密集得取值或随机取值,聚集更多的资源,在这个蓝色的方格中搜索,如果你怀疑这些超参数在这个区域的最优结果,那在整个的方格中进行粗略搜索后,你会知道接下来应该聚焦到更小的方格中。在更小的方格中,你可以更密集得取点。所以这种从粗到细的搜索也经常使用。

通过试验超参数的不同取值,你可以选择对训练集目标而言的最优值,或对于开发集而言的最优值,或在超参搜索过程中你最想优化的东西。

为超参数选择合适的范围

在超参数范围中,随机取值可以提升你的搜索效率。但随机取值并不是在有效范围内的随机均匀取值,而是选择合适的标尺,用于探究这些超参数。

假设你要选取隐藏单元的数量𝑛^[𝑙],假设,你选取的取值范围是从 50 到 100 中某点,这种情况下,看到这条从 50-100 的数轴,你可以随机在其取点,这是一个搜索特定超参数的很直观的方式。或者,如果你要选取神经网络的层数,我们称之为字母 𝐿,你也许会选择层数为 2 到 4 中的某个值,接着顺着 2,3,4 随机均匀取样才比较合理,你还可以应用网格搜索,你会觉得 2,3,4,这三个数值是合理的,这是在几个在你考虑范围内随机均匀取值的例子,这些取值还蛮合理的,但对某些超参数而言不适用。

看看这个例子,假设你在搜索超参数 𝑎(学习速率),假设你怀疑其值最小是 0.0001 或最大是 1。如果你画一条从 0.0001 到 1 的数轴,沿其随机均匀取值,那 90%的数值将会落在0.1 到 1 之间,结果就是,在 0.1 到 1 之间,应用了 90%的资源,而在 0.0001 到 0.1 之间,只有 10%的搜索资源,这看上去不太对。

反而,用对数标尺搜索超参数的方式会更合理,因此这里不使用线性轴,分别依次取 0.0001,0.001,0.01,0.1,1,在对数轴上均匀随机取点,这样,在 0.0001 到 0.001 之间,还有在 0.001 到 0.01 之间就会有更多的搜索资源可用。

 所以在 Python 中,你可以这样做,使 r=-4*np.random.rand(),然后 earning_rate 随机取值, learning_rate = 10**𝑟,所以,第一行可以得出 𝑟 ∈ [4,0],那么 learning_rate ∈ [10^−4, 100],所以最左边的数字是10^−4, 最右边是10^0。

最后,另一个棘手的例子是给𝛽 取值,用于计算指数的加权平均值。假设你认为𝛽是 0.9 到 0.999 之间的某个值,也许这就是你想搜索的范围。记住这一点,当计算指数的加权平均值时,取 0.9 就像在 10 个值中计算平均值,有点类似于计算 10 天的温度平均值,而取 0.999 就是在 1000 个值中取平均。

所以和上张幻灯片上的内容类似,如果你想在 0.9 到 0.999 区间搜索,那就不能用线性轴取值,对吧?不要随机均匀在此区间取值,所以考虑这个问题最好的方法就是,我们要探究的是1 − 𝛽,此值在 0.1 到 0.001 区间内,所以我们会给1 − 𝛽取值,大概是从 0.1 到 0.001,应用之前幻灯片中介绍的方法,这是10^−1,这是10^−3,值得注意的是,在之前的幻灯片里,我们把最小值写在左边,最大值写在右边,但在这里,我们颠倒了大小。这里,左边的是最大值,右边的是最小值。所以你要做的就是在[−3, −1]里随机均匀的给 r 取值。你设定了1 − 𝛽 = 10^𝑟,所以𝛽 = 1 − 10^𝑟,然后这就变成了在特定的选择范围内超参数随机取值。希望用这种方式得到想要的结果,你在 0.9 到 0.99 区间探究的资源,和在 0.99 到 0.999 区间探究的一样多。

简单说说为什么要这样做,为什么用线性轴取值不是个好办法,这是因为当𝛽 接近 1 时,所得结果的灵敏度会变化,即使𝛽有微小的变化。所以𝛽 在 0.9 到 0.9005 之间取值,无关紧要,你的结果几乎不会变化。

但𝛽值如果在 0.999 到 0.9995 之间,这会对你的算法产生巨大影响。在这两种情况下,是根据大概 10 个值取平均。但这里,它是指数的加权平均值,基于 1000 个值,现在是 2000 个值,因为这个公式 1/(1−𝛽),当𝛽接近 1 时,𝛽就会对细微的变化变得很敏感。所以整个取值过程中,你需要更加密集地取值,在𝛽 接近 1 的区间内,或者说,当1 − 𝛽 接近于 0 时,这样,你就可以更加有效的分布取样点,更有效率的探究可能的结果。

 由计算资源决定实际的超参数调试(Pandas VS Caviar)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值