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

【台大李宏毅|ML】Regression

台大李宏毅老师机器学习公开课


Case 1:宝可梦模型预测

【目录】

  • 线性回归模型
  • 梯度下降
    * 单/多参数梯度下降的步骤
    * 梯度、学习率与局部最优
    * 线性回归的凸性
  • 模型评估与优化
    * 训练误差与泛化误差
    * 过拟合
    * 正则化

  1. 线性回归模型

(1)step 1:建立模型

根据一只宝可梦现在的CP值,大小、重量等因素对其进化后的CP值进行预测,选用线性回归模型。
在这里插入图片描述

(2)step 2:评价模型

线性回归模型是一类模型,改变模型中的参数就可以得到不同的回归直线,我们需要根据实际问题和数据集选择最适合的那一个模型。
在这里插入图片描述
按图示选择均方误差作为损失函数,我们希望找到损失函数值最小所对应的线性回归模型。

(3)step 3:择优选择模型

择优选择就是根据损失函数,选择使损失函数最小的一个模型f,也即使得损失函数最小的一组参数w和b。
在这里插入图片描述
求解上述所说的最优化问题常用的一种手段就是梯度下降(Grdient Descent)


  1. 梯度下降

梯度下降是一种优化求解手段,可以根据需要应用在各种模型中,并非只能用于线性回归中。

(1)核心思路
梯度下降方法最常使用在需要针对某一函数表达式进行最值优化,从而求得相应的最优参数的情况。

针对这类问题,也可以使用暴力方法,就是枚举每一个可能取到的参数,代入函数表达式进行求解,但暴力求解方法的效率过低。

(2)梯度下降的步骤

①单参数损失函数的梯度下降
在这里插入图片描述
【步骤】

  • 随机初始化一个初始值w0
  • 计算该点的梯度值
  • 确定学习率,在该点沿着负梯度方向行走一个步长,也即对参数进行更新
  • 重复上述后两个步骤,直到算法收敛(到达局部或全局极值或者损失差距达到某一阈值)

【名词解释】

【梯度】
微积分中的知识,用几何的观点来看,就是损失函数曲线上该点的切线方向;用数值变化的角度来看,就是该点数值变化率最大的变化趋势。

【负梯度方向】
按照下图所示,计算出的该点的梯度如果是个负值,说明曲线该点的一个邻域内,左边的函数值高于右边的函数值,我们的目标是使函数值(损失函数)尽量小,所以需要向右走,也就是要增加w;同理可以分析出,如果梯度是个正值,那么就需要减小w。

在这里插入图片描述

【学习率】与【步长】
确定了行走的方向,还需要明确一步走多长。
通常意义上,一步走的长度取决于两个因素——其一是该点的梯度值,其二就是选择的学习率η的值。

学习率可以理解为参数更新的幅度
若学习率较大,则学习效率较高,但有可能会产生震荡
若学习率较小,则学习效率较低,需要经过多次迭代。

【局部最优值】
按照上图,以及梯度下降的原理来看,如果结果陷入了局部最优值,那么就会无法找到全局最优,这对于梯度下降的确是一个值得讨论的问题。
但是,在线性回归中,是不会存在局部最优值的

②多参数损失函数的梯度下降

步骤与思想和单参数梯度下降都是一致的,只不过将导数运算转换成偏微分计算。
以及,很重要的一点!!!
在针对多个参数更新的时候,是同时更新的,也就意味着进行第二次迭代计算梯度时,代入的点都是更新后的点。(注意标框的地方)

在这里插入图片描述

(3)梯度下降的可视化

①梯度下降过程在等高线图的表示

如下图表示,两个轴分别控制两个变量的值,用颜色和等高线来可视化取不同参数时对应的损失函数值。
梯度下降的过程就是,在当前的每一个点,都沿着负梯度方向进行高度的下降,以期待最后达到最低点。

在这里插入图片描述
②线性回归的凸性

之前说过对于梯度下降来说,很担心被困在局部最优值上。如下图这样,有很多的峰谷。
在这里插入图片描述

但是对于线性回归来说,它的损失函数是凸的,也就意味着没有局部最优值。
相应地,它的等高线图就是一圈圈的椭圆,无论从任意一个初始点开始,最后都能找到唯一的相同的目标解。
在这里插入图片描述


  1. 模型评估与优化

(1)模型在训练集上的误差

通过梯度下降,在线性回归的问题上最终可以得到一组全局唯一的最优参数,从而可以将回归直线绘制出来,如下图所示。

在这里插入图片描述
可以看到,直线并不能完全经过所有的样本点,这说明拟合出来的模型是存在一定误差的,可以用平方误差和来评估当前模型的error。

