李宏毅机器学习第二节(自学1)

本文介绍了如何通过检查训练数据、识别ModelBias和OptimizationIssue来优化神经网络训练。强调了模型复杂度控制、过拟合预防方法,如数据增强、早期停止和Dropout,以及学习率调整策略如Momentum、Adagrad、RMSProp和Adam。同时讨论了批次大小对训练的影响和交叉验证在选择最佳模型中的作用。
摘要由CSDN通过智能技术生成

General Guide(一般性指南)

training data大的场景

如图,如果你对自己的训练结果不满意,首先检查你的training data的loss

也就是要先检查你的training data,看看你的model在training data上面有没有学起来,再去看testing的结果。如果你发现你的training data的loss很大,显然它在训练集上面也没有训练好。接下来你要分析一下,在训练集上面没有学好是什么原因。

这边有两个可能,第一个可能是Model Bias(模型偏差),第二个是Optimization Issue(优化问题)

Model bias

Model Bias 的意思就是适用的模型太简单了,不足以让 loss 足够低,也就是太简单的模型没法精确描述复杂的问题。(无论怎么调整参数值,Loss都大)

解决方法:设计一个有更大弹性的model(比如增加特征的数量)

Optimization Issue

我们一般用的optimization的方法一般gradient descent,使用这个方法可能会卡在local minima的地方。

Gaining the insights from comparison(从比较中获得见解)

判断到底是Model bias 还是 Optimization Issue(通过判断模型是否够大)

这个不是overfitting并不是所有的结果不好,都叫做overfitting。在训练集上20层的loss比较低,56层的loss比较高,这代表56层的network,它的optimization没有做好

一般情况下较深的神经网络的弹性比较大,但如果其Loss却比浅的神经网络的Loss更大,就说明出现了Optimization Issue,即梯度下降做的不好。此时需要采取其他方法。

training data小的情况

假设你现在经过一番努力,你已经可以让你的training data的loss变小了。那接下来你就可以来看testing data loss,如果testing data loss也小,比strong baseline还要小,那训练就结束了

Overfitting

如果model的自由度很大的话,它可以产生非常奇怪的曲线,导致其在训练集上的结果好,但是测试集上的loss很大。也就是产生overfitting。

解决过拟合问题

1、增加训练样本

2、Data augmentation

        所谓的Data augmentation就是你用一些你对于这个问题的理解,自己创造出新的资料。

3、限制模型的弹性

  • 使用比较少的参数
  • 比较少的features,比如本来用三天的资料,改成用给两天的资料。
  • Early stopping(早停法)
  • Dropout(丢弃)

模型复杂程度

Model比较复杂就是它包含的function比较多,它的参数比较多,这个就是一个比较复杂的model

对于一个比较复杂的model,如果你看它training的loss,就会发现随著model越来越复杂,Training的loss可以越来越低。但是在testing的时候,当model越来越复杂,刚开始testing的loss会跟著下降,但是当复杂的程度超过某一个程度以后,Testing的loss就会突然暴增

这是因为当你的model越来越复杂的时候,复杂到某一个程度overfitting就会出现。所以你在training的loss上面可以得到比较好的结果,在Testing的loss上面你会得到比较大的loss。

所以可以找到一个合适的复杂程度,当Model处于这个复杂程度时训练集和测试集的Loss都处于最低。

但是如果找到一个合适复杂程度的模型呢?——Cross Validation(交叉验证)

Cross Validation(交叉验证)

把Training的资料分成两半,一部分叫作Training Set(训练集),一部分是Validation Set(验证集)

这组数据里,有90%的资料放在Training Set里面,有10%的资料会被拿来做Validation Set。你在Training Set上训练出来的模型拿到Validation Set上去衡量它们的分数,你根据Validation Set上面的分数去挑选结果。因为你在挑结果的时候是用Validation Set来挑你的model,所以你的public的Testing Set的结果就可以反应你的private Testing Set的结果。就不会得到说在public上面结果很好但是在private上面结果很差这样的状况。

N-fold Cross Validation(N-重交叉验证)

