“Datawhale X 李宏毅苹果书 AI 夏令营” Task1 笔记 #机器学习入门

一、机器学习基础

机器学习:机器具备有学习的能力。具体来讲,机器学习就是让机器具备找一个函数的能力。

机器学习目的与作用、方式、方法机器具备找函数的能力以后,它可以做很多事。eg:语音识别,机器听一段声音,产生这段声音对应的文字。方式和方法:我们需要的是一个函数,该函数的输入是声音信号,输出是这段声音信号的内容。

接下来就让我们通过实际的案例来了解到不同的问题所要用到的不同的函数

1.视频的点击次数预测

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

1.1找函数

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

y=b+\omega x_{1}

y: 就假设是今天总共的观看次数。

x_{1} :是这个频道,前一天总共的观看次数。

b 跟 \omega:是未知的参数,它是准备要通过数据去找出来的,只是隐约地猜测。猜测往往来自于对这个问题本质上的了解,即领域知识(domain knowledge)。机器学习就需要一些领域知识。

带有未知的参数(parameter)的函数称为模型(model)。模型在机器学习里面,就是一个带有未知的参数的函数,特征(feature)x1是这个函数里面已知的,它是来自于后台的信息,2月25 日点击的总次数是已知的,而\omega跟 b 是未知的参数。\omega称为权重(weight),b 称为偏置(bias)

1.1.2定义损失(loss),损失也是一个函数。

简单来讲,由于在模型中\omega跟 b 是未知的参数,预测结果就与实际值之间存在一个误差,用函数

L(b,\omega)来表示。

损失函数输出的值代表,现在如果把这一组未知的参数,设定某一个数值的时候,这笔数值好还是不好。

例如:从 2017 年 1 月 1 日到 2020 年 12 月 31 日的观看次数(此处的数字是随意生成的)如图 1.1 所示,接下来就可以计算损失。

图 1.1 2017 年 1 月 1 日到 2020 年 12 月 31 日的观看次数

把 2017 年 1 月 1 日的观看次数,代入这一个函数里面

得出\widehat{y}=500+x_{1}

可以判断 b = 500,w = 1 的时候,这个函数有多棒。x1 代入 4800,预测隔天实际上的观看次数结果为 yˆ = 5300,真正的结果是 4900,真实的值称为标签(label),它高估了这个频道可能的点击次数,可以计算一下估测的值 yˆ 跟真实值 y 的差距 e。计算差距其实不只一种方式,比如取绝对值:

e_{1} = \left | y-\widehat{y} \right | = 400

我们不是只能用 1 月 1 日,来预测 1 月 2 日的值,可以用 1 月 2 日的值,来预测 1 月 3日的值。根据 1 月 2 日的观看次数,预测的 1 月 3 日的观看次数的,值是 5400。接下来计算5400 跟跟标签(7500)之间的差距,低估了这个频道。在 1 月 3 日的时候的观看次数,才可以算出:

e_{2} = \left | y-\widehat{y} \right | = 2100

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

L = \frac{1}{N} \sum_{n}^{}e_{n}

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

估测的值跟实际的值之间的差距,其实有不同的计算方法,计算 y 与 \widehat{y} 之间绝对值的差距,如下列公式 所示,称为平均绝对误差(Mean Absolute Error,MAE)。

e=\left | \widehat{y} -y\right |

如果算 y 与 \widehat{y} 之间平方的差距,如式 (1.7) 所示,则称为均方误差(Mean SquaredError,MSE)

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

有一些任务中 y 和 \widehat{y}都是概率分布,这个时候可能会选择交叉熵(cross entropy),这个是机器学习的第 2 步。

以上只是为了让我们更加清楚的明白接下来是真实的数据。

调整参数 \omega和b,计算不同组合的损失,绘制等高线图。图中红色表示损失大,参数差;蓝色表示损失小,参数好。例如, \omega = -0.25, b = -500预测效果差; \omega = 0.75, b = 500预测效果佳; \omega接近1且b较小时,预测最精准。等高线图即误差表面,是机器学习优化参数的第二步。如下图所示的等高线图,就是试了不同的参数,计算它的损失,画出来的等高线图称为误差表面(error surface)
 

1.1.3解一个最优化的问题。

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

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

下图展示了梯度下降的过程:从随机初始点开始,计算参数\omega 对损失的微分,即误差表面的斜率(\frac{\partial L}{\partial \omega } | _{\omega= \omega^{0}})。若斜率为负,增大\omega 以减小损失;若斜率为正,减小\omega 。这个过程类似于站在某点环视四周,通过微分判断方向,向损失较小的方向移动。步伐大小取决于两个因素。

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

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

Q: 为什么损失可以是负的?

A: 损失函数自定义,如绝对值差,通常非负。但自定义损失函数可能包含负值。误差表面形状由损失函数决定,可为任意形态。
 

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

\omega^{1}\leftarrow \omega^{0} -\eta \frac{\partial L}{\partial \omega }| _{\omega= \omega_{0} }

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

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

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

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

梯度下降可能面临局部最小值问题,但实际难题并非如此。在两参数梯度下降中,如果单参数梯度下降有效,可快速扩展至多参数。

假设有两个参数,随机初始值为 \omega^{0}, b0。要计算 \omega, b 跟损失的微分,计算在 \omega =\omega^{0} 的位置,b = b0 的位置,要计算 \omega对 L 的微分,计算 b 对 L 的微分

\frac{\partial L}{\partial b}| _{\omega= \omega^{0},b=b^{0}}

\frac{\partial L}{\partial \omega }| _{\omega= \omega^{0},b=b^{0}}

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

\omega^{1}\leftarrow \omega^{0} -\eta \frac{\partial L}{\partial \omega }| _{\omega= \omega_{0},b=b0 }

b^{1}\leftarrow b^{0} -\eta \frac{\partial L}{\partial b}| _{\omega= \omega_{0} ,b=b0}

在深度学习框架里面,比如 PyTorch 里面,算微分都是程序自动帮计算的。就是反复同样的步骤,就不断的更新 \omega 跟 b,期待最后,可以找到一个最好的 \omega\omega^{*} 跟最好的 b∗. 如图 1.5 所示,随便选一个初始的值,先计算一下 \omega 对 L 的微分,跟计算一下 b 对 L 的微分,接下来更新\omega 跟 b,更新的方向就是 ∂L/∂w,乘以 η 再乘以一个负号,∂L/∂b,算出这个微分的值,就可以决定更新的方向,可以决定 \omega要怎么更新。把 \omega 跟 b 更新的方向结合起来,就是一个向量,就是红色的箭头,再计算一次微分,再决定要走什么样的方向,把这个微分的值乘上学习率,再乘上负号,我们就知道红色的箭头要指向那里,就知道如何移动 \omega 跟 b 的位置,一直移动,期待最后可以找出一组不错的 \omega, b。实际上真的用梯度下降,进行一番计算以后,这个是真正的数据,算出来的最好的 \omega^{*} = 0.97, b∗ = 100,跟猜测蛮接近的。因为x1 的值可能跟 y 很接近,所以这个 \omega 就设一个接近 1 的值,b 就设一个比较偏小的值。损失 L(\omega∗, b∗) 算一下是 480,也就是在 2017 到 2020 年的数据上,如果使用这一个函数,b 代100,\omega 代 0.97,平均的误差是 480,其预测的观看次数误差,大概是 500 人左右。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值