2.3)深度学习笔记:超参数调试、Batch正则化和程序框架

目录

1)Tuning Process

2)Using an appropriate scale to pick hyperparameters

3)(Hyperparameters tuning in practice: Pandas vs. Caviar)

4)Normalizing activations in a network(重点)

5)Fitting Batch Norm into a neural network

6)Why does Batch Norm work?

7)Batch Norm at test time

8) Softmax Regression

9) Training a softmax classifier

10)Deep learning frameworks

11)TensorFlow

12)Summary


以下笔记是吴恩达老师深度学习课程第二门课第二周的的学习笔记:Optimization algorithms。笔记参考了黄海广博士的内容,在此表示感谢。


本周课程,重点介绍了三个方面的内容:超参数调试、Batch正则化和深度学习程序框架

1)Tuning Process

深度神经网络调试时会遇到许多超参数(Hyperparameters),具体有:

1.\alpha:学习因子(第一重要)

2.β:动量梯度下降算法参数(默认为0.9)

3.\beta_1,\beta_2,\varepsilon:Adam算法参数(默认为0.9,0.999,10^{(-8)})

2.#layers:神经网络层数

2.#hidden units:隐藏层神经元个数

learning rate decay:学习因子下降参数

mini-batch size:批量训练样本包含的样本个数
 

在实际训练模型中如何选择和调试超参数呢?传统做法为对每个参数等距离选取任意个数的点,然后,分别使用不同点对应的参数组合进行训练,最后根据验证集上的表现好坏,来选定最佳的参数。例如有两个待调试的参数,分别在每个参数上选取5个点,这样构成了5x5=25中参数组合,如下图所示:

这种做法在参数比较少的时候效果较好。但是在深度神经网络模型中,一般不采用这种均匀取点的方法,比较好的做法是使用随机选择。也就是说,对于上面这个例子,随机选择25个点,作为待调试的超参数,如下图所示:

随机化选择参数的目的是为了尽可能地得到更多种参数组合。如果使用均匀采样的话,每个参数只有5种情况;而使用随机采样的话,每个参数有25种可能的情况,因此更有可能得到最佳的参数组合

这种做法带来的另外一个好处就是对重要性不同的参数之间的选择效果更好。假设hyperparameter1为α,hyperparameter2为ε,显然二者的重要性是不一样的。如果使用第一种均匀采样的方法,εε的影响很小,相当于只选择了5个α值。而如果使用第二种随机采样的方法,ε和α都有可能选择25种不同值。这大大增加了α调试的个数,更有可能选择到最优值。

在经过随机采样之后,我们可能得到某些区域模型的表现较好。然而,为了得到更精确的最佳参数,我们应该继续对选定的区域进行由粗到细的采样(coarse to fine sampling scheme)。也就是放大表现较好的区域,再对此区域做更密集的随机采样。


2)Using an appropriate scale to pick hyperparameters

随机取值可以提升你的搜索效率。但随机取值并不是在有效范围内的随机均匀取值,而是选择合适的标尺,用于探究这些超参数,这很重要。
对于像神经网络层数隐藏层神经元个数这样的超参数可以采用随机均匀取值的方法,但是对于学习率这样的超参数,假设其取值范围在(0.0001,1)之间,画一条数轴的话,其90%的数值将会落在(0.1,1)之间,而在(0.0001,0.1)之间只占有10%的资源,这看上去不太合理。

反而,使用对数标尺搜索超参数的方式会更合理,分别依次抽取0.0001,0.001,0.01,0.1,1,在对数轴上随机取点。在Python中我们可以将对数坐标下最小值设为a,最大值设为b,在a,b间随意均匀的选取r(random)值,再将超参数设为10^r,代码如下:

r = np.random.rand()
r = a + (b-a)*r
r = np.power(10,r)

除了α之外,动量梯度因子β也是一样,在超参数调试的时候也需要进行非均匀采样。一般β的取值范围在(0.9, 0.999)之间,那么1−β的取值范围就在[0.001, 0.1]之间。那么直接对1−β在[0.001, 0.1]区间内进行log变换即可。



3)(Hyperparameters tuning in practice: Pandas vs. Caviar)

经过调试选择完最佳的超参数并不是一成不变的,一段时间之后(例如一个月),需要根据新的数据和实际情况,再次调试超参数,以获得实时的最佳模型。

