(2)机器学习任务攻略(loss太大怎么办)

General Guide

image-20210311205104719

对跑出来的结果不满意,第一件事情要做的事情是检查training data的loss,看看model在training data上面有没有学起来,再去看testing的结果,如果发现training data的loss很大,显然它在训练集上面也没有训练好,接下来要分析一下在训练集上面没有学好是什么样的原因

原因1:Model bias

所谓model bias的意思是假设的model太过简单。

image-20210311205956634

举例来说,我们现在写了一个有未知parameter的function,这个未知的parameter,我们可以代各种不同的数字,代θ¹ 得到一个function ,θ² 得到另一个function ,把所有的function集合起来,得到一个function的set。但是这个function的set太小了,没有包含任何一个function,可以让我们的loss变低,即可以让loss变低的function,不在你的model可以描述的范围内。

在这个情况下,就算你找出了一个θ*,它是这些蓝色的function里面最好的那一个也无济于事,那个loss还是不够低。

image-20210311212242288

这个时候需要重新设计一个model,给model更大的弹性,比如你可以增加你输入的features。同样你也可以用Deep Learning增加更多的弹性。

原因2:Optimization Issue

image-20210311213108040

蓝色部分是你的model可以表示的函式所形成的集合,你可以把θ 代入不同的数值形成不同的function,把所有的function通通集合在一起得到这个蓝色的set,这个蓝色的set里面确实包含了一些有着最低loss的function。

但问题是gradient descent这一个演算法,没办法帮我们找出这个loss低的function,gradient descent是解一个optimization的problem找到θ* 然后就结束了

这就好像是我们想大海捞针,针确实在海里,但是我们却没有办法把针捞起来,这边问题就来了

training data的loss不够低的时候,到底是model bias还是optimization的问题呢

Gaining the insights from comparison比较

一个建议判断的方法,就是可以透过比较不同的模型得知model现在到底够不够大

image-20210311214054168

举一个例子,我想测2个networks

  • 一个network有20层
  • 一个network有56层

我们把它们测试在测试集上,这个横轴指的是training的过程(参数update的过程),随著参数的update loss会越来越低,但是结果20层的loss比较低,56层的loss还比较高,说明不是model bias的问题(56层的model bias大但是效果却不好),这代表56层的network的optimization没有做好

(这个不是overfitting并不是所有的结果不好都叫做overfitting)

怎么知道optimization有没有做好?

看到一个你从来没有做过的问题,可以先跑一些比较小的比较浅的network,或甚至用一些不是deep learning的方法,比如说 linear model,比如说support vector machine、support vector machine它们比较不会有optimization失败的问题

接下来还缺一个深的mode,如果你发现你深的model跟浅的model比起来,深的model明明弹性比较大但loss却没有办法比浅的model压得更低,那就代表说optimization有问题,gradient descent不给力

原因3:Overfitting

image-20210313204055684

如果training data上面的loss小,testing data上的loss大,那可能就是真的遇到overfitting的问题

举例来说,假设我们输入的feature叫做x,我们输出的level叫做y

x跟y之间的关系是这个二次的曲线,这个曲线我们刻意用虚线来表示,因为我们通常没有办法直接观察到这条曲线,我们真正可以观察到的是是我们的训练集, 你可以想像成从这条曲线上面随机sample出来的几个点

image-20210313205918762

如果只给它这三个点,并且模型弹性很大,虽然model最后的曲线会通过这三个点,但是它没有训练集做为限制所以有的地方就会有freestyle,导致model变成各式各样奇怪的function。

这个时候,如果运行testing data,testing data是橙色的点,training data是蓝色的点。用蓝色的这些点找出一个function以后,测试在橘色的这些点上结果不一定会好,如果model的自由度很大,它可以产生非常奇怪的曲线导致训练集上的结果好,但是测试集上的loss很大

解决overfitting的问题有两个可能的方向

    1.第一个方向往往是最有效的方向,是增加你的训练集

image-20210313210215733

所以今天如果训练集蓝色的点变多了,那虽然你的model它的弹性可能很大,但是因为你训练点非常的多,它就可以限制住

如果训练数据有限的话可以做data augmentation