(2)模型在测试集上的误差

但是我们预测模型的目的也在于对未知的数据进行预测,因此对模型进行评估的时候,也更加关注其泛化能力。

在这里插入图片描述
针对一组新的数据(在机器学习中常称为测试集),求解其平方误差和,可以发现泛化误差往往会高于训练误差。

因为训练出来的模型就是针对训练数据能够预测出来的最佳模型。

(3)模型规模与选择

在选定的模型上进行梯度下降算法,得到相应的参数,如果模型预测的效果仍然不太理想,就可以考虑构造一个更加复杂的模型。

在本例多项式回归中,所谓更加复杂的模型就是引入更加复杂的高次项。

①模型复杂度与训练误差的关系
在这里插入图片描述
由上图,可以直观地看到,选用的模型更加复杂,则训练误差会逐渐降低,最终稳定在一个较低的水平。

这一点可以通过模型之间的包含关系来理解,如上图的右下部分,每一个更加复杂的模型实际上包含了前面的简单模型,因为对于模型4而言,如果设w4系数为0,那么模型4实际上就退化成了模型3的复杂程度。

②模型复杂程度与泛化误差的关系
在这里插入图片描述
【现象】

通过图表,越复杂的模型并不一定在测试数据上较好的表现。

【过拟合(overfitting)】

定义:一个更加复杂的模型并不总是在测试数据集上有更好的模型表现

【方法论】

通过上面的图表,我们以后在进行模型选择的时候,可以针对一系列模型进行训练,并在训练集和测试集上都进行误差的求解,找出其中误差最小的那一类模型作为我们最终的选择。

(4)影响模型的其他因素

在本例中,还是以宝可梦CP值的预测为例

①将类别标签的选择转换成线性模型
在这里插入图片描述

按照上图,重新审视了数据集中的各个数据点,发现不同的精灵会有不同的预测规律。

【重新设计预测模型】

需要针对不同的精灵,分别预测一个模型。

在这里插入图片描述
【整理为线性模型】

利用阶跃函数(或者理解为指示函数等),可以将上述分段函数整理成一个模型的表示方式。

在这里插入图片描述
在这样的表示方式下,wi参数向量就是b1,w1,…b4,w4这些参数集合;
而数据集xi就是相应的δ函数值

【预测结果】
在这里插入图片描述

②其他因素

审视预测出来的模型,在个别点上依然会存在一些拟合不完全的现象,结合实际问题要去分析还有哪些相关因素会造成影响。

在这里插入图片描述

将这些可能影响模型的因素加入模型的方法,就是把它作为一个样本属性引入模型,从而需要重新改写模型,从另一个角度来说,也增加了模型的复杂程度。(此处就需要考虑前面说过的过拟合问题)


(5)模型正则化

既想要尽可能好地对数据集进行拟合,又要注意不要过拟合,正则化就是解决这一类trade-off问题的措施。

正则化操作的本质与核心,就是重新定义一下损失函数loss function,重新定义一下什么是好的模型。

①正则化示例

在这里插入图片描述

根据损失函数最小化的优化原则,我们就是希望找到的模型的各个参数都尽可能的小,而这样的参数曲线比较平滑

②原因剖析

【为什么参数较小的模型是一个相对平滑的模型】

假设我们的模型表示形如y = b + Σwi·xi,那么如果我们的自变量进行了某一变化Δxi,代入到模型表示式中我们的因变量就会有变化量wiΔxi,不难看到,参数越小的曲线,其同等自变量变化下,因变量的变化值是越小的。

【为什么我们更喜欢一个平滑的模型】

在进行模型训练时用到的数据或多或少都会有噪声信号的干扰,一个相对平滑的模型,它在每一个邻域附近的变动都不会太剧烈,受到噪声信号的影响也不会太大。

【正则化操作时并不会对偏移项bias进行操作】

前面已经分析过,我们进行正则化的目的就在于使得参数曲线越发平滑,但是偏移项bias只是对曲线进行上下偏移,而不影响曲线的平滑程度。

③正则化系数与模型误差的关系
在这里插入图片描述
【随着正则化系数的增加,训练误差会越来越大】

这一点也很好理解。
观看loss function的表达式,损失值由两部分组成,其一是拟合的误差值,其二是参数本身的范数值,而λ的大小实质上是控制了这两项在整个loss中的占比。
在这里插入图片描述
λ越大,就说明在考虑loss时是更加关注参数w本身的值,那么自然对于训练数据的拟合效果会越来越弱。

【随着正则化系数的增加,测试误差会先减小后增加】

因为模型的平滑度慢慢增大,模型的泛化能力是随之增加的。

