机器学习基本概念简介
Machine Learning 约等于 Looking for a function.
Different types of functions:
Regression: The function outputs a scalar.
Classification: Given options(classes), the function outputs the correct one.
How to find a function? => 预测本频道观看人数的例子
-
Function with Unknown Parameters
猜测 Model : y = b + w x 1 y = b + wx_1 y=b+wx1
y : n o . o f v i e w s o n 2 / 26 y :no. \ of \ views\ on\ 2/26 y:no. of views on 2/26
x 1 : n o . o f v i e w s o n 2 / 25 x_1 : no.\ of \ views\ on\ 2/25 x1:no. of views on 2/25 (feature)
w a n d b a r e u n k o n w n p a r a m e t e r s w h i c h a r e l e a r n e d f r o m d a t a . w\ and\ b\ are\ unkonwn\ parameters\ which\ are\ learned\ from\ data. w and b are unkonwn parameters which are learned from data.
注:w(weight) b(bias) -
Define Loss from Training Data
- Loss is a function of parameters. L(b, w)
- Loss : how good a set of values is.
简而言之,就是当给未知参数 w 和 b 设定一组值以后,这个模型的性能有多好?举个栗子看看
采用 MAE 作为损失函数,定义损失函数为:
L
=
1
N
∑
n
e
n
L = \frac{1}{N} \sum_n e_n
L=N1∑nen
如下图所示为等高线图,越偏红色的 Loss 越大,说明 w 和 b 的取值比较差,预测结果误差比较大;越偏蓝色的 Loss 越小,说明 w 和 b 的取值比较好,预测结果误差比较小。
Error Surface: 在试了不同的参数取值后,计算出来不同的 Loss,从而画出来的等高线图叫作 Error Surface.
3. Optimization
w
∗
,
b
∗
=
a
r
g
m
i
n
w
,
b
L
w^* , b^* = argmin_{w,b} L
w∗,b∗=argminw,bL
找到使得 Loss 值最小的 w 和 b,此为最优解
使用的优化方法:梯度下降法(Gradient Descent)
此时的 Loss 为只有一个参数 w 的情况
- w 随机设置一个初始值
- 计算
w
=
w
0
w = w^0
w=w0 时 w 对 L 的微分,即切线的斜率
然后更新参数,即 w 1 = ← w 0 − η ∂ L ∂ w ∣ w = w 0 w_1 = \leftarrow w_0 - \eta \frac{\partial L}{\partial w} |_{w=w_0} w1=←w0−η∂w∂L∣w=w0
当斜率小于 0 时,左边高右边低,w 往右边移动可以让 Loss 变大,即 increase w
当斜率大于 0 时,左边低右边高,w 往左边移动可以让 Loss 变小,即 decrease w
那么移动的步伐有多大呢?取决于两个因素:斜率的大小和 η \eta η 的大小。
η \eta η 是 learning rate, 为 hyperparameter, 需要人工设定 - Update w iteratively
如此循环往复,直到停下来,那么会迭代更新参数多少次呢?
- 人为设置更新次数,此为 hyperparameter,例如 10000 次
- w 对 L 的微分为0,参数不再更新,便会停下来
在 w = w T w = w^T w=wT 时,切线的斜率为 0,w 不再更新,便会停下来,但此时 w T w^T wT 这个点不是使得 Loss 最小的那个点,此时的 Loss 值为 Local minima,其实真正的让 Loss 最小的那个点在 global minima 对应的 w 处。
我们先暂时相信 Gradient Descent 有 Local minima 的问题,但其实真正的痛点不是这个,继续往下研究
此时的 Loss 为有两个参数 w,b 的情况
- w 和 b 随机设置一个初始值
- 计算微分,然后更新参数
w 1 = ← w 0 − η ∂ L ∂ w ∣ w = w 0 w_1 = \leftarrow w_0 - \eta \frac{\partial L}{\partial w} |_{w=w_0} w1=←w0−η∂w∂L∣w=w0
b 1 = ← b 0 − η ∂ L ∂ b ∣ b = b 0 b_1 = \leftarrow b_0 - \eta \frac{\partial L}{\partial b} |_{b=b_0} b1=←b0−η∂b∂L∣b=b0 - Update w and b iteratively
在程序中,求解微分只需要一行代码就可以搞定
在等高线图中,参数的位置又是如何移动的呢?
随便在某个位置选定 Loss 的初始值,计算 w 对 L 的微分、b 对 L 的微分,参数更新的方向为 ( − η ∂ L ∂ w , − η ∂ L ∂ b ) (-\eta \frac{\partial L}{\partial w}, -\eta \frac{\partial L}{\partial b}) (−η∂w∂L,−η∂b∂L),如此这样,一直移动下去,在方向向量等于 0 向量时停下来,期待找到一种不错的 w 和 b
其实在训练模型的过程也就是这三步,最后在 w = 0.97,b = 0.1k 时 Loss 最小,为 0.48 k,所以在 2017 - 2020 年的资料上训练后得到的模型为 y = 0.1 k + 0.97 x 1 y = 0.1k + 0.97x_1 y=0.1k+0.97x1
训练模型结束后,拿 2021 年的资料(即模型没有“看见”过的资料)去预测结果,并计算 Loss,得到 L ′ = 0.58 k L^{\prime} = 0.58k L′=0.58k
分析一下结果:红色代表真实的观看人数,蓝色代表模型预测的观看人数,对比红蓝两条曲线,不难发现,红色曲线往右平移一段距离也就是蓝色曲线,所以这个模型基本上就是拿前天的观看人数来预测隔天的观看人数。
每 7 天内有 2 天的观看人数比较低,是因为这两天是周五、六。
这个模型不是很好,有什么办法可以改进呢?
现在我们用前 7 天的资料来预测观看人数,修改模型
再用前 28天、56天的资料来分别预测观看人数,修改模型
上述模型均为 Linear models
Linear models are too simple. We need more sophisticated models.
蓝色的直线代表 linear models,y 随
x
1
x_1
x1 的增大而增大,即频道的每日观看人数只会越来越多,但现实生活中的情况并没有那么简单,有起有伏。
图中的红色的分段曲线更接近于现实生活中的情况,但 linear models 并不能表示出这种情况,这是 linear models 的限制,适用的情形比较单一,这种限制称为 model bias.
因此,我们需要更加 flexible 的模型。
既然红色曲线更加趋近于现实生活中的情况,那么该如何表示它呢?
从下图中的红色曲线可以看出,其实红色曲线是由常数项 + 一堆蓝 fun(function)得来。
类似于红色曲线的还有很多,它们都叫 piece-wise linear curve
红色曲线的转折点越多,代表所需要的蓝 fun 也就越多。
如果遇到的红色曲线类似于下图所示的曲线,变得更加的平滑,已不再是分段线性曲线了,那我们又该如何表示呢?
我们可以用一个分段线性曲线近似地逼近连续曲线。
为了有更好地近似逼近于连续曲线,所需要的蓝 fun 也就越多。
那么,我们又该如何表示蓝 fun 呢?如何把它写出来呢?
我们用 sigmoid function 来逼近蓝 fun
sigmoid function:
y
=
c
1
1
+
e
−
(
b
+
w
x
1
)
=
c
s
i
g
m
o
i
d
(
b
+
w
x
1
)
y = c \ \frac{1}{1+e^{-(b+wx_1)}} = c\ sigmoid(b+wx_1)
y=c 1+e−(b+wx1)1=c sigmoid(b+wx1), 简单地理解为 s 型的 function
当 x 趋向于无穷大时,exponential 就会消失,y 就会趋近于常数 c;
当 x 趋向于无穷小时,exponential 就会很大,y 就会趋近于 0.
只要调整 w, b, c,取不同的值,就可以得到不同的 sigmoid function,然后就可以用不同的 sigmoid function 去逼近蓝 fun
蓝 fun 我们已经会表示了,现在我们可以把红色曲线给表示出来
y
=
b
+
∑
i
c
i
s
i
g
m
o
i
d
(
b
i
+
w
i
x
1
)
y=b+\sum_i c_i \ sigmoid(b_i+w_ix_1)
y=b+∑ici sigmoid(bi+wix1)
我们给 w, b, c 不同的取值,就可以获得不同的蓝 fun,然后蓝 fun 迭加起来就可以得到不同的 red curve,就可以得到不同的 piece-wise linear curve,最后就可以用 piece-wise linear curve 来逼近不同的 continuous curve.
模型已由最开始的 linear model,变成了更加 flexible 的model,可以表示多种情况,现在我们要把模型变成带有更多 feature 的 model.
y
=
b
+
∑
i
c
i
s
i
g
m
o
i
d
(
b
i
+
∑
j
w
i
j
x
j
)
y=b+\sum_i c_i sigmoid(b_i+\sum_j w_{ij}x_j)
y=b+∑icisigmoid(bi+∑jwijxj)
举个栗子,有 3 个 feature,有 3 个 sigmoid
把蓝色方框里面的部分转化成线性代数常用的表示形式:向量形式
σ
\sigma
σ 可以表示 activation function,这里使用 sigmoid 函数,把向量 r 代入
σ
\sigma
σ 函数得到的结果,简记为向量 a
模型可以表示为向量 a 与 向量 c 的 transpose 相乘后,再加上 b
模型用矩阵向量相乘可以表示为如下图所示的形式
现在已经得到了比较复杂的 model,我们来重新训练模型
- Function with unknown parameters 把所有的未知参数拼接成一个列向量
θ
\theta
θ
- Define loss from training data
- Optimization
实际上,把 N 笔资料分成若干份 B 笔资料,拿一个 batch 算出 gradient,然后更新参数,每一次更新参数为一次 update,每一次看完所有的 batch 为一个 epoch.
模型训练了一个 epoch,但要想知道参数 update 了几次,取决于 batch 的大小。
是否也可以把模型定义成其他形式呢?
我们可以使用 ReLU 函数来代替 Sigmoid 函数
ReLU: rectified linear unit 被纠正了的线性单元 y = c m a x ( 0 , b + w x 1 ) y = c\ max(0,b+wx_1) y=c max(0,b+wx1)
如果 b + w x 1 b+wx_1 b+wx1 的值小于 0,输出为 0;反之,输出 b + w x 1 b + wx_1 b+wx1
把两个 ReLU 叠起来,就可以得到一个 Hard Sigmoid
从实验结果可以看出,越来越多的 ReLU 可以使得模型的 training loss 与 testing loss 变小。
所得的模型结果仍旧不太理想,继续改模型
我们把第一次通过激活函数输出的向量 a 再次代入激活函数得到 a ′ a^{\prime} a′,即又加了一个 hidden layer
从实验结果可以看出,在输入层之后加入更多的隐藏层,可以使得模型的 training loss 与 testing loss 更小。
此时,我们需要给模型起一个好的名字,叫做 Neural Network,其里面的一个个 activation function 也就叫做 Neuron,一排 Neurons 就叫做 hidden layer.
而模型中有许多个 hidden layers 就意味着这个模型 very deep. → \rightarrow → deep learning
因此,回顾前面讲的这么多,只要有了足够多排的 ReLU、Sigmoid,我们就可以将 linear model 逼近任意复杂的 piece-wise function 和 continuous function.
我们抛出一个疑问:Why we want “deep” network, not “fat” network?
后面继续再讨论。
如果我们把模型加到 4 层,trainging loss 变小了,testing loss 反而变大了,这其实是一种 overfitting 现象,即 Better on training data, worse on unseen data.
如果是要挑选一个模型用来预测今天的观看人数,当然是选用 3 层的模型啦。
至于模型选择的问题,后面会再继续讲解。