吴恩达Deeplearning.ai 知识点梳理(course 2,week 1)

Course 2主要讲的是实践,以及让神经网络工作的更好。

Traing/Dev/Test Set

  在Machine Learning中,一般会将数据集分成Training Set,Develop Set以及Test Set。Training Set用于训练模型,Develop Set用于评估不同模型的性能(hold out/cross validation),Test Set用于最终的测试,得到一个无偏的结果。

  传统机器学习问题上,数据集大概在100/1000/10,000的规模上,那么三种数据集的占比就是60%/20%/20%,如果没有test set,只有training set和dev set,那么就是70%/30%占比。这个占比在业界就是rule of thumb。但是对于深度学习而言,数据集的量往往会达到1,000,000,这个时候一般dev set和test set就10,000就可以了。也就是98%/1%/1%的占比。

  很多人在调试的时候,会不用test set,只用training set和dev set,这个时候经常就把dev set叫做test set。所以这个名称有时候容易混淆。但是这种的话,其实最后得到的模型结果不是无偏的,因为人为的去dev set的结果选择模型啊等等(这个过程相当于人为的根据dev set进行训练),会导致整个结果容易在dev set上过拟合。虽然得到好结果,但是依旧在新问题上不能解决。当然,具体问题具体分析,有的时候确实不需要这个test set。

  另外一个问题是training/dev/test set的分布不一样。一个典型的例子是,比方我做了一个app,用来判别猫的图和没有猫的图。我做了一个爬虫收集到网上很多图片,训练了一个很好的模型,然后给用户用。但是用户用手机拍猫,判别的结果并不好。为什么呢?因为爬虫爬到的图片,很可能很多都是艺术图片,光线、清晰度、分辨率,都很高。而用户用手机拍,光线条件可能会更随意一些,另外如果有手抖星人,图片模糊一些,就更不好了。这就是说训练和最终的测试数据集分布不一样导致的效果不好。称为Mismatched train/dev distribution。

Bias/Variance

  Bias就是training error,Variance就是Develop error。在传统的机器学习问题上,通常会有Bias-Variance Trade Off的讨论。但是在深度学习上,则很少讨论这个Trade Off的问题。如下图所示:

Bias and Viariance

这就是典型的High Bias,Just Right以及High Variance,对应的是underfitting,just right以及overfitting。

  如果具体的数字,可以看到下一个示例:比方说我们有一个二分类问题,鉴别图像中是否有猫,然后我们经过训练模型后得到如下的结果:

结果编号 Bias Variance 评价
1 1% 11% High Variance
2 15% 16% High Bias
3 15% 30% High Variance and High Bias
4 0.5% 1% Low Variance and Low Bias

对于第一组结果来说,显然Bias很小,但是Variance很大,所以这个是overfitting,第二个是underfitting,因为bias和variance之间其实只差了1%,而第三个显然又underfitting,又有很大的variance。第四个就是happing ending了。

  High Variance and High Bias的情况是什么样的呢?如下图所示:

首先这个分类面因为自身原因,导致无法fit,比方说图里边的直线是无法fit这个数据集的,但是在某些区域,例如中间的位置,又overfit了。这是二维的情形,多维情况下,在没怎么设计好的模型上边会更容易出现。

Basic recipe for machine learning

  一般来说,机器学习,尤其是深度学习,可以按照如下的方式进行:
Basic recipe for machine learning

  1. 首先看是否有High Bias,如果有,那么就试试Bigger Network(一般都能奏效);run longer(就算不奏效也没有hurt);换一个神经网络架构(这个就得试试才知道结果了),一般来说经过这个都能把bias给去掉。
  2. 如果没有High Bias,那就看看是否有High Variance,如果有,那么有这么几种方法,一是用更多的数据(基本上都会奏效),二是使用正则化,三是使用其他神经网络架构。
  3. 如果High Bias和High Variance都没了,那就完成啦。

