Datawhale X 李宏毅苹果书 AI夏令营 Task01笔记

        具体来讲,机器学习就是让机器具备找一个函数的能力。机器具备找函数的能力以后,它可以做很多事。比如语音识别,机器听一段声音,产生这段声音对应的文字。我们需要的是一个函数,该函数的输入是声音信号,输出是这段声音信号的内容。这个函数显然非常复杂,人类难以把它写出来,因此想通过机器的力量把这个函数自动找出来。还有好多的任务需要找一个很复杂的函数,以图像识别为例,图像识别函数的输入是一张图片,输出是这个图片里面的内容。AlphaGo 也可以看作是一个函数,机器下围棋需要的就是一个函数,该函数的输入是棋盘上黑子跟白子的位置,输出是机器下一步应该落子的位置。        

随着要找的函数不同,机器学习有不同的类别:

        1. 回归(regression)。假设要找的函数的输出是一个数值,一个标量(scalar),这种机器学习的任务称为回归。例如,假设机器要预测未来某一个时间的 PM2.5 的数值。机器要找一个函数 f,其输入是可能是种种跟预测 PM2.5 有关的指数,包括今天的 PM2.5 的数值、平均温度、平均的臭氧浓度等等,输出是明天中午的 PM2.5的数值,找这个函数的任务就是回归。

        2. 分类(classification)。分类任务要让机器做选择题。人类先准备好一些选项,这些选项称为类别(class),现在要找的函数的输出就是从设定好的选项里面选择一个当作输出,该任务称为分类。例如,每个人都有邮箱账户,邮箱账户里面有一个函数,该函数可以检测一封邮件是否为垃圾邮件;分类不一定只有两个选项,也可以有多个选项。例如,如果让机器下围棋,做一个 AlphaGo,给出的选项与棋盘的位置有关。棋盘上有 19 × 19 个位置,机器下围棋其实是一个有 19 × 19 个选项的选择题。机器找一个函数,该函数的输入是棋盘上黑子跟白子的位置,输出就是从 19×19 个选项里面,选出一个正确的选项,从 19 × 19 个可以落子的位置里面,选出下一步应该要落子的位置。

        3. 结构化学习(structured learning)。机器不只是要做选择题或输出一个数字,而是产生一个有结构的物体,比如让机器画一张图,写一篇文章。这种叫机器产生有结构的东西的问题称为结构化学习。

案例学习 

        以视频的点击次数预测为例介绍下机器学习的运作过程。假设有人想要通过视频平台赚钱,他会在意频道有没有流量,这样他才会知道他的获利。假设后台可以看到很多相关的信息,比如:每天点赞的人数、订阅人数、观看次数。根据一个频道过往所有的信息可以预测明天的观看次数。找一个函数,该函数的输入是后台的信息,输出是隔天这个频道会有的总观看的次数.(显然,这是一个“回归”的例子)

第一步 写出一个带有未知参数的函数f,其能预测未来观看次数

        比如将函数写成,

y=b+w*x_1

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

        猜测往往来自于对这个问题本质上的了解,即领域知识(domain knowledge)。机器学习就需要一些领域知识。这是一个猜测,也许今天的观看次数,总是会跟昨天的观看次数有点关联,所以把昨天的观看次数,乘上一个数值,但是总是不会一模一样,所以再加上一个 b 做修正,当作是对于 2 月 26 日,观看次数的预测,这是一个猜测,它不一定是对的,等一下回头会再来修正这个猜测。总之,y=b+w*x_1,而 b 跟 w 是未知的。带有未知的参数(parameter)的函数称为模型(model)。模型在机器学习里面,就是一个带有未知的参数的函数,特征(feature) x_1 是这个函数里面已知的,它是来自于后台的信息,2 月 25 日点击的总次数是已知的,而 w 跟 b 是未知的参数。w 称为权重(weight),b 称为偏置(bias)。

第二步 定义损失(loss) 

        损失也是一个函数。这个函数的输入是模型里面的参数,模型是y=b+w*x_1,而 b 跟 w 是未知的,损失是函数 L(b, w),其输入是模型参数 b 跟w。损失函数输出的值代表,现在如果把这一组未知的参数,设定某一个数值的时候,这笔数值好还是不好。

        我们可以算过这 3 年来,每一天的预测的误差,这 3 年来每一天的误差,通通都可以算出来,每一天的误差都可以得到 e。接下来把每一天的误差,通通加起来取得平均,得到损失L

