作者: 大树先生
博客: http://blog.csdn.net/koala_tree
知乎:https://www.zhihu.com/people/dashuxiansheng
GitHub:https://github.com/KoalaTree
2017 年 10 月 14 日
以下为在Coursera上吴恩达老师的DeepLearning.ai课程项目中,第二部分《改善深层神经网络:超参数调试、正则化以及优化》第三周课程“超参数调试和Batch Norm”关键点的笔记。本次笔记并没有涵盖程序框架介绍的部分,关于视频中的TensorFlow介绍请自行学习。在阅读以下笔记的同时,强烈建议学习吴恩达老师的视频课程,视频请至 Coursera 或者 网易云课堂。
同时我在知乎上开设了关于机器学习深度学习的专栏收录下面的笔记,方便在移动端的学习。欢迎关注我的知乎:大树先生。一起学习一起进步呀!_
改善深层神经网络:超参数调试、正则化以及优化 —超参数调试 和 Batch Norm
1. 超参数调试处理
- 在机器学习领域,超参数比较少的情况下,我们之前利用设置网格点的方式来调试超参数;
- 但在深度学习领域,超参数较多的情况下,不是设置规则的网格点,而是随机选择点进行调试。这样做是因为在我们处理问题的时候,是无法知道哪个超参数是更重要的,所以随机的方式去测试超参数点的性能,更为合理,这样可以探究更超参数的潜在价值。
如果在某一区域找到一个效果好的点,将关注点放到点附近的小区域内继续寻找。
2. 为超参数选择合适的范围
####Scale均匀随机
在超参数选择的时候,一些超参数是在一个范围内进行均匀随机取值,如隐藏层神经元结点的个数、隐藏层的层数等。但是有一些超参数的选择做均匀随机取值是不合适的,这里需要按照一定的比例在不同的小范围内进行均匀随机取值,以学习率 α \alpha α的选择为例,在 0.001 , … , 1 0.001,\ldots,1 0.001,…,1范围内进行选择:
如上图所示,如果在 0.001 , … , 1 0.001,\ldots,1 0.001,…,1 的范围内进行进行均匀随机取值,则有90%的概率 选择范围在 0.1 ∼ 1 0.1\sim1 0.1∼1 之间,而只有10%的概率才能选择到 0.001 ∼ 0.1 0.001\sim0.1 0.001∼0.1之间,显然是不合理的。
所以在选择的时候,在不同比例范围内进行均匀随机取值,如 0.001 ∼ 0.001 0.001\sim0.001 0.001∼0.001、 0.001 ∼ 0.01 0.001\sim0.01 0.001∼0.01、 0.01 ∼ 0.1 0.01\sim0.1 0.01∼0.1、 0.1 ∼ 1 0.1\sim1 0.1∼1 范围内选择。
- 代码实现
r = -4 * np.random.rand() # r in [-4,0]
learning_rate = 10 ** r # 10^{r}
一般的,如果在 1 0 a ∼ 1 0 b 10^{a}\sim10^{b} 10a∼10b之间的范围内进行按比例的选择,则 r ∈ [ a , b ] r \in [a, b] r∈[a,b], α = 1 0 r \alpha = 10^{r} α=10r。
同样,在使用指数加权平均的时候,超参数 β \beta β也需要用上面这种方向进行选择.
3. 超参数调试实践–Pandas vs. Caviar
在超参数调试的实际操作中,我们需要根据我们现有的计算资源来决定以什么样的方式去调试超参数,进而对模型进行改进。下面是不同情况下的两种方式:
- 在计算资源有限的情况下,使用第一种,仅调试一个模型,每天不断优化;
- 在计算资源充足的情况下,使用第二种,同时并行调试多个模型,选取其中最好的模型。
4. 网络中激活值的归一化
在Logistic Regression 中,将输入特征进行归一化,可以加速模型的训练。那么对于更深层次的神经网络,我们是否可以归一化隐藏层的输出 a [ l ] a^{[l]} a[l]或者经过激活函数前的 z [ l ] z^{[l]} z[l],以便加速神经网络的训练过程?答案是肯定的。
常用的方式是将隐藏层的经过激活函数前的 z [ l ] z^{[l]} z[l]进行归一化。
Batch Norm 的实现
以神经网络中某一隐藏层的中间值为例: z ( 1 ) , z ( 2 ) , … , z ( m ) z^{(1)},z^{(2)},\ldots,z^{(m)} z(1),z(2),…,z(m):
μ = 1 m ∑ i z ( i ) σ 2 = 1 m ∑ i ( z ( i ) − μ ) 2 z n o r m ( i ) = z ( i ) − μ σ 2 + ε \mu = \dfrac{1}{m}\sum\limits_{i}z^{(i)} \\ \sigma^{2}=\dfrac{1}{m}\sum\limits_{i}(z^{(i)}-\mu)^{2} \\z^{(i)}_{\rm norm} = \dfrac{z^{(i)}-\mu}{\sqrt{\sigma^{2}+\varepsilon}} μ=m1i∑z(i)σ2=m1