当前位置: 首页 > article >正文

李宏毅机器学习课程笔记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,跑一次模型。最后取三种情况下的平均值,选平均结果最好的模型。

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

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


http://www.kler.cn/a/471807.html

相关文章:

  • 基于Qlearning强化学习的机器人迷宫路线搜索算法matlab仿真
  • MTK平台-- 无线AP隔离功能
  • FPGA设计:入行芯片领域的理想起点
  • C#中的关键字out和ref的区别
  • 低空管控技术-无人机云监视技术详解!
  • EntityFramework Core 数据种子
  • Docker:针对内网如何安装docker镜像
  • Golang学习笔记_20——error
  • 计算机网络 (29)网络地址转换NAT
  • vue2新增删除
  • Idea(中文版) 项目结构/基本设置/设计背景
  • Linux(Centos 7.6)命令详解:mkdir
  • Wireshark基本使用
  • LabVIEW四边形阻抗继电器
  • 需求分析基本操作流程
  • React使用Redux
  • Hive sql执行文件合并配置参数
  • vue3+vite+tdesign实现日历式可编辑的排课班表
  • 概率论与数理统计--期末
  • 第21章 汇编语言--- DMA(直接内存访问)