在训练深度神经网络时,一种情况是受计算能力所限,我们只能对一个模型进行训练,调试不同的超参数,使得这个模型有最佳的表现。我们称之为Babysitting one model。另外一种情况是可以对多个模型同时进行训练,每个模型上调试不同的超参数,根据表现情况,选择最佳的模型。我们称之为Training many models in parallel。使用哪种模型是由计算资源、计算能力所决定的。
2.3)深度学习笔记:超参数调试、Batch正则化和程序框架_第1张图片


4)Normalizing activations in a network(重点)

在深度学习兴起后,最重要的一个思想是它的一种算法,叫做 Batch 归一化,由 Sergey loffe 和 Christian Szegedy 两位研究者创造。Batch 归一化会使你的参数搜索问题变得很容易,使神经网络对超参数的选择更加稳定,超参数的范围会更加庞大,工作效果也很好。

当训练一个模型,比如 logistic 回归时,你也许会记得,归一化输入特征可以加快学习过程。首先计算平均值,从训练集中减去平均值,再计算方差,接着根据方差归一化数据集。但是对于深度神经网络来说,不仅需要归一化输入特征值x,而且每层还有激活值a^{[i]]},是否归一化激活值可以加快参数w^{[i+1]},b^{[i+1]}的训练?在实际应用中,一般是对z^{[i]}进行标准化处理而不是a^{[i]}

Batch Normalization对第l层隐藏层的输入z^{[l-1]}做如下标准化处理,这里忽略上标[l-1]

                                                                      \mu=\frac{1}{m} \sum_{i}z^{(i)} 

                                                               \sigma^{2}=\frac{1}{m} \sum_{i}\left(z_{i}-\mu\right)^{2}

                                                                     z_{\text {norm}}^{(i)}=\frac{z^{(i)}-\mu}{\sqrt{\sigma^{2}+\varepsilon}}

这里为了防止\sigma为0,我们引入一个常数\varepsilon。但是,大部分情况下并不希望所有的z^{[i]}均值都为0,方差都为1。通常需要对z^{[i]}进行进一步处理:

                                                                           $\overline{z}^{(i)}=\gamma \cdot z_{n o r m}^{(i)}+\beta$ 

式中\gamma, \beta为学习参数,也可以通过梯度下降算法等求得。这里,\gamma, \beta的作用是让\overline{z}^{(i)}的均值和方差为任意值,只需调整其值就可以了。例如,令

                                                                           $\gamma=\sqrt{\sigma^{2}+\varepsilon}, \quad \beta=u$

$\overline{z}^{(i)}=z^{(i)}$。但是输入层的标准化处理和隐藏层的标准化处理是有区别的,一般输入层的标准化处理后均值为0,方差为1,而隐藏层我们希望得到非线性输出,则希望归一化处理后不再线性区域内。


5)Fitting Batch Norm into a neural network

对于L层神经网络,经过Batch Norm的作用,整体流程如下:

Batch 归一化是发生在计算z,a之间的。和w,b等参数一样,我们也可以用前面学到梯度下降算法,RMSprop和Adam等优化算法来迭代。



6)Why does Batch Norm work?

我们可以把输入特征做均值为0,方差为1的规范化处理,来加快学习速度。而Batch Norm也是对隐藏层各神经元的输入做类似的规范化处理。总的来说,Batch Norm不仅能够提高神经网络训练速度,而且能让神经网络的权重W的更新更加“稳健”,尤其在深层神经网络中更加明显。

举个例子来说明,假如用一个浅层神经网络来训练识别猫的模型。如下图所示,提供的所有猫的训练样本都是黑猫。然后,用这个训练得到的模型来对各种颜色的猫样本进行测试,测试的结果可能并不好。其原因是训练样本不具有一般性(即不是所有的猫都是黑猫),这种训练样本(黑猫)和测试样本(猫)分布的变化称之为covariate shift。

对于这种情况,如果实际应用的样本与训练样本分布不同,即发生了covariate shift,则一般是要对模型重新进行训练的。在神经网络,尤其是深度神经网络中,covariate shift会导致模型预测效果变差。而Batch Norm的作用恰恰是减小covariate shift的影响,让模型变得更加健壮,鲁棒性更强。Batch Norm减少了各层w^{[l]},b^{[l]}之间的耦合性,让各层更加独立,实现自我训练学习的效果。也就是说,如果输入发生covariate shift,那么因为Batch Norm的作用,对个隐藏层输出z^{[l]}进行均值和方差的归一化处理。