image-20210313210406236

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

举例来说在做影像辨识的时候,假设你的训练集里面有某一张图片,把它左右翻转,或者是把它其中一块截出来放大等等

但是要注意data augmentation不能够随便乱做,举例来说在影像辨识里面很少看到有人把影像上下颠倒当作augmentation,因为它不合理

     2.另外一个解法就是不要让模型有那么大的弹性,给它一些限制

举例来说假设直接限制model中x跟y的关系其实就是一条二次曲线,只是不明确的知道这二次曲线里面的每一个参数具体是什么,就会在选择function的时候有很大的限制,因为二次曲线来来去去就是那几个形状而已,所以训练集有限时也无所谓

image-20210313211849093

 其他方法给model制造限制:

  • 给它比较少的参数,如果是deep learning的话就给它比较少的神经元的数目,本来每层一千个神经元改成一百个神经元之类的,或者是可以让model共用参数
  • 另外一个就是用比较少的features,比如本来给三天的资料,改成用给两天的资料,其实结果就好了一些
  • 还有一个招数叫做Early stopping(Early stopping,Regularization跟Dropout,都是之后课程还会讲到的东西)
  • Dropout

但是我们也不要给模型太多的限制

假设我们现在给模型更大的限制说模型一定是Linear的Model,一定是写成y=a+bx,那你的model它能够产生的function就一定是一条直线

image-20210313212322570

假如给三个点并且没有任何一条直线可以同时通过这三个点,于是只能找到一条直线跟这些点比起来它们的距离相对来说比较近

但是 这个不是overfitting因为又回到了model bias的问题,所以现在这样在这个情况下,这个截图的case结果不好,并不是因为overfitting而是因为给模型太大的限制,导致有model bias的问题。

image-20210313212632577

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

那这因为当model复杂到某一个程度,overfitting的状况就会出现,所以在training的loss上面可以得到比较好的结果,但是Testing的loss就会很大,那就希望可以选一个中庸的模型

Cross Validation

合理选择model的办法:把Training的资料分成两半,一部分是Training Set,一部分是Validation Set。90%的资料放在Training Set裡面,10%的资料被拿来做Validation Set,在Training Set上训练出来的模型,在Validation Set上面去衡量它们的分数,根据Validation Set上面的分数去挑选结果

image-20210313215406332

N-fold Cross Validation

如果你有这个担心的话,那你可以用N-fold Cross Validation,

image-20210313215636180

N-fold Cross Validation就是先把训练集切成N等份,比如切成三等份,拿其中一份当作Validation Set另外两份当Training Set,然后这件事情要重复三次。也就是说先第一份第二份当Train,第三份当Validation,,然后第一份第三份当Train,第二份当Validation,最后第一份当Validation,第二份第三份当Train

原因4:mismatch

上次课讲到预测2/26的观看人数

image-20210313220115627

把三层的network拿来测试一下(投票的结果),以下是测试的结果

image-20210313220138585

然后红色的线是真实的数字,蓝色的线是预测的结果,2/26是2021年观看人数最高的一天,机器的预测差距有2.58k,学生为了让这个模型不准2/26花了很多力气去点了这个video,但是模型会觉得它是一个低点也不能怪它。因为根据过去的资料礼拜五的观看人数就是最少,但是2/26出现了反常的状况,应该算是另外一种错误的形式叫作mismatch。

image-20210313220235078

mismatch的原因跟overfitting其实不一样,一般的overfitting可以用搜集更多的资料来克服,但是mismatch是说训练集跟测试集,它们的分布是不一样的

image-20210313220434830

在训练集跟测试集分布是不一样的时候,训练集再增加也没有帮助了

举例来说 以作业一的Covid19为例的话,假设资料在分训练集跟测试集的时候以2020年的资料为训练集,2021年的资料是测试集,那mismatch的问题就很严重了。因为2020年的资料跟2021年的资料的背后的分布其实是不一样,所以拿2020年的资料来训练根本就预测不准

image-20210313220457880

作业十一(影像分类)就是针对mismatch的问题来设计的,它的训练集蛮正常的,但它测试集就是简笔画,所以这个时候增加资料也没有办法让模型做得更好

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值