Datawhale X 李宏毅苹果书(入门) AI夏令营 task01笔记

官方学习链接:https://linklearner.com/activity/16/14/42

机器学习基础

导读

        通俗来讲,机器学习就是让机器具备找一个函数的能力。这里指的“找一个函数”,指的是找一个能够描述一个场景数学规律的函数模型,具体方法大致是:让机器运行算法,通过输入的数据,确定合适的函数参数,逼近实际场景。并不属于把所有情况人工枚举出来的传统的编程思路。

        例如语音识别,机器听一段声音,产生这段声音对应的文字。我们需要的是一个函数,该函数的输入是声音信号,输出是这段声音信号的内容。人类难以写出这个复杂的函数,因此想通过机器的力量把这个函数自动找出来。

根据要找的函数不同,机器学习有不同的分类:

        1. 假设要找的函数的输出是一个数值,一个标量(scalar),这种机器学习的任务称为回归(regression)

        例如机器要预测未来某一个时间的 PM2.5 的数值。机器要找一个函数 f,其输入是可能是种种跟预测 PM2.5 有关的指数,包括今天的 PM2.5 的数值、平均温度、平均的臭氧浓度等等,输出是明天中午的 PM2.5的数值。

        2. 人类先准备好一些选项,这些选项称为类别(class),现在要找的函数的输出就是从设定好的选项里面选择一个当作输出,让机器做选择,该任务称为分类(classification)

        例如,每个人都有邮箱账户,邮箱账户里面有一个函数,该函数可以检测一封邮件是否为垃圾邮件。

        注意:分类不一定只有两个选项,也可以有多个选项。

        3. 机器不只是要做选择题或输出一个数字,而是产生一个有结构的物体,这种问题这叫做结构化学习(structured learning)。

        比如让机器画一张图,写一篇文章。

案例学习

视频的点击次数预测:

        假设有人想要通过视频平台赚钱,他会在意频道有没有流量,这样他才会知道他的获利。假设后台可以看到很多相关的信息,比如:每天点赞的人数、订阅人数、观看次数。根据一个频道过往所有的信息可以预测明天的观看次数。

目的:找一个函数,该函数的输入是后台的信息,输出是隔天这个频道会有的总观看的次数。

机器学习找函数的过程,分成 3 个步骤:

        第一个步骤是写出一个带有未知参数的函数 f,其能预测未来观看次数。比如将函数写成:

                                                                y=b+wx_{1}

        其中,y 是准备要预测的东西,要预测的是今天这个频道总共观看的人,y 就假设是今天总共的观看次数。x_{1} 是这个频道,前一天总共的观看次数,y 跟 x_{1}都是数值,b跟w是未知的参数,它是准备要通过数据去找出来的,w跟b是未知的,只是隐约地猜测。

        也许今天的观看次数,总是会跟昨天的观看次数有点关联,所以把昨天的观看次数,乘上一个数值,但是总是不会一模一样,所以再加上一个 b 做修正,当作是对于观看次数的预测,这是一个猜测,它不一定是对的,等一下回头会再来修正这个猜测。

        猜测往往来自于对这个问题本质上的了解,即领域知识(domain knowledge)。y = b + w ∗ x_{1},而 b 跟 w 是未知的。带有未知的参数(parameter)的函数称为模型(model)。模型在机器学习里面,就是一个带有未知的参数的函数,特征(feature) x_{1} 是这个函数里面已知的,它是来自于后台的信息,2 月 25 日点击的总次数是已知的,而 w 跟 b 是未知的参数。w 称为权重(weight),b 称为偏置(bias)

        第 2 个步骤是定义损失(loss),损失也是一个函数。这个函数的输入是模型里面的参数,模型是 y = b + w ∗ x_{1},而 b 跟 w 是未知的,损失是函数 L(b, w),其输入是模型参数 b 跟w。损失函数输出的值代表,现在如果把这一组未知的参数,设定某一个数值的时候,这笔数值好还是不好。