但是当正则化的程度过大的时候,各个参数值会约束成很小很小且几乎一样的值,这个时候模型过于简单,不具备特殊性和分类、回归能力了。

【我们倾向于平滑的模型,但也不希望是过于平滑的模型】


Basic concepts:bias and variance

我们在前文中已经讨论过了模型的复杂度会对训练以及测试误差产生一定的影响。看似我们是定义了一个loss function去计算相应的误差,但是从模型的训练角度而言,模型的误差往往来自于两个方面——偏差和方差。

正确认识模型误差的来源,可以帮助我们更高效地针对模型进行调整。

  1. 相关概念:估计值、误差。
    在这里插入图片描述
    f^ 是标准答案(但是我们得不到),我们只能根据已有的数据,找到一个最佳的近似f*,这个时候就把f*称作f^的估计值

如果那打靶这件事来举例,f^标准值就是靶心十环,而我们要做的就是使估计出来的最佳值尽可能地接近靶心。

而f^ 和 f* 之间的距离就是估计的误差error


  1. bias 和 variance 在统计中的含义

假设有一个随机变量X,它的均值为μ,它的方差为σ2

①对变量X的均值进行估计

要进行估计,首先先对数据集取N个样本点,然后求这N个样本点的样本均值,按道理说得到的样本均值往往和变量期望不相等。(因为我们取样是取的有限多个点)

就像图片右边的数轴上所标示的那样,m会散布在标准值μ附近。

但是如果我们对所有的统计值m求期望,那么期望的结果应该是和最终结果μ相等的【可以利用数理统计的知识进行证明】,这就是无偏估计

在这里插入图片描述
又拿打靶举例来说,就好比今天我们虽然瞄准靶心进行开枪,但总是会因为相关因素,使得我们最后射中的地方是分布在靶心的周围的。
散布的程度由随机变量X的方差来决定,Var[m] = σ2 / N;所以当我们估计的时候取的样本点N越多,那么数据点就会分布得更加集中,散布程度越低。


②对变量X的方差进行估计

同理,我们也选择对数据集进行抽样,利用样本的方差来估计随机变量的方差。

但是如下图所示,根据概率论的相关知识,使用样本的二阶矩对变量的方差进行估计并不是无偏的。
这反映在图片中右边的数轴上,就是当样本数目N增多的时候,这些估计值相对标准值的偏差会减小。

在这里插入图片描述

  1. 线性回归的偏差与方差

(1)误差与偏差和方差

依然拿这个打靶举例——目标值f^和最终打出来的值f*之间的差距来源于两个步骤:

其一,你瞄准的是哪儿;这一部分也就是看待你的estimator是无偏估计还是有偏估计

其二,瞄准之后你打出来的位置与你瞄准的位置之间的偏移量;这一部分就是用估计值的散布程度进行分析
在这里插入图片描述

我们期待的理想状态就是low bias 和low variance 的情况——既要瞄准,也要抖动小。

(2)怎么去理解多组预测值

按照我们之前定义模型解决问题的步骤来看,我们针对当前的某一个输入,训练好的模型只能得到一个输出值,不像上图中会有若干个散布的点,那么我们自然也就得不到相应的bias和variance了。

老师在上课的时候说了“平行宇宙”的概念帮助理解,这些多个预测值的诞生就好比我们在多个平行宇宙做实验,在每个宇宙中,我们都需要抓10个宝可梦,然后进行模型的训练;但是在不同的宇宙中,我们抓到的宝可梦都不一样,训练出来的模型也不一样,预测出来的值从而也不一样。

上面的理解比较通俗易懂,这个过程代入到我们模型的训练过程,我觉得就是对数据集采用不同的方法(比如交叉验证,hold out等)进行训练集和验证集的划分,从而可以得到多个模型,因此得到一系列散布的点。
在这里插入图片描述

(3)模型复杂程度与variance的关系

我们把针对同一模型进行多次训练的结果绘制在同一图片中,然后用此来比较不同模型的多次训练的效果图。
在这里插入图片描述
在上面的效果图比较中,使用简单的model,每次找出来的值是大致相同的,所以多个点的散布程度不会太高;而看最复杂的那个模型,曲线之间的相异性很大,所以每次预测出来的值会有较大的差异,将结果绘制成散点图就会得到较大的散布程度。

考虑为什么模型越简单,就能反映数据点的variance程度越低?

当模型越简单的时候,其在训练过程中受不同数据影响的程度就会越低
比如考虑一个极端的例子f(x) = c,对于一个常数模型,不论是用什么样的数据进行训练,因为最后输出的值总是一致的,得到的数据总是紧密围绕在一个点上的,也就是数据的散布程度是很低。

