李宏毅机器学习课程笔记02 | 机器学习任务攻略General Guide

第一步:分析loss on training data

先检查在训练数据上模型是否很好的学习

情况1:如果在训练集上,loss很大,说明在训练资料上没有训练好

可能性1 :设置的模型太简单了,模型存在model bias模型偏差,可以让loss变低的function,不在model可以描述的范围内

解决办法 :重新设计一个更为复杂、有弹性、有未知参数、需要更多features的Model function

可能性2Optimization优化的不好

存在一个很好的function,但是gradient descent没有找到这个functio。 可能会卡在local minima(局部极小值/鞍点)的地方,没有办法找到一个真的可以让loss很低的参数。

如何区分这两种情况?

看到一个你从来没有做过的问题,也许你可以先跑一些比较小的,比较浅的network,或甚至用一些,不是deep learning的方法 => **比较容易做Optimize的,**它们比较不会有optimization失败的问题。先观察一下loss的情况

如果发现深的model,跟浅的model比起来,深的model明明弹性比较大,但loss却没有办法比浅的model压得更低,那就代表说optimization有问题 => 模型越深,能够拟合的函数越多,表达能力越强。就算20层之后的36层每一层仅仅copy前一层的结果,56层的效果也应该等同于20层

第二步:分析loss on testing data

当发现loss在训练数据集上已经很小了,我们就分析在测试集上的loss。

情况1:如果在测试集上的loss也很小,说明该模型效果很好了。

情况2:如果在测试集上loss很大

可能性1overfitting - training的loss小,testing的loss大

解释:为什么会出现loss小,testing的loss大

  1. 假设一个极端的例子,有一个一无是处的模型如下图,其实模型什么都没有学到。
  1. 假设另一个例子,下图是x与y的真实关系曲线(这个关系曲线就是希望我们可以学到的),但实际这个函数是观测不到的,我们只知道上面的一些坐标/点(训练资料)。 如果你的model它的自由度很大的话,它可以产生非常奇怪的曲线,导致训练集上的结果好,但是测试集上的loss很大。

解决方案

  1. 增加训练资料。

可以做Data augmentation数据加强,利用自己对问题的理解,创造资料。这里的创造不是凭空创造,需要augmentation的有道理。

比如做图像识别的时候,一张图左右翻转,截图放大等,这样并不会影响特征。但是很少有将一张图翻转的,翻转后的图可能不是真实世界会出现的。

  1. 限制模型弹性

假设通灵出这个模型就是二次曲线,能选择的function有效,这样可以较容易的训练出与真实相似的模型

限制模型的方法有 ① 较少的参数,如果是深度学习就给较少的神经元个数,或者让模型modal共用参数 ②较少的features,比如从给三天的资料变成给两天的资料 ③early stopping ④regularization正则化 ⑤dropout

注意:这里限制太过,又可能引发model bias的问题

可能性2 :发生mismatch问题

比如按照之前的情况预测某天的观看量,某天的观看量应该很低。但在前一天有人宣传这个视频,引来了很多人来观看(异常情况),导致模型预测错误。

=> 训练资料和测试资料(发生异常?)分布不一样

Bias-Complexity Trade-off bias和复杂性的均衡

当complexity复杂到一定程度时,在测试数据上的loss开始增加,出现overfitting的情况。

所谓比较复杂就是,简单的说是包含的function比较多,它的参数比较多的model

问题: 如何选出有较低testing-loss的模型 ?

直觉的做法:假设有三个模型,将三个模型都上传到Kaggle上面,取均分误差`Mean Squared Error(MSE)最低。

存在问题:考虑之前的极端例子,假设有三个model都是极端的,在测试数据时,都是产生随机的结果,那么可能某个模型随机出的结果误差最小。这样选出的模型并不是由较低testing-loss的模型,只是刚好随机到了较好的结果。

public和private可以想象成,可以根据public公开的数据集的结果调 模型,所以在public上模型效果很好,由于private的效果很差。

模型设计完整之前,不要用测试数据

解决Cross Validation交叉验证

Training的资料分成两半,一部分叫作Training Set,一部分是Validation Set。先在Training Set上训练模型,然后在Validation Set上衡量模型的均分误差mse,最后用测试集测试模型。

理想情况用Validation Set挑模型,不要过多关注public testing set


问题2: 如何划分Training SetValidation Set,怎样避免分的不好影响训练结果?

解决 :采用N-fold Cross Validation N折交叉验证

N-fold Cross Validation把训练集切成N等份,拿其中一份当作Validation Set,另外N-1份当Training Set,重复N次。

假设我们切成3份,第一次让第3份为validation,跑一次模型。然后第二次让第2份为validation,跑一次模型。最后第三次,让第1份为validation,跑一次模型。最后取三种情况下的平均值,选平均结果最好的模型。

评论区补充的:三种模型指的是弹性不同的三种模型,而不是相同弹性但参数不同的三种模型。

这个地方也很好理解,在创建模型的第三步优化时,就已经在相同弹性不同参数中选出最好的参数了。

相关推荐
@小匠4 小时前
Read Frog:一款开源的 AI 驱动浏览器语言学习扩展
人工智能·学习
山间小僧5 小时前
「AI学习笔记」RNN
机器学习·aigc·ai编程
网教盟人才服务平台7 小时前
“方班预备班盾立方人才培养计划”正式启动!
大数据·人工智能
芯智工坊7 小时前
第15章 Mosquitto生产环境部署实践
人工智能·mqtt·开源
菜菜艾7 小时前
基于llama.cpp部署私有大模型
linux·运维·服务器·人工智能·ai·云计算·ai编程
TDengine (老段)7 小时前
TDengine IDMP 可视化 —— 分享
大数据·数据库·人工智能·时序数据库·tdengine·涛思数据·时序数据
小真zzz8 小时前
搜极星:第三方多平台中立GEO洞察专家全面解析
人工智能·搜索引擎·seo·geo·中立·第三方平台
GreenTea8 小时前
从 Claw-Code 看 AI 驱动的大型项目开发:2 人 + 10 个自治 Agent 如何产出 48K 行 Rust 代码
前端·人工智能·后端
火山引擎开发者社区9 小时前
秒级创建实例,火山引擎 Milvus Serverless 让 AI Agent 开发更快更省
人工智能