L=\frac{1}{N}*\sum_{n}^{1}e_n

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

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

        1. 计算 y 与 yˆ 之间绝对值的差距,称为平均绝对误差(Mean Absolute Error,MAE)。

e=|\hat{y}-y|

        2. 如果算 y 与 yˆ 之间平方的差距,则称为均方误差(Mean SquaredError,MSE)。

e=(\hat{y}-y)^{2}

        3. 有一些任务中 y 和 yˆ 都是概率分布,这个时候可能会选择交叉熵(cross entropy)

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

第三步 解一个最优化的问题 

        找一个 w 跟 b,把未知的参数找一个数值出来,看代哪一个数值进去可以让损失 L 的值最小,就是要找的 w 跟 b,这个可以让损失最小的 w 跟 b 称为 w^{*}b^{*} 代表它们是最好的一组 w 跟 b,可以让损失的值最小。

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

        怎么样找一个 w 让损失的值最小呢?

        如下图所示,首先要随机选取一个初始的点 w_0。接下来计算 \frac{\mathrm{d} L}{\mathrm{d} w}|(w=w_0),在 w 等于 w_0 的时候,参数 w 对损失的微分。计算在这一个点,在 w_0 这个位置的误差表面的切线斜率,也就是这一条蓝色的虚线,它的斜率,如果这一条虚线的斜率是负的,代表说左边比较高,右边比较低。在这个位置附近,左边比较高,右边比较低。如果左边比较高右边比较低的话,就把 w 的值变大,就可以让损失变小。如果算出来的斜率是正的,就代表左边比较低右边比较高。左边比较低右边比较高,如果左边比较低右边比较高的话,就代表把 w 变小了,w 往左边移,可以让损失的值变小。这个时候就应该把 w 的值变小。我们可以想像说有一个人站在这个地方,他左右环视一下,算微分就是左右环视,它会知道左边比较高还是右边比较高,看哪边比较低,它就往比较低的地方跨出一步。这一步的步伐的大小取决于两件事情:

        ▪ 第一件事情是这个地方的斜率,斜率大步伐就跨大一点,斜率小步伐就跨小一点。

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

        接下来反复进行刚才的操作,计算一下w_1微分的结果,再决定现在要把w_1移动多少,再移动到w_2,再继续反复做同样的操作,不断地移动 w 的位置,最后会停下来。往往有两种情况会停下来:

        ▪ 第一种情况是一开始会设定说,在调整参数的时候,在计算微分的时候,最多计算几次。上限可能会设为 100 万次,参数更新 100 万次后,就不再更新了,更新次数也是一个超参数。

        ▪ 还有另外一种理想上的,停下来的可能是,当不断调整参数,调整到一个地方,它的微分的值就是这一项,算出来正好是 0 的时候,如果这一项正好算出来是 0,0 乘上学习率 η 还是 0,所以参数就不会再移动位置。假设是这个理想的情况,把 w_0 更新到 w_1,再更新到 w_2,最后更新到 w_T 有点卡,w_T 卡住了,也就是算出来这个微分的值是 0 了,参数的位置就不会再更新。

        同理,可以推广到对两个及多个参数的调整:

        在深度学习框架里面,比如 PyTorch 里面,算微分都是程序自动帮计算的。就是反复同样的步骤,就不断的更新 w 跟 b,期待最后,可以找到一个最好的 w,w_*跟最好的b ,b_*。 如下图所示,随便选一个初始的值,先计算一下 w 对 L 的微分,跟计算一下 b 对 L 的微分,接下来更新 w 跟 b,更新的方向就是 ∂L/∂w,乘以 η 再乘以一个负号,∂L/∂b,算出这个微分的值,就可以决定更新的方向,可以决定 w 要怎么更新。把 w 跟 b 更新的方向结合起来,就是一个向量,就是红色的箭头,再计算一次微分,再决定要走什么样的方向,把这个微分的值乘上学习率,再乘上负号,我们就知道红色的箭头要指向那里,就知道如何移动 w 跟 b 的位置,一直移动,期待最后可以找出一组不错的 w, b。

对该案例有其他疑问可参考下方视频: 

预测本频道观看人数(上) - 机器学习基本概念简介_哔哩哔哩_bilibiliicon-default.png?t=N7T8https://www.bilibili.com/video/BV1JA411c7VT/?p=2&spm_id_from=pageDriver&vd_source=f7aed0ed253c3539eaa0f998457a345b

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值