有这么2点Note:
+ High Bias和High Variance的处理方法是很不一样的,所以最好先用dev set进行问题诊断。比方说如果有High Bias问题,那么增加数据集一般都不会有用的。
+ 对于传统的Machine Learning来说,通常会有一个Bias和Variance的Trade Off。因为那个时候并没有什么特别好的工具来解决这类问题。但是现在不一样了。在深度学习和大数据时代,我们可以比较独立的调整Bias和Variance。一般来说,把神经网络变大,同时做好正则化,一般并不一定会在减小Bias的同时增加Variance,当然,这样肯定会增加计算量。而增加数据也通常会在减小variance的同时,不去影响bias。这也是为什么深度学习在监督学习领域里比较成功的原因。

正则化(Regularization)

Weight Decay/L2 Norm(F Norm) Regularization

  下图是Neural Network的Regularization。

就是在损失函数的末尾加上 W 的F-Norm。这样就可以控制 W 内元素的整体大小。之所以叫Weight Decay(虽然不常用这个名字),是因为在backpropagation的时候 W 前边系数是 1 α λ m ,这是一个小于1的值。

  为什么L2 Regularization可以减轻Overfitting呢?如下两个图所示:
这里写图片描述

这里写图片描述

由于对 W 内元素限制了大小,比方说有些Weight值很小,可以理解为整个网络中隐含层的神经元都“哑”了,不说话了,在这种条件下,整个网络结构变得简单,于是就趋向简单的模型,在这个过程中,就减少了variance。还有一种理解是,假如activation是tanh或者sigmoid等函数,那么weight很小,就比较接近原点这一段,这一段比较趋近于线性,那么整个网络就会趋向于线性网络,从而又减少模型的复杂性,从而降低variance。

Dropout Regularization(随机失活)

  Dropout Regularization是妥妥的直接删掉一些神经元。在每一次迭代的时候,都是根据dropout的概率,删掉一些神经元的输出。如下:
Dropout Implementation
注意由于做了归一化,那么在test的时候就不用再去归一化啥的了。
为什么随机失活能够起作用呢?
1. 在训练的时候,因为删掉了一些神经元,所以相当于在一个更小的神经网络上训练。
2. 对于一个神经元来说,由于它的输入可能随机失活,所以会更倾向于给每个输入一个小权重,这样整体就减少了权重的L2 Norm(收缩权值),所以最后和L2 Norm比较相似。但是从机制上说,dropout是一种自适应形式而不是L2 Norm那种惩罚性正则化。
3. Dropout是一种正则化手段,一般在计算机视觉上用的很多,因为维度很大。除非网络已经过拟合了,否则不会使用这种手段。
4. Dropout还有一个问题就是使得Loss function不是那么well defined了。所以调试时想要画图,就得把留存率设成1,然后画图看一下对错。

Other Regularization

Data Augmentation

  Data Augmentation 好处就是不用出门搜集数据。坏处就是数据集比较冗余。但是毕竟省事儿,几乎不要钱,只是增加计算量,值得一试。
1. 翻转
2. 随机裁切缩放

Early Stopping

  Early Stopping就是把training set和dev set的损失函数画出来,然后在dev set 的损失最小的地方停止。因为weight一开始很小,等到训练到最后可能就比较大了,所以在中间停止,这样w就是一个中间值。
  不过Early Stopping有个不好的,就是把bias和variance一起调,这事就不是很好,不好调。

Normalizing Input

  就是把输入的每一维归一化一下。好处是可以更容易优化:
Normalizing Input
如果不做好归一化,learning_rate就得设置的特别小,否则要是把learning_rate的设置的大一些,就会导致总是震来震去的。

梯度消失/爆炸

  Dr. Ng给出的解释是,假如神经网络的层数太多,那么激活函数/梯度会因为一级一级乘下来导致激活函数/梯度变得很大或者很小(指数级):
这里写图片描述

参数初始化

  梯度爆炸/消失的问题虽然很逾越,但是可以通过合适的选择w的初始值来减轻题都爆炸和消失的程度。
Weight Initializaton
将weight总体的均值控制在0,方差控制在1,就会比较好一些。那么对于单个的w则可以乘以 1 / n [ l 1 ] ,对于ReLU,设置为2则好一些。对于其他的,例如tanh,则是1,也称Xavier initializaton,ReLU则是2的那个。

Gradient Checking

  用来检查代码是不是对的。可以用数值的方法计算出来,然后代码计算,看一下两个值是否一致,或者相比来说比较小。具体略。

猜你喜欢

转载自blog.csdn.net/asasasaababab/article/details/79315988