从另一个方面来说,Batch Norm也起到轻微的正则化(regularization)效果。具体表现在:

  • 每个mini-batch都进行均值为0,方差为1的归一化操作
  • 每个mini-batch中,对各个隐藏层的z^{[l]}添加了随机噪声,效果类似于Dropout
  • mini-batch越小,正则化效果越明显

但是,Batch Norm的正则化效果比较微弱,正则化也不是Batch Norm的主要功能。


7)Batch Norm at test time

Batch 归一化将你的数据以 mini-batch 的形式逐一处理,但在测试时,你可能需要对每个样本逐一处理,我们来看一下怎样调整你的网络来做到这一点。

首先,回顾一下训练过程中Batch Norm的主要过程:

                                                                          \mu=\frac{1}{m} \sum_{i}z^{(i)} 

                                                               \sigma^{2}=\frac{1}{m} \sum_{i}\left(z_{i}-\mu\right)^{2}

                                                                     z_{\text {norm}}^{(i)}=\frac{z^{(i)}-\mu}{\sqrt{\sigma^{2}+\varepsilon}}

                                                                        $\overline{z}^{(i)}=\gamma \cdot z_{n o r m}^{(i)}+\beta$

在测试时,如果你只有一个样本,一个样本的均值和方差没有意义。那么实际上,为了将你u,\sigma^2的神经网络运用于测试,就需要单独估算,在典型的 Batch 归一化运用中,你需要用一个指数加权平均来估算,这个平均数涵盖了所有 mini-batch。
指数加权平均的做法很简单,对于第l层隐藏层,考虑所有mini-batch在该隐藏层下的u^{[l]}\sigma^{2[l]},然后用指数加权平均的方式来预测得到当前单个样本的u^{[l]}\sigma^{2[l]}。这样就实现了对测试过程单个样本的均值和方差估计。最后再用训练时得到的参数值\gamma,\beta来计算各层的输出值\overline{z}^{(i)}


8) Softmax Regression

目前我们介绍的都是二分类问题,神经网络输出层只有一个神经元。

对于多分类问题,用C表示种类个数,神经网络中输出层就有C个神经元,即n^{[l]}=C,其中,每个神经元的输出依次对应属于该类的概率,即P(y=c|x)。了处理多分类问题,我们一般使用Softmax回归模型。Softmax回归模型输出层的激活函数如下所示:

                                                                      $z^{|L|}=W^{[L |} a^{[L-1]}+b^{|L|}$

                                                                              a_{i}^{[L]}=\frac{e^{z_{i}^{[L]}}}{\sum_{i=1}^{C} e^{z_{i}^{[L]}}}

输出层每个神经元的输出a_{i}^{[l]}对应属于该类的概率,满足:$\sum_{i=1}^{C} a_{i}^{ L }=1$,典型分类例子如下图所示:


9) Training a softmax classifier

Softmax classifier的训练过程与我们之前介绍的二元分类问题有所不同。先来看一下softmax classifier的损失函数。

                                                         J\left(w^{[1]}, b^{[1]}, \ldots \ldots\right)=\frac{1}{m} \sum_{i=1}^{m} L\left(\hat{y}^{(i)}, y^{(i)}\right)$                                                    其中,单个样本的代价函数为:

                                                                   L(\hat{y}^{(i)}, y^{(i)})=-y^{(i)} \cdot \log \hat{y}^{(i)}$

softmax的反向传播过程也可以使用梯度下降算法。推到结果与二元分类结果一样。


10)Deep learning frameworks

深度学习框架有很多,本课程用到了以下两类框架:

TensorFlow

Keras



11)TensorFlow

关于TensorFlow更多的原理和编程技巧这里就不在赘述了,现在最新版TensorFlow2.0已经发布了,感兴趣的朋友可以关注更详细的TensorFlow相关文档。


12)Summary

本周课程主要介绍了:

  • 超参数的的调试处理,参数选择的优先级,以及选择合适的区间范围
  • 隐藏层的归一化处理
  • Softmax分类器;
  • 以及介绍了本课程中用到的深度学习框架

你可能感兴趣的:(深度学习)