(4)模型复杂程度与bias的关系

①bias问题定义
在这里插入图片描述

要研究一个模型的bias的大小,关键在于对所有的结果值求期望,然后用期望和目标值进行比较。

②bias与模型复杂程度的关系
在这里插入图片描述

在上图中,黑色的曲线就是我们的目标曲线,红色的曲线是每一次训练得到的模型曲线,蓝色的曲线就是红色曲线的期望水平。

可以看到,虽然红色曲线的分布越来越狂野,但是随着模型复杂程度上升(模型的次数增加),预测的期望水平和黑色曲线是越来越接近的。

【为什么模型越复杂,其训练出来的数据的bias会越低呢】

我们把一个模型看做是一个function set(函数集),那么我们最理想的结果就是从这函数集能产生的多个结果进行挑选。

当函数集比较小的时候,它能包含住目标值target的概率就会越小;
而函数集比较大的时候,(前面我们也讲过,对于线性回归而言,高阶的函数模型是包含了低阶函数的),那么复杂的模型其对应的函数集包含的范围就越大,能够包含目标值target的概率就会越高。

在这里插入图片描述


  1. 误差的偏差-方差模型
    在这里插入图片描述
    ①误差曲线(蓝色)是来自模型的偏差曲线(红色)和来自模型的方差曲线(绿色)的共同作用结果。
    ②随着模型复杂度的增加,模型的训练模式从高偏差低方差逐渐变成高方差低偏差。
    ③之后面对一个模型,我们可以利用偏差和方差的程度对拟合程度进行判断:
  • 过拟合:模型的方差较大
  • 欠拟合:模型的偏差较大
  1. 模型诊断与治疗

(1)模型诊断——怎么判断当前模型的error是bias主导还是variance主导呢?
在这里插入图片描述

按照老师的PPT中所说,就是你看当前的模型如果对于训练集的数据都拟合效果不好,那么模型应该就是处于bias的阶段;
如果模型对于训练数据集的拟合效果还行,但是对测试集有较大的误差,那么就可能处于variance状态

要判断偏差/方差(过拟合/欠拟合),就是画出测试误差和训练误差曲线,按照PPT中的原则进行判断即可。

(2)模型治疗——怎么矫正模型

①高偏差模型

  • 给模型增加更多的特征
  • 选择一个更加复杂的模型

②高方差模型

  • 增加训练的数据量
    在这里插入图片描述
  • 正则化——使得因为模型复杂而分布狂野的图像变得平滑和集中
    在这里插入图片描述

相关文章:

  • 【矩阵论】线性空间与线性变换(2)
  • 归并排序算法的实现与分析
  • 【MIT算法导论】分治法
  • 【矩阵论】线性空间与线性变换(3)(4)
  • 【矩阵论】线性空间与线性变换(5)
  • 【2/3/4-sum问题】算法设计剖析
  • 【矩阵论】线性空间与线性变换(6)
  • 【矩阵论】内积空间与等距变换(1)
  • TOP K问题的算法分析与实现
  • 【矩阵论】内积空间与等距变换(2)
  • 【矩阵论】矩阵的相似标准型(1)
  • 【矩阵论】矩阵的相似标准型(2)
  • 【MIT算法导论】线性时间排序
  • 【矩阵论】矩阵的相似标准型(3)
  • 【Leetcode】二叉树的遍历
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • [iOS]Core Data浅析一 -- 启用Core Data
  • 【391天】每日项目总结系列128(2018.03.03)
  • CSS3 变换
  • extract-text-webpack-plugin用法
  • HTTP那些事
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • JavaScript创建对象的四种方式
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • oldjun 检测网站的经验
  • Promise初体验
  • v-if和v-for连用出现的问题
  • 关于字符编码你应该知道的事情
  • 基于组件的设计工作流与界面抽象
  • 你真的知道 == 和 equals 的区别吗?
  • 什么软件可以剪辑音乐?
  • 一个JAVA程序员成长之路分享
  • MyCAT水平分库
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • (Java数据结构)ArrayList
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (剑指Offer)面试题34:丑数
  • (六)Hibernate的二级缓存
  • (南京观海微电子)——I3C协议介绍
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • (转)setTimeout 和 setInterval 的区别
  • .axf 转化 .bin文件 的方法
  • .htaccess 强制https 单独排除某个目录
  • .NET : 在VS2008中计算代码度量值
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
  • .sh文件怎么运行_创建优化的Go镜像文件以及踩过的坑
  • @Autowired多个相同类型bean装配问题
  • @ConfigurationProperties注解对数据的自动封装
  • @Responsebody与@RequestBody