(更新中)李宏毅机器学习2022年学习笔记(二)
作者:互联网
一、 General Guide——如何达到更好的效果
1. Training data 出现的问题训练完一次模型后,根据训练集的损失以及测试集的损失来确定网络需要进行模型改进还是优化函数改进。
整体调整方向如下图所示:
如果你觉得模型预测的结果不满意的话,第一件事情你要做的事情是,检查你的training data的loss,看看你的model在training data上面有没有学起来,再去看testing的结果。如果你发现你的training data的loss很大,显然它在训练集上面也没有训练好。有两个可能的原因,第一个可能是Model Bias(模型偏差),第二个是Optimization Issue(优化问题)
① Model Bias(模型偏差)
原因:适用的模型太简单,不足以让 loss 足够低(太简单的模型没法精确描述复杂的问题)
在选用的模型组成的 function set (函数集)中没有一个最优的 function 可以让 Loss 足够低。
解决方案:调整模型,让模型变复杂变得有弹性,使模型能够包含更多情况。
使模型变复杂的方法:
1、使用更多的特征作为自变量。
2、加深神经网络,用到更多的神经元和层数。
② Optimization Issue
原因:在利用Gradient descent寻找最优解时,可能会陷入局部最优解(local minima)
gradient descent方法,没办法帮我们找出loss低的function,gradient descent是解一个optimization的问题,找到θ* 然后就结束了。但是它给我的loss不够低。这个 model 组成的 function set 里面,存在某一个 function,它计算出的 loss 是足够低的,但是 gradient descent 找不到这一个 function。
如何区分上述两种情况?
-
遇到某一任务目标可以先跑一些比较小、比较浅的 network,或甚至用一些不是 deep learning 的方法(比较容易做Optimize的,避免出现优化失败的情况)
-
如果发现在这基础上增加复杂度后的层数深的 model 跟浅的 model 比起来,深的model明明弹性更大更复杂,但 Loss 却没有办法比浅的model压得更低,那就代表 optimization 有问题
2. Testing data 出现的问题
假设在 training data 的loss变小了之后,接下来可以来看 testing data loss,如果testing data loss也小,比strong baseline还要小,那训练就结束了。
但是如果training data上面的loss小,testing data上的loss大,那可能就是真的遇到 overfitting 的问题。
Overfitting
表现形式:training的loss小,testing的loss大。
极端情况进行解释原因:训练出的模型只是记住了训练集中的输入和输出的对应关系,对于未知的部分输出是一个随机的,这种情况下在训练集中的损失为0,测试集中的损失极高。
解决方式:
1. 增加训练集:可以使用data augmentation的方式进行数据扩充,例如图像中的旋转、放缩等操作(上下颠倒的操作很有可能会造成数据在真实世界中的无意义,所以很少用,要根据你对资料的特性,对你现在要处理的问题的理解来选择合适的data augmentation的方式)。
2. 限制模型的弹性:
1)给较少的参数:如果是deep learning的话,就给它比较少的神经元的数目。本来每层一千个神经元,改成一百个神经元之类的;或者是你可以让 model 共享参数,让一些参数有一样的数值。
P.S. fully-connected network(全连接网络)是一个比较有弹性的架构;而CNN(卷积神经网络)是一个比较有限制的架构,它是针对影像的特性,来限制模型的弹性。
所以 fully-connected network 可以找出来的function所形成的集合,是比较大的;CNN 的 model 所找出来的 function,它形成的 function set 是比较小的,实际上都包含在fully-connected的network里面。但是就是因为CNN有比较大的限制,所以CNN在影像上反而会做得比较好。
2)使用较少的features
3)Early stopping:训练设置提前结束的条件。(另还有Regularization正则化的方式)
4)Dropout:将部分神经元进行禁用。
二、Bias-Complexity Trade-off——模型偏置与弹性
所谓比较复杂就是,它可以包含的function比较多,它的参数比较多,这个就是一个比较复杂的 model
随著model越来越复杂,Training 的 loss 可以越来越低,
当model越来越复杂的时候,刚开始,testing 的 loss 会跟著下降;但是当复杂的程度,超过某一个程度以后,Testing的loss就会突然暴增了
原因:
model 越来越复杂的时候,复杂到某一个程度,overfitting 的状况就会出现,所以在 training 的 loss 上面,可以得到比较好的结果;
但是在 Testing 的 loss 上面,会得到比较大的loss
因此我们需要设计一个 model ,既不是太复杂的,也不是太简单的,这个 model 刚好可以在训练集上给我们最好的结果(给我们最低的 loss)
① 如何选出有较低testing-loss的模型?⇒ Cross Validation(交叉验证)
方法:把Training的资料分成两半,一部分叫作 Training Set(训练集),一部分是Validation Set(验证集)
在这组数据里,有90%的资料放在 Training Set 里面,有10%的资料会被拿来做Validation Set。
在Training Set上训练出来的模型拿到 Validation Set 上面,衡量它们的 Loss 值,根据 Validation Set 计算出的数值从而挑选选用哪个模型,不要管在public testing set上的结果,避免overfiting
② 如何合理的分 training set 和 validation set —— N-fold Cross Validation(N-重交叉验证)
N-fold Cross Validation 具体步骤如下:
1. 先把训练集切成 N 等份,在上图例子里我们切成三等份。切完以后,拿其中一份当作 Validation Set,另外两份当 Training Set,然后要重复三次
2. 将组合后的三个 model,相同环境下,在 Training data set 和 Validation data set 上面通通跑一次。然后把这每个 model 在这三类数据集的结果都平均起来,看看哪个 model 计算出的结果最好
如果你用这三个fold(层)得出来的结果是 model 1 最好,便把 model 1 用在它所划分的两组 Training Set 上,然后训练出来的模型再用在 Testing Set 上面
③ MisMatch —— 训练集跟测试集的分布是不一样的
在训练模型的过程,也可能会出现另一种形式的问题,称为mismatch。
mismatch产生的原因与overfitting不一样。一般的overfitting你可以用增加更多的数据集来克服,但是mismatch是指训练集跟测试集它们的分布是不一样的。即使再增加数据集也没有用,例如:training data set 和 test data set 选取了来源不同的数据集,用于成像、图像增强等的操作均不同,这样的实验是没有意义的。
标签:loss,Set,训练,李宏毅,模型,学习,2022,model,data 来源: https://www.cnblogs.com/zyddd915/p/16212289.html