假设N=3时,将训练集分为3份,每一份分别做验证集,将三个model分别做训练,将得到的Loss进行平均,Loss最小的就是效果最好的模型。

Mismatch

指的是训练集跟测试集分布是不一样的时候

类神经网络训练不起来怎么办

这部分讨论在Optimization的时候如何将梯度下降做好。

Critical Point(驻点:gradient为零的点)

Optimization失败的原因

在Optimization的过程中可能会出现随著你的参数不断的update,你的training的loss不会再下降的情况。

过去常见的一个推测就是现在model训练到了一个参数对loss的微分为零的位置,此时gradient descent就没有办法再update参数了。这个时候training就停下来了,loss也就不会再下降了。

但是要注意的是,不仅仅只有在局部最小的时候才会出现梯度为零的情况。

当loss没有办法再下降的时候,也许是因为卡在了critical point。但你不能说是卡在local minima,因为saddle point也是微分为零的点

如何判断驻点的类型

通过泰勒展开式,可以将L(\Theta)表示为下图:

H表示二次微分

如果到了一个驻点,则gradient为零,L(\Theta)可以表示为:

所以就可以通过红色框内的数值,判断驻点的类型:

Saddle Point v.s. Local Minima

local minima并没有那么常见。多数的时候你觉得你train到一个地方,你gradient真的很小,然后所以你的参数不再update了,往是因为你卡在了一个saddle point。

Batch

实际上在算微分的时候,并不是真的对所有 Data算出来的 L 作微分而是是把所有的 Data 分成一个一个的 Batch。

每一个 Batch 的大小为B。我们每次在 Update 参数的时候,是拿B笔资料计算 Loss、计算 Gradient,然后更新参数;拿另外B笔资料,再算个 Loss、算个 Gradient,再 Update 参数,以此类推。所有batch计算完就是一个epoth

Small Batch v.s. Large Batch

比较上图左右两边这两个Case,假设现在有20笔训练资料

  • 左边的 Case 没有用 Batch,这种状况叫做Full Batch
  • 那右边的 Case 就是,Batch Size 等于1。

​ 这是两个最极端的状况

​ 在左边 Case 中,因为没有用 Batch, Model 必须把20笔训练资料都看完才能够计算 Loss 和 Gradient。也就是必须要把所有20笔 Examples 都看完以后,参数才能够 Update 一次

如果 Batch Size 为1,代表只需要拿一笔资料出来算Loss就可以 Update 参数。因为现在只看一笔资料,就 Update 一次参数,所以用一笔资料算出来的 Loss在图中显然是比较 Noisy 的。也就是Update 的方向是曲曲折折的。

对比:左边是蓄力时间长,但是威力比较大;右边技能冷却时间短,但是比较不准(Noisy)。

实际上考虑并行运算的话,左边的方法并不一定时间比右边长

如果要比较这个 Batch Size 大小的差异的话,直接用技能冷却时间的长短并不精确。看起来在技能时间上面,大的 Batch 并没有吃亏,甚至还占优。

比较神奇的事情: Noisy 的 Gradient反而可以帮助 Training

从图中我们可以发现,随着batch-size的增加,准确率反而会下降。

这个是 Optimization 的问题,当你用大的 Batch Size 的时候,你的 Optimization 可能会有问题,小的 Batch Size,Optimization 的结果反而是比较好的。

“Noisy” update is better for training(“噪音”更新更适合训练)

相比较在Full Batch的情况下,Small Batch不会因为驻点的存在就早早的结束训练,你还是有办法 Training 你的 Model,还是有办法让你的 Loss 变小。所以今天这种 Noisy 的 Update 的方式结果反而对 Training,其实是有帮助的。

batch-size的大和小各有优劣,是一个需要我们自己调的超参数。

Momentum

Momentum也是除了调整Batch大小以外另一种可以解决驻点问题的方法,运作方法如下:

Vanilla Gradient Descent(一般的梯度下降)