假设未知的参数的设定是 b = 500,w = 1

        例如把 2017 年 1 月 1 日的观看次数,代入这一个函数里面 y=500+x_{1}可以判断 b = 500,w = 1 的时候,这个函数有多棒。x_{1}代入 4800,预测隔天实际上的观看次数结果为 y= 5300,真正的结果是 4900,真实的值称为标签(label)。

        可以据此计算一下估测的值 yˆ 跟真实值 y 的差距 e。计算差距其实不只一种方式,比如取绝对值:                           ​​​​​​​        ​​​​​​​        ​​​​​​​    

        我们不是只能用 1 月 1 日,来预测 1 月 2 日的值,还可以用 1 月 2 日的值,来预测 1 月 3日的值。以此类推,我们可以算过这 3 年来,每一天的预测的误差,这 3 年来每一天的误差,通通都可以算出来,每一天的误差都可以得到 e。接下来把每一天的误差,通通加起来取得平均,得到损失L。

        其中,N 代表训验数据的个数,即 3 年来的训练数据,就 365 乘以 3,计算出一个 L,L 是每一笔训练数据的误差 e 相加以后的结果。L 越大,代表现在这一组参数越不好,L 越小,代表现在这一组参数越好。

计算估测的值跟实际的值之间差距的不同的计算方法:

  1. 计算 y 与 yˆ 之间绝对值的差距,平均绝对误差(Mean Absolute Error,MAE)
  2. 算 y 与 yˆ 之间平方的差距,均方误差(Mean SquaredError,MSE)。
  3. 有一些任务中 y 和 yˆ 都是概率分布,这个时候可能会选择交叉熵(cross entropy)

        各种w 和各种 b组合起来以后,我们可以为不同w 跟 b 的组合计算它的损失,据此就可以画出等高线图。在这个等高线图上面,越偏红色系,代表计算出来的损失越大,就代表这一组 w 跟 b 越差。如果越偏蓝色系,就代表损失越小,就代表这一组 w 跟 b 越好,拿这一组 w 跟 b,放到函数里面,预测会越精准。如图所示的等高线图,就是试了不同的参数,计算它的损失,画出来的等高线图称为误差表面(error surface)。

        第 3 步是解一个最优化的问题。找一个 w 跟 b,使损失 L 的值最小,称其为w^{*}b^{*} 。

        梯度下降(gradient descent)是经常会使用优化的方法。为了要简化起见,先假设只有一个未知的参数 w,b 是已知的。w 代不同的数值的时候,就会得到不同的损失,这一条曲线就是误差表面,只是刚才在前一个例子里面,误差表面是 2 维的,这边只有一个参数,所以这个误差表面是 1 维的。怎么样找一个 w 让损失的值最小呢? 

        首先要随机选取一个初始的点 w_{0}。接下来计算,即在 w_{0}这个位置的误差表面的切线斜率,也就是这一条蓝色的虚线,如果这条虚线的斜率是负的,代表说左边比较高,右边比较低。就把 w 的值变大,就可以让损失变小。如果算出来的斜率是正的,就代表左边比较低右边比较高。w 往左边移,可以让损失的值变小。

        我们可以想像说有一个人站在这个地方,他左右环视一下,算微分就是左右环视,他会知道左边比较高还是右边比较高,看哪边比较低,他就往比较低的地方跨出一步。这一步的步伐的大小取决于两件事情:

  1. 第一件事情是这个地方的斜率,斜率大步伐就跨大一点,斜率小步伐就跨小一点。
  2. 另外,学习率(learning rate)η 也会影响步伐大小。学习率是自己设定的,如果 η 设大一点,每次参数更新就会量大,学习可能就比较快。如果 η 设小一点,参数更新就很慢,每次只会改变一点点参数的数值。这种在做机器学习,需要自己设定,不是机器自己找出来的,称为超参数(hyperparameter)。

注意:损失函数是自己定义的,在刚才定义里面,损失就是估测的值跟正确的值的绝对值。如果根据刚才损失的定义,它不可能是负的。但是损失函数是自己决定的,比如设置一个损失函数为绝对值再减 100,其可能就有负的。这个曲线并不是一个真实的损失,并不是一个真实任务的误差表面。因此这个损失的曲线可以是任何形状。

w_{0}往右移一步,新的位置为 w_{1},这一步的步伐是 η 乘上微分的结果,即:

        接下来反复进行刚才的操作,计算一下 w_{1}微分的结果,再决定现在要把 w_{1}移动多少,再移动到 w_{2},再继续反复做同样的操作,不断地移动 w 的位置,最后会停下来。

