Andrew Ng

===========第1周 机器学习的实用层面================

===1.1 训练/开发/测试===

早期机器学习时代(数据规模较小),如果不需要dev set,常见的划分有 70%/30% 的训练/测试 划分,如果需要验证集,常见的是 60%/20%/20%划分

在big data era,由于数据集非常大,test和dev的占比通常变得更小,因为dev set的目的就是检测哪个算法更有效,所以dev集只需要big enough for you to evaluate 不同算法,比如你有100million数据,使用1万data作为dev集is more than enough,test集也是一样。

MAKE SURE the dev and test sets come from the same distribution

In practice,有时没有/不需要test set,很多人会直接把train/dev划分称为 train/test划分,Andrew认为这是不严谨的

===1.2 偏差(Bias) / 方差(Variance)===

High Bias:欠拟合

High Variance: 过拟合

举个例子,以错误率为例,train/dev:1%/11%(高方差,过拟合),15%/16%(高偏差,欠拟合),15%/30%(高偏差+高方差,欠拟合)

===1.3 机器学习基础===

在现代的deep learning,只要bigger network & more data & 合适的其他设置如regulation等,在降低偏差的同时通常可以同时 降低/不伤害 方差,反之亦然。这也是为什么在深度学习中我们不用太关注Bias-Variance trade-off 的原因,Andrew认为这也是deep火起来的一个原因。

===1.4 正则化===

以logistic regression为例,我通常只加对W的L2正则项,不加b的正则项目(加不加影响不大),因为W通常是很高维的,高偏差问题主要和它有关,we aren't fitting all the parameters well

L1 norm可以使模型更sparse,有人认为这有利于降低存储模型的存储空间,但in practice,我发现L1 norm可以使模型稀疏,但其实并没有降低太多存储内存,所以我不认为L1的目的是为了压缩模型。我在实践中喜欢L2 norm。

对矩阵的L2正则化叫做 Frobenious norm,而不叫 L2 norm,|| W ||^2

在对于的BP过程中,dW要额外加一项,你可以看到这也是为什么L2 regularization 被称为i weight decay

===1.5 正则化为什么可以减少过拟合===

直观上来感受,以一个多层神经网络和L2 正则化为例,通过控制正则化参数lambda,它相当于消除,实践中更准确的说是降低了许多神经元unit的影响,从而simpler the network。

另一个直观例子,假设激活函数为tanh(),在靠近0周围的部分近似线性,而两边是非线性的,正则化使得W值变小,W乘以上一层输入得到的值也变小了,就会集中在线性区。

===1.6 dropout正则化===

反向随机失活 inverted dropout,记得在 a = (a*mask) / keep_prop

 ===1.7 理解dropout===

dropout相当于降低了模型复杂度

Intuition: 依然以网络结构为例,不能依赖any one feature(也就是,给某一个输入节点赋予过大的权重),因为任何feature都有可能被drop,so have to spread the weights,利用绝大部分特征。

类似L2正则化,dropout通常会产生一个效果,即 shrinking the squared norm of the weights,并且does some outer regularization。甚至更适用于不同scale的输入范围。

根据不同层可能过拟合的程度,不同层可以设置不同的keep_prop,缺点是交叉验证选参数代价大。一直替代的方法是对所有层,keep_prop= 1 / a same number.

除非网络过拟合了,否则我通常不会用dropout。它在其他领域应用得比较少,主要是在CV,因为通常我们没有足够的数据,导致过拟合。

一个缺点是,此时代价函数 J is no longer well-defined,此时你很难监测迭代进行梯度下降时的J的性能,所以我们失去的debug工具绘制损失图。通常我会先关闭dropout,运行NN,确保J单调递减,然后再加入dropout。

===1.7 其他正则化方法===

Data Augmentation. 比如对称图像,随机旋转和裁剪,OCR图像设置可以各种扭曲

early stopping. 画出 training/dev error 随着 迭代次数的 曲线。

缺点是,它couple了两个任务(最优化代价函数J,同时要降低过拟合风险),这使得我们无法独立地处理这两个任务。即,我们尝试用一种方式同时解决两个问题,这也使得我们的任务变得更复杂。提早停止梯度下降,在某种程度上我们breaking 了 降低J的任务,此时代价函数可能还不够小

优点是,这个正则化方法不需要额外参数,在梯度下降的过程中就可以完成。但是如果负担得起 L2 正则化超参数搜索的计算开销的话,通常我们还是选择 L2。我发现 L2使得超参数的search space更容易分解(咸鱼对这句话的理解是,加了L2之后迭代过程相对固定,只要不断迭代就行了,最终比较不同超参数组合的J值,而early stopping看中间迭代值,不同超参数组合具体在哪次迭代停止都不一样,我们关注了中间值使得range search可能也不是那么容易锁定)。

===1.9 标准化输入===

当不同特征scale相差较大时,可以看到 J 的等高图是一个扁长的椭圆(假设此时特征2维),此时直接使用SGD,会导致Z字形轨迹(不同方向梯度大小不一样,而学习率一样)。

特征尺度相差不大就不需要做归一化,但即使做了归一化也不会有什么harm,所以当我不确定特征scale是否相差很大时,我都会选择做归一化。

===1.10 梯度消失和梯度爆炸===

直观理解

Andrew举了一个使用线性激活函数的例子,那就相当于不断乘以Wi,那么前向时,Wi略大于1激活值就会爆炸,偏小就会消失接近0,反向时梯度值类似。咸鱼觉得Relu会遇到这种情况。

另外CS231n中Karpathy讲的以tanh为激活函数时,直接使用高斯随机产生权重*某较小的数,也会存在梯度消失问题,要么激活值接近0,要么激活值接近1,两者都导致梯度消失。

===1.11 神经网络的权重初始化===

使用  标准高斯函数*一个较小的数  随机初始化权重,存在一个问题,随着输入数据量的增长,随机初始化的神经元的输出数据的分布中的方差也在增大。我们可以除以输入数据量的平方根来调整其数值范围,这保证了网络中所有神经元起始时有近似同样的输出分布。实践经验证明,这样做可以提高收敛的速度。

Xavier初始化,以tanh为激活函数,Wi = np.random.randn( Ni - 1 *  Ni ) / np.sqrt( Ni-1),这使得 Zi 和 Ai-1 有大致相同的范围(方差) 。

In practice,我认为这些初始化公式只是给了你一个起始点,如果你愿意,W的方差参(Xavier将其调整为1/n)数可以作为你可以调整的一个超参数。有时这样调优的效果很微小,通常这不会是我想要调的首要超参,但在有些应用中调这个参数也能提升了一些性能。考虑到其他超参的重要性,我通常给这个超参低点的优先级。

=== 1.12 梯度的数值逼近===

使用  双边的数值梯度  近似  解析梯度

=== 1.13 梯度检验===

 

=== 1.14 关于梯度检验实现的标注===

1、不要再训练中使用梯度检验,它只用在调试中。因为梯度检验很费时

 2、如果检验失败,look at specific components to try to identify bug

3、记住正则化项

4、Doesn‘t work with dropout。梯度检验时先关闭dropout,设置keep_node=1

5、Run at random intialization; perhaps again after some training. 这种情况很少发生,但是也有可能,small random initial values,运行梯度检验,有可能是对的,但随着训练进行权重away from zero,梯度检验将失败。虽然我不常这么做,但你可以选择的是,在初始化时跑梯度检验,然后让模型训练一段时间,权重away from 初始化值后,在进行梯度检验。

原文地址:https://www.cnblogs.com/JesusAlone/p/8513487.html