Datawhale X 李宏毅苹果书 AI夏令营----Task02

1 章 机器学习基础

1.1 案例学习

以视频的点击次数预测为例介绍下机器学习的运作过程。假设有人想要通过视频平台赚
钱,他会在意频道有没有流量,这样他才会知道他的获利。假设后台可以看到很多相关的信
息,比如:每天点赞的人数、订阅人数、观看次数。根据一个频道过往所有的信息可以预测明
天的观看次数。找一个函数,该函数的输入是后台的信息,输出是隔天这个频道会有的总观看
的次数。
将函数写成:
y = b + wx 1
其中, y 是准备要预测的东西,要预测的是今天( 2 26 日)这个频道总共观看的人, y 就假
设是今天总共的观看次数。 x 1 是这个频道,前一天( 2 25 日)总共的观看次数, y x 1 都
是数值, b w 是未知的参数,它是准备要通过数据去找出来的, w b 是未知的,只是隐
约地猜测。猜测往往来自于对这个问题本质上的了解,即领域知识( domain knowledge)。
带有未知的 参数 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 ,预测未来的
观看次数的函数就变成 y = 500 + x 1 。要从训练数据来进行计算损失,在这个问题里面,训练
数据是这一个频道过去的观看次数。举个例子,从 2017 1 1 日到 2020 12 31 日的
观看次数(此处的数字是随意生成的)如图 1.1 所示,接下来就可以计算损失。
2017 1 1 日的观看次数,代入这一个函数里面:
y ˆ = 500 + 1 x 1
x 1 代入 4800 ,预测隔天实际上的观看
次数结果为 y ˆ = 5300 ,真正的结果是 4900 ,真实的值称为标签( label ),它高估了这个频道
可能的点击次数,可以计算一下估测的值 y ˆ 跟真实值 y 的差距 e 。计算差距其实不只一种方
式,比如取绝对值:
e 1 = | y y ˆ | = 400
我们可以算过这 3 年来,每一天的预测的误差,这 3 年来每一天的误差,通通都可以算
出来,每一天的误差都可以得到 e 。接下来把每一天的误差,通通加起来取得平均,得到损失
L
L=\tfrac{1}{N}\sum_{n}^{}e_{n}
其中, N 代表训验数据的个数,即 3 年来的训练数据,就 365 乘以 3 ,计算出一个 L L 是每一笔训练数据的误差 e 相加以后的结果。 L 越大,代表现在这一组参数越不好, L 越小,代表现在这一组参数越好。
估测的值跟实际的值之间的差距,其实有不同的计算方法,计算 y y ˆ 之间绝对值的差
距,如式 所示,称为 平均绝对误差( Mean Absolute Error MAE
e = | y ˆ y |
如果算 y y ˆ 之间平方的差距,如式 所示,则称为 均方误差( Mean Squared
Error MSE
e= \left ( y'-y^{} \right )^2
有一些任务中 y y ˆ 都是概率分布,这个时候可能会选择 交叉熵( cross entropy ,这
个是机器学习的第 2 步。
可以调整不同的 w 和不同的 b ,求取各种 w 和各种 b ,组合起来以后,我们可以为不同的 w b 的组合,都去计算它的损失,就可以画出等高线图。画出来的等高线图称为 误差表面( error surface
接下来进入机器学习的第 3 步:解一个最优化的问题。找一个 w b ,把未知的参数找一个数值出来,看代哪一个数值进去可以让损失 L 的值最小,就是要找的 w b ,这个可以让损失最小的 w b 称为 w b 代表它们是最好的一组 w b ,可以让损失的值最小。 度下降( gradient descent 是经常会使用优化的方法。为了要简化起见,先假设只有一个未知的参数 w b 是已知的。 w 代不同的数值的时候,就会得到不同的损失,这一条曲线就是误差表面,只是刚才在前一个例子里面,误差表面是 2 维的,这边只有一个参数,所以这个误差表面是 1 维的。
接下来进入机器学习的第 3 步:解一个最优化的问题。找一个 w b ,把未知的参数找
一个数值出来,看代哪一个数值进去可以让损失 L 的值最小,就是要找的 w b ,这个可以让损失最小的 w b 称为 w b 代表它们是最好的一组 w b ,可以让损失的值最小。 度下降( gradient descent 是经常会使用优化的方法。
为了要简化起见,先假设只有一个未知的参数 w b 是已知的。 w 代不同的数值的时候,就会得到不同的损失,这一条曲线就是误差表面,只是刚才在前一个例子里面,误差表面是 2 维的,这边只有一个参数,所以这个误差表面是 1 维的。
怎么样找一个 w 让损失的值最小呢 ?
接下来计算 \frac{\partial L}{\partial w}|_{w=w_{0}}^{},在 w 等于 w 0 的时候,参数 w 对损失的微分。
学习率( learning rate η 也会影响步伐大小。学习率是自己设定的,如果 η
大一点,每次参数更新就会量大,学习可能就比较快。如果 η 设小一点,参数更新就很
慢,每次只会改变一点点参数的数值。这种在做机器学习,需要自己设定,不是机器自
己找出来的,称为 超参数( hyperparameter
w 0 往右移一步,新的位置为 w 1 ,这一步的步伐是 η 乘上微分的结果,即:
w_{1}\leftarrow w_{0}- \eta \frac{\partial L}{\partial w}|_{w=w_{0}}^{}
接下来反复进行刚才的操作,计算一下 w 1 微分的结果,再决定现在要把 w 1 移动多少,再移动到 w 2 ,再继续反复做同样的操作,不断地移动 w 的位置,最后会停下来。往往有两种情况会停下来。
梯度下降有一个很大的问题,没有找到真正最好的解,没有找到可以让损失最小的 w
梯度下降有一个很大的问题,没有找到真正最好的解,没有找到可以让损失最小的 w右侧红点这个位置是真的可以让损失最小的地方,称为 全局最小值( global minima ,而 w T 这个地方称为 局部最小值( local minima ,其左右两边都比这个地方的损失还要高一点,但是它不是整个误差表面上面的最低点。
事实上局部最小值是一个假问题,在做梯度下降的时候,真正面对的难题不是局部最小值。
实际上真的用梯度下降,进行一番计算以后,这个是真正的数据,算出来的最好的 w = 0 . 97 , b = 100 ,跟猜测蛮接近的。因为 x 1 的值可能跟 y 很接近,所以这个 w 就设一个接近 1 的值, b 就设一个比较偏小的值。损失 L ( w , b ) 算一下是 480 ,也就是在 2017 2020 年的数据上,如果使用这一个函数, b 代100, w 0.97 ,平均的误差是 480 ,其预测的观看次数误差,大概是 500 人左右。

1.2 线性模型

w b 的值刚才已经找出来的,这组 w b 可以让损失小到 480。接下来使用这个函数预测未来的观看次数。预测从 2021 年开始每一天都拿这个函数去预测次日的观看人次。在 2021 年没有看过的数据上,误差值用 L′ 来表示,它是0.58,所以在有看过的数据上,在训练数据上,误差值是比较小的,在没有看过的数据上,在2021 年的数据上,看起来误差值是比较大的,每一天的平均误差有 580 人左右,600 人左右。
接下来我们观察了真实的数据以后,得到一个结论是,每隔 7 天有一个循环。所以要把前 7 天的观看人次都列入考虑,写了一个新的模型
y=b+\sum_{j=1}^{7}w_{j}x_{j}
其中 xj 代表第 j 天的观看测试,也就是 7 天前的数据,通通乘上不同的权重 wj,加起来,再加上偏置得到预测的结果。使用该模型预测,其在训练数据上的损失是 380,而只考虑 1 天的模型在训练数据上的损失是 480。因为其考虑了 7 天,所以在训练数据上会得到比较低的损失。考虑了比较多的信息,在训练数据上应该要得到更好的、更低的损失。在没有看到的数据上的损失有比较好是 490。只考虑 1 天的误差是 580,考虑 7 天的误差是 490。
这些模型都是把输入的特征 x 乘上一个权重,再加上一个偏置就得到预测的结果,这样的模型称为 线性模型(linear model)

1.2.1 分段线性曲线

线性模型也许过于简单,x1 跟 y 可能中间有比较复杂的关系,线性模型有很大的限制,这一种来自于模型的限制称为模型的偏差,无法模拟真实的情况。所以需要写一个更复杂的、更有灵活性的、有未知参数的函数。红色的曲线可以看作是一个常数再加上一群 Hard Sigmoid 函数。Hard Sigmoid 函数的特性是当输入的值,当 x 轴的值小于某一个阈值(某个定值)的时候,大于另外一个定值阈值的时候,中间有一个斜坡。所以它是先水平的,再斜坡,再水平的。

假设 x 跟 y 的关系非常复杂也没关系,就想办法写一个带有未知数的函数。直接写 HardSigmoid 不是很容易,但是可以用一条曲线来理解它,用 Sigmoid 函数来逼近 Hard Sigmoid

y=c\tfrac{1}{1+e^{-(b+wx_{1})}}

Sigmoid 函数就是 S 型的函数。因为它长得是有点像是 S 型,所以叫它 Sigmoid 函数。

调整这里的 b、w 和 c 可以制造各种不同形状的 Sigmoid 函数,用各种不同形状的 Sigmoid函数去逼近 Hard Sigmoid 函数。如果改 w,就会改变斜率,就会改变斜坡的坡度。如果改了 b,就可以把这一个 Sigmoid 函数左右移动;如果改 c,就可以改变它的高度。所以只要有不同的 w 不同的 b 不同的 c,就可以制造出不同的 Sigmoid 函数,把不同的Sigmoid 函数叠起来以后就可以去逼近各种不同的分段线性函数;分段线性函数可以拿来近似各种不同的连续的函数。

1.2.2 模型变形

其实还可以对模型做更多的变形,不一定要把 Hard Sigmoid 换成 Soft Sigmoid。HardSigmoid 可以看作是两个修正线性单元(Rectified Linear Unit,ReLU)的加总,ReLU 的图像有一个水平的线,走到某个地方有一个转折的点,变成一个斜坡,其对应的公式为

c ∗ max(0, b + wx1)

把两个 ReLU 叠起来就可以变成 Hard 的 Sigmoid,想要用 ReLU,就把 Sigmoid 的地方,换成max(0,b_{i}+w_{ij}x_{j})

2 个 ReLU 才能够合成一个 Hard Sigmoid。要合成 i 个 Hard Sigmoid,需要 i 个 Sigmoid,如果 ReLU 要做到一样的事情,则需要 2i 个 ReLU,因为 2 个 ReLU 合起来才是一个 Hard Sigmoid。因此表示一个 Hard 的 Sigmoid 不是只有一种做法。在机器学习里面,Sigmoid 或 ReLU 称为激活函数(activation function)

Sigmoid 或 ReLU 称为神经元(neuron),很多的神经元称为神经网络(neural network)。人脑中就是有很多神经元,很多神经元串起来就是一个神经网络,跟人脑是一样的。人工智能就是在模拟人脑。神经网络不是新的技术,80、90 年代就已经用过了,后来为了要重振神经网络的雄风,所以需要新的名字。每一排称为一层,称为隐藏层(hiddenlayer),很多的隐藏层就“深”,这套技术称为深度学习。

在训练数据和测试数据上的结果是不一致的,这种情况称为过拟合(overfitting)

深度学习的训练会用到反向传播(BackPropagation,BP),其实它就是比较有效率、算梯度的方法。

1.2.3 机器学习框架

我们会有一堆训练的数据以及测试数据如式所示,测试集就是只有 x 没有 y。

训练集就要拿来训练模型,训练的过程是 3 个步骤。

1. 先写出一个有未知数 θ 的函数,θ 代表一个模型里面所有的未知参数。f_{\theta }(x) 的意思就是函数叫 f_{\theta }(x),输入的特征为 x;

2. 定义损失,损失是一个函数,其输入就是一组参数,去判断这一组参数的好坏;

3. 解一个优化的问题,找一个 θ,该 θ 可以让损失的值越小越好。让损失的值最小的 θ 为θ∗,即

\theta ^{*}=\underset{\theta }{arg}min L

有了 θ∗ 以后,就把它拿来用在测试集上,也就是把 θ∗ 带入这些未知的参数,本来 f_{\theta }(x)里面有一些未知的参数,现在 θ 用 θ∗ 来取代,输入是测试集,输出的结果存起来,上传到Kaggle 就结束了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值