往往有两种情况会停下来:

  1. 第一种情况是一开始会设定,在调整参数的时候,在计算微分时最多计算几次。上限可能会设为 100 万次,参数更新 100 万次后,就不再更新了,更新次数也是一个超参数。
  2. 还有另外一种理想上的,停下来的可能是当不断调整参数,调整到一个地方它的微分值正好是 0 时,0 乘上学习率 η 还是 0,所以参数就不会再移动位置。假设是这个理想情况,把 w_{0}更新到 w_{1},再更新到 w_{2},最后更新到 w_{t}w_{t}卡住了,也就是算出来这个微分的值是 0 了,参数的位置就不会再更新。

        但是,梯度下降有一个很大的问题,没有找到真正最好的解(即没有找到可以让损失最小的 w)。在如图所示的例子里面,把 w 设定在最右侧红点附近可以让损失最小。但如果在梯度下降中,w_{0}是随机初始的位置,很有可能走到 w_{t}这里,训练就停住了,无法再移动 w 的位置。右侧红点这个位置是真的可以让损失最小的地方,称为全局最小值(global minima),而 w_{t}这个地方称为局部最小值(local minima),其左右两边都比这个地方的损失还要高一点,但是它不是整个误差表面上面的最低点。

        所以常常可能会听到有人讲到梯度下降不是个好方法,这个方法会有局部最小值的问题,无法真的找到全局最小值。事实上局部最小值是一个假问题,在做梯度下降的时候,真正面对的难题不是局部最小值。

  1. 高维空间中的局部最小值

    • 对于高维空间中的非凸优化问题,随着参数数量的增加,局部最小值变得越来越平坦,这些平坦的局部最小值实际上可能非常接近全局最小值。这意味着在实践中,这些局部最小值可能并不会显著影响模型的最终性能。
    • 研究表明,在深度学习中,对于具有足够多隐藏层的网络,几乎所有的局部最小值都是“好的”局部最小值,其对应的损失值非常接近全局最小值。
  2. 鞍点(Saddle Points)问题

    • 相比于局部最小值,鞍点在高维空间中更为普遍。在鞍点处,损失函数在某些方向上是上升的,而在其他方向上是下降的。这可能导致优化算法在这些点停滞不前,直到找到正确的下坡方向。
    • 逃离鞍点比逃离局部最小值更具挑战性,因为标准的梯度下降方法可能会在鞍点处陷入困境,导致优化过程变得缓慢。

        所以虽然局部最小值在理论上是存在的,但在深度学习实践中,尤其是在使用具有大量参数的深层神经网络时,局部最小值往往不会成为优化过程中的主要障碍。相反,如何有效处理鞍点问题以及确保模型训练的稳定性和高效性成为了更大的挑战。

        在有两个参数的情况下使用梯度下降,其实跟刚才一个参数没有什么不同。如果一个参数没有问题的话,可以很快的推广到两个参数。假设有两个参数,随机初始值为 w^{0}b^{0}。要计算在 w = w^{0}的位置,b = b^{0}的位置上w 对 L 的微分和 b 对 L 的微分:

        计算完后更新 w 跟 b,把 w^{0}减掉学习率乘上微分的结果得到 w^{1},把 b^{0}减掉学习率乘上微分的结果得到 b^{1}

        在深度学习框架中(比如 PyTorch ),算微分都是程序自动帮计算的。就是反复同样的步骤不断的更新 w 跟 b,期待最后可以找到一个最好的 w^{*}跟最好的 b^{*}

        如图所示,先随便选一个初始的值,先计算一下 w 对 L 的微分和 b 对 L 的微分,接下来更新 w 跟 b,更新的方向就是 ∂L/∂w乘以 η 再乘以一个负号,算出这个微分的值,就可以决定 w 要怎么更新,b同理,把 w 跟 b 更新的方向结合起来,就是一个向量,在图上显示为红色的箭头,以此类推,一直移动,期待最后可以找出一组不错的 w, b。

        实际上本案例真的用梯度下降进行一番计算以后,算出来的最好的 w^{*} = 0.97,b^{*}= 100,跟猜测蛮接近的(因为x_{1}的值可能跟 y 很接近,所以这个 w 就设一个接近 1 的值,b 就设一个比较偏小的值)。损失 L(w^{*}, b^{*}) 算一下是 480,也就是在 2017 到 2020 年的数据上,如果使用这一个函数,b 代100,w 代 0.97,平均的误差是 480,其预测的观看次数误差,大概是 500 人左右。


感谢您的学习,让我们共同探索机器学习的奥秘!我们下期再见。

  • 7
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值