一般的 Gradient Descent就是说,我们有一个初始的参数叫做θ⁰ ,计算一下Gradient,之后向 Gradient 的反方向去 Update 参数。

更新到新的参数以后,再计算一次 Gradient,再往 Gradient 的反方向 Update 一次参数…… Process 就一直这样进行下去。

Gradient Descent + Momentum

加上 Momentum 以后,每一次在移动参数的时候不只往Gradient 的反方向移动参数,而是 Gradient 的反方向的基础上加上前一步移动的方向,两者加起来的结果去调整去到我们的参数

Adaptive Learning Rate(自适应学习率)

critical point(驻点)其实不一定是在训练一个Network的时候会遇到的最大的障碍,这节要讲的是一个叫做Adaptive Learning Rate(适应性学习率)的技术,要给每一个参数不同的learning rate

Training stuck ≠ Small Gradient(训练卡住不代表小梯度)

当loss不再下降的时候,gradient并不一定真的变得很小。

在本例中,在error surface上,点可能来回震荡,并没有到达驻点,但Loss却不会下降。

之前的gradient descend中,所有的参数都是设同样的learning rate,这显然是不够的,learning rate它应该要根据不同的参数进行定制,也就是客制化。

Different parameters needs different learning rate(不同的参数需要不同的学习率)

我们希望越缓的地方学习率越大,越陡峭的地方学习率越小:

将原本梯度下降的计算公式

改为:

σ的上标t代表第t个迭代,下标i代表第i个参数,也就是说σ一方面依赖于迭代次数,迭代次数不同σ不同;另一方面说明σ也依赖于不同参数,参数不同σ也不同。

也就是说引进σ就可以把学习率改进成了parameter dependent(参数相关)的learning rate。

接下来看σ常见的计算方式。

Root mean square(均方根Adagrad)

RMS Prop

相较于均方根方法,本方法可以更快的调整学习率的大小

Adam

Adam是现在最常用的optimization的策略。

Learning Rate Scheduling(学习速率调度)

开始的例子中,这个简单的error surface我们都train不起来,现在来看一下加上Adaptive Learning Rate以后,能不能训练的起来。

先用最原始的Adagrad的方法,做起来是这个样子的

我们可以发现,还存在一个问题是,快到达终点的时候,在图像上会上下喷一下,这是因为只是gradient算出来都很小,所以在纵轴这个方向上就累积了很小的σ。当喷完之后,因为爆发以后纵轴的gradient又变得比较大,这个σ又慢慢的变大,σ慢慢变大以后,这个参数update的步伐大小就又慢慢的变小。

为了解决上述问题,存在一个方法叫做learning rate scheduling可以解决。

在原始算法中,η是一个固定的值。在learning rate scheduling中,不要把η当一个常数,要把它与时间建立联系,最常见的方法叫做Learning Rate Decay(学习速率衰减),也就是说随着时间的不断地前进、随着参数不断的update,让η越来越小。

Warm up

这个方法是让learning rate要先变大后变小。其中变大变小的程度、速度都属于hyperparameter,要自己手动调,但是大方向的大策略就是learning rate要先变大后变小。

优化器总结

最新版本中

  • 有Momentum,也就是说现在不是完全顺著这一个时间点算出来的gradient的方向来update参数,而是把过去所有算出来gradient的方向,做一个加总当作update的方向,即momentum
  • 接下来应该要update多大的步伐则通过Root Mean Square

损失函数对神经网络的影响

分类与回归

在之前的课程中,已经讲了在回归问题中,求真实值和预测值差异的方式

其中y和\hat{y}都是一个数值

分类问题中,可能会出现两个完全不同的类别,因为靠的比较近,而得到两个类别比较相似的问题。

为解决此类问题,用one-hot编码表示类别

其中,y是一个向量。

softmax

softmax用于多分类过程中,它将多个神经元的输出,映射到(0,1)区间内,可以看成概率来理解,从而来进行多分类!公式如下:

分类问题中的Loss函数使用:

在分类问题中,交叉熵损失函数使用次数最多,甚至会和softmax绑定使用。

  • 22
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值