作者: 大树先生
博客: 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均匀随机
在超参数选择的时候,一些超参数是在一个范围内进行均匀随机取值,如隐藏层神经元结点的个数、隐藏层的层数等。但是有一些超参数的选择做均匀随机取值是不合适的,这里需要按照一定的比例在不同的小范围内进行均匀随机取值,以学习率
如上图所示,如果在
所以在选择的时候,在不同比例范围内进行均匀随机取值,如
- 代码实现
r = -4 * np.random.rand() # r in [-4,0]
learning_rate = 10 ** r # 10^{r}
一般的,如果在
同样,在使用指数加权平均的时候,超参数
3. 超参数调试实践–Pandas vs. Caviar
在超参数调试的实际操作中,我们需要根据我们现有的计算资源来决定以什么样的方式去调试超参数,进而对模型进行改进。下面是不同情况下的两种方式:
- 在计算资源有限的情况下,使用第一种,仅调试一个模型,每天不断优化;
- 在计算资源充足的情况下,使用第二种,同时并行调试多个模型,选取其中最好的模型。
4. 网络中激活值的归一化
在Logistic Regression 中,将输入特征进行归一化,可以加速模型的训练。那么对于更深层次的神经网络,我们是否可以归一化隐藏层的输出
常用的方式是将隐藏层的经过激活函数前的
Batch Norm 的实现
以神经网络中某一隐藏层的中间值为例:
这里加上
到这里所有
这里
5. 在神经网络中融入Batch Norm
在深度神经网络中应用Batch Norm,这里以一个简单的神经网络为例,前向传播的计算流程如下图所示:
实现梯度下降
- for t = 1 … num (这里num 为Mini Batch 的数量):
- 在每一个
Xt 上进行前向传播(forward prop)的计算:
- 在每个隐藏层都用 Batch Norm 将
z[l] 替换为z˜[l]
- 在每个隐藏层都用 Batch Norm 将
- 使用反向传播(Back prop)计算各个参数的梯度:
dw[l]、dγ[l]、dβ[l] - 更新参数:
-
w[l]:=w[l]−αdw[l] -
γ[l]:=γ[l]−αdγ[l] -
β[l]:=β[l]−αdβ[l]
-
- 在每一个
- 同样与Mini-batch 梯度下降法相同,Batch Norm同样适用于momentum、RMSprop、Adam的梯度下降法来进行参数更新。
Notation:
这里没有写出偏置参数
6. Batch Norm 起作用的原因
First Reason
首先Batch Norm 可以加速神经网络训练的原因和输入层的输入特征进行归一化,从而改变Cost function的形状,使得每一次梯度下降都可以更快的接近函数的最小值点,从而加速模型训练过程的原理是有相同的道理。
只是Batch Norm 不是单纯的将输入的特征进行归一化,而是将各个隐藏层的激活函数的激活值进行的归一化,并调整到另外的分布。
Second Reason
Batch Norm 可以加速神经网络训练的另外一个原因是它可以使权重比网络更滞后或者更深层。
下面是一个判别是否是猫的分类问题,假设第一训练样本的集合中的猫均是黑猫,而第二个训练样本集合中的猫是各种颜色的猫。如果我们将第二个训练样本直接输入到用第一个训练样本集合训练出的模型进行分类判别,那么我们在很大程度上是无法保证能够得到很好的判别结果。
这是因为第一个训练集合中均是黑猫,而第二个训练集合中各色猫均有,虽然都是猫,但是很大程度上样本的分布情况是不同的,所以我们无法保证模型可以仅仅通过黑色猫的样本就可以完美的找到完整的决策边界。第二个样本集合相当于第一个样本的分布的改变,称为:Covariate shift。如下图所示:
那么存在Covariate shift的问题如何应用在神经网络中?就是利用Batch Norm来实现。如下面的网络结构:
网络的目的是通过不断的训练,最后输出一个更加接近于真实值的
对于后面的神经网络,是以第二层隐层的输出值
那么如果对
Batch Norm 正则化效果
Batch Norm还有轻微的正则化效果。
这是因为在使用Mini-batch梯度下降的时候,每次计算均值和偏差都是在一个Mini-batch上进行计算,而不是在整个数据样集上。这样就在均值和偏差上带来一些比较小的噪声。那么用均值和偏差计算得到的
所以和Dropout相似,其在每个隐藏层的激活值上加入了一些噪声,(这里因为Dropout以一定的概率给神经元乘上0或者1)。所以和Dropout相似,Batch Norm 也有轻微的正则化效果。
这里引入一个小的细节就是,如果使用Batch Norm ,那么使用大的Mini-batch如256,相比使用小的Mini-batch如64,会引入跟少的噪声,那么就会减少正则化的效果。
7. 在测试数据上使用 Batch Norm
训练过程中,我们是在每个Mini-batch使用Batch Norm,来计算所需要的均值
此时,我们需要单独进行估算均值
8. Softmax 回归
在多分类问题中,有一种 logistic regression的一般形式,叫做Softmax regression。Softmax回归可以将多分类任务的输出转换为各个类别可能的概率,从而将最大的概率值所对应的类别作为输入样本的输出类别。
计算公式
下图是Softmax的公式以及一个简单的例子:
可以看出Softmax通过向量
在没有隐藏隐藏层的时候,直接对Softmax层输入样本的特点,则在不同数量的类别下,Sotfmax层的作用:
9. 训练 Sotfmax 分类器
理解 Sotfmax
为什么叫做Softmax?我们以前面的例子为例,由
通常我们判定模型的输出类别,是将输出的最大值对应的类别判定为该模型的类别,也就是说最大值为的位置1,其余位置为0,这也就是所谓的“hardmax”。而Sotfmax将模型判定的类别由原来的最大数字5,变为了一个最大的概率0.842,这相对于“hardmax”而言,输出更加“soft”而没有那么“hard”。
Sotfmax回归 将 logistic回归 从二分类问题推广到了多分类问题上。
Softmax 的Loss function
在使用Sotfmax层时,对应的目标值
Sotfmax使用的Loss function为:
在训练过程中,我们的目标是最小化Loss function,由目标值我们可以知道,
所以为了最小化Loss function,我们的目标就变成了使得
也就是说,这里的损失函数的作用就是找到你训练集中的真实的类别,然后使得该类别相应的概率尽可能地高,这其实是最大似然估计的一种形式。
对应的Cost function如下:
Softmax 的梯度下降
在Softmax层的梯度计算公式为:
本周(Week3)的课后编程题请参见: