deeplearning.ai第二部分

Week 1

1. 训练/开发/测试集

image-20200805211219534
image-20200805211219534

深度学习在结构化数据处理上很有用(非结构化的图也很不错了)。

在深度学习领域,设计一个应用程序,找到数据集之后,要反复迭代。

数据分为三个部分,train/dev/test sets。

在之前,数据量是万级别,人们会按照80/30分,60/20/20分。但是现在是大数据时代,百万的数据集,验证集和测试集的量会小一些。

新的趋势

训练集和测试集分布不匹配的情况下进行训练。很可能训练集时网上找的猫咪图片,像素很高、专业,但是测试、验证集是用户上传的,不清晰。

经验法则:这时候尽量保证测试集和验证集来自于同一分布。

没有测试集也行

测试集是做无偏评估的,不需要无偏评估的话也可以。这时候,我们把验证集也叫做测试集,实际是验证集。

2. 偏差/方差(Bias and Variance)

image-20200805211728247
image-20200805211728247

偏差和方差是很重要的概念,偏差是指绝对的错误,方差是指相对的错误。

前提是训练集、测试集数据来同一分布。

image-20200805212042864
image-20200805212042864
??方差是模型复杂程度? #### 3. 机器学习基础
image-20200805212810252
image-20200805212810252

训练模型后首先看一下性能如何,看看偏差是不是高,然后可以选择换一个网络或者算法,或者扩大网络的规模

一旦偏差降低到一定程度,这时看验证集的表现,可以考虑获得更多数据,或者进行正则化,找到低偏差的模型。

4. 正则化

解决过拟合,可以增加数据或者正则化。常用的是L2正则化。

如果是L1番薯,w可能会变得稀疏。有些人觉得可能能压缩模型,但实际没有。

$Frobeniu\; norm$,我们添加正则项,所以L2也被称为权重衰减。

image-20200806092415113
image-20200806092415113

5. 为什么正则化可以预防过拟合和解决方差问题?

直觉上可能能够从过拟合改到一个“just right”的状态。

image-20200806092657460
image-20200806092657460
$W$小的话会让$Z$也变小,那么激活函数就落在了线性部分,这样的模型简单。
image-20200806093603528
image-20200806093603528

6. Dropout正则化

让每一个节点有一定概率地失效。

1
2
3
d3 = np.random.rand(a3.shape[0],a3.shape[1]) < keep_prob
a3 = np.multiply(a3,d3)
a3 /= keep_prob

如果没有除以,会让模型越来越复杂,除以之后会让平均值不变。

image-20200806094806941
image-20200806094806941

7. 理解Dropout

随机删除一些节点,好像一个更小的神经网络,有dropout的话某个节点就不依赖于之前任意一个节点,不把赌注放在一个节点上,这样就权重进行平摊,就实现了类似L2的作用。

dropout在计算机视觉用得很多,有助于防止过拟合。如果不是为了防止过拟合,其实很少用,只是计算机使劲儿用的多。

dropout一大缺点就是J不能确定,实际上不能正确定义J,就是缺了传播过程。

8. 其他正则化方法

数据增强,比如翻转图片,随意裁剪图片。毫无代价地扩增了算法数据。

早停法,在神经网络上训练的时候,如果迭代次数过多就可能过拟合,所以早停。

image-20200806101418166
image-20200806101418166

9. 正则化输入

我们要把数据归一化,而且要经过相同的变化。这样做的目的是为了损失函数优化时候更简单。相似范围的优化更简单。??

image-20200806102626100
image-20200806102626100

10 .梯度消失与梯度爆炸

如果参数不是1,那小小的缩小不断相乘将让激活函数指数级下降。小小的增大会让激活函数指数级增长。

11. 神经网络的权重初始化

image-20200806104022802
image-20200806104022802

12. 梯度的数值逼近

我们可以用数值逼近的方式检查导数的计算。差分?来代替倒数。

把所有的参数和梯度合并在一起形成一个巨大的向量。

梯度检验

数值计算偏导数和符号计算偏导数,比对结果的差距。如果差距的L2距离是否小于$10^{-5}, 10^{-3}$,判断求导是否正确。

image-20200806105902149
image-20200806105902149
梯度检验的使用说明
  • 不要training的时候用,只在debug时候用。
  • 如果检验失败,要从所有项中找错误。
  • 不要忘记正则化。
  • 不能与dropout一起使用。

Week 2

1. mini-batch梯度下降法

向量化让我们能够高效地计算m个例子。把训练集划分为更小地子集。比如每个mini-batch里面有1000个例子,用符号$x^{\{i\}}$来表示。对x,y都要进行同样的分类。

有多少个minibatch我们做多少次训练,要用向量化同时处理一个minibatch中所有样本。

1
2
3
4
5
6
for t = 1,...,5000
forward prop on X^{t}
Z^[1] = W^[1]X^{t}+b^[t]
A
..
A

所以mini-batch一个epoch梯度下降了5000次。

image-20200806134107208
image-20200806134107208

2. 理解mini-batch梯度下降

边界情况下,如果mini-batch尺寸等于训练集量,那就叫做batch gradient descent。每次迭代太慢。

另一个鸡蛋,mini-batch尺寸等于1,叫做随机梯度下降,每个样本都是独立的batch。

随机梯度下降会失去所有向量化实现的加速,梯度下降会摆动,更为随机。

两者的结合,既能大量向量化,又不用整个数据集训练完。如果训练集较小,直接使用batch梯度下降。如果样本数量稍大,一般的mini-batch大小为64到512,考虑到电脑内存大小,2^n比较好。

另外,数据要符合CPU/GPU内存。这也是个超参数。

4. 指数加权移动平均

这时我们不断调整$\beta$的值,我们会得到不同的结果。

image-20200806143945955
image-20200806143945955
本质作用

我们可以用后面式子带入,求出$v_{100}$的值。从计算上很有效率。

image-20200806145917613
image-20200806145917613
偏差修正

在刚开始的时候,容易产生偏差。要修正一下。

image-20200806150722603
image-20200806150722603

5. 动量梯度下降法

梯度下降经常会发生摆动,为了防止摆动过大,我们调小了学习率,但是这样速度又很慢。所以我们提出Momentum梯度下降。

我们用现有的mini-batch计算dW,db。动量让不断摇摆的方向摇摆减小(摩擦力),而始终朝向的方向加速。其实就是对dW, db加上了一个惯性量。注意这里与学习率产生了影响。

image-20200806152333495
image-20200806152333495

6. RMSprop

在第t次迭代的时候,计算出dW和db,然后

然后里面W更新的方式那里要除以一个量,这样就能消除摆动。均方根。

7. Adam优化算法

image-20200806164341549
image-20200806164341549

RMSprop和动量梯度实践证明很好,Adam是将两者结合。

在每个迭代过程先mini-batch算出dW,db。然后分别计算v和S,然后更新W和b。

Adaptive moment Estimation。很少有必要调整参数。

image-20200806164348380
image-20200806164348380

8. 学习率衰减

image-20200806165122147
image-20200806165122147
image-20200806165114649
image-20200806165114649

如果学习率固定,那最后很难收敛。如果学习率不断减小,最后学习率很小。

学习率衰减的方法多种多样,可以反比例函数,可以指数函数,可以反比例然后根号,或者一个分段的衰减函数。

人们有时候还会手动decay。

9. 局部最优的问题

对于高维数据来说,出现极值点的概率很小,很大概率都是鞍点。(saddle point)

Week 3

1. 超参数调试处理

学习率最重要了,然后其它的次之。

调试的时候,早期参数很少,所以用网格法。现在参数很多了,我们可以随机取点。

在一个区域随机取点,找到比较好的区域,密集取点。

image-20200806231110524
image-20200806231110524

2. 为超参数选择合适的范围

有时可以选择均匀地取点,有时可以在log标尺上取点。

还有一个问题是给$\beta$取值,在0.9到0.999的范围上取值,我们可以先用1减,然后取log,然后我们可以随机取指数然后再变换。

不均匀的取值是因为在不同值时候灵敏度不同。

image-20200806232258620
image-20200806232258620

3. 超参数训练的实践

一种数据很多,但计算资源不多。逐渐观察自己的学习曲线,不断调整超参数,每天人工地babysitting模型的方法。

另一种方法是同时训练很多模型,并行。

熊猫方法和鱼子酱方法,这是由你拥有多少计算资源决定的。

image-20200806234933229
image-20200806234933229

4. 正则化网络的激活函数

归一化输入可以加速计算。我们可以把问题的轮廓变成更圆的。对于更深的模型来说,我们归一化之后,用一个线性变换对归一的数据操作,这样我们隐藏层就可以有自己想要的均值和方差,便于后面的计算。

Batch归一化。

image-20200807101241424
image-20200807101241424

5. 将batch norm放进神经网络

其实就是算出Z之后归一化一下,然后再用激活函数计算。

如果是用框架的话,可以很简单地调用函数实现。

可以把b去掉,把权重和归一化那里合并。

image-20200807103836896
image-20200807103836896
image-20200807103847286
image-20200807103847286

6. Batch norm为什么有用?

它可以让权重更持久,就是不会太快地爆炸或者消失。

“covariate shift”就是模型的迁移很麻烦,我们想做的和它实际做得是有差别的。数据变化了。如果学到了x到y的映射,如果x变了,那你要重新训练。

batch norm就是让均值方差不变,所以解决了一部分covariate shift问题。

并且因为它是在mini-batch上训练的,所以也会引入一些噪音,会有dropout的作用。正则化,不过作用很轻微。

image-20200807105152570
image-20200807105152570
测试时候

在测试时,可能要针对每一个数据做处理。所以这时,要一一处理。(增量运算)

一般指数加权平均估算$\mu$和$\sigma$,然后在测试集中运算。

image-20200807110724443
image-20200807110724443

7. Softmax回归

很多时候我们碰到了多分类问题,那么我们最后不能只是二分类。

最后一层多个神经元,每个神经元对应是一个类别的概率。这时要方便归一化,就用到了softmax函数。

image-20200807155522365
image-20200807155522365
image-20200807155530810
image-20200807155530810
训练softmax

如果是二分类,会变成logistic。

损失函数计算。

8. 深度学习框架

image-20200807162202287
image-20200807162202287
tensorflow

要保证参数变化但数据不变,把输入数据定义为placeholder。

image-20200807164037978