1、什么是机器学习
机器学习 ≈ 让机器帮我们找一个函数f
解决某一问题。
如:
注:
- 本课程重点介绍机器学习(
ML
,Machine Learning
)中的深度学习(DL
,Deep Learning
);
- 本课程主要介绍如何通过神经网络(
NN
,Neural Network
)的方式实现深度学习。
2、机器拟合函数类型
2.1、回归
回归(Regression
):函数的输出是一个标量。
如: 使用机器学习预测PM2.5
。
输入各种与预测PM2.5
相关的指数(如:今天的PM2.5
值、温度和臭氧的浓度等),输出明天的PM2.5
值。
2.2、分类
分类(Classification
):函数从我们事先设定好的一些选项【options
】(又称“类别”,classes
)中选择一个作为输出。
如:
-
使用机器学习进行垃圾邮件筛选。
输入一封邮件,输出是否为垃圾邮件(2个选项)。
2.3、结构化学习
结构化学习(Structured Learning
):函数的输出是有结构的部件(如:图像、文本、语音等)。
3、★机器拟合线性函数(3步曲)
例: 我们想使用B
站后台历史数据(如:视频的观看人数、观看时长、点赞数、搜藏数、投币数、视频收益等)拟合一个函数,用于预测明天该视频可能的播放量。
通过机器学习找到拟合函数的步骤主要包括以下3个:
3.1、定义一个带有未知参数的函数模型(单变量线性回归模型)
第一步需要先定义一个带有未知参数的函数。
通过领域知识,我们猜测该视频明天的播放量与今天播放量的关系可能为:
y=b+ωx1
其中:y是视频明天播放量的预测值;x1是视频今天的播放量(即:特征,feature
);ω(权重,weight
)和b(偏差,bias
)是从历史数据中学习到的未知参数。
3.2、定义训练数据的损失函数
第二步主要定义一个损失函数(Loss
)。
注:
-
损失函数是计算预测值和真实值之间差距的函数。
-
损失函数也是一个函数,其输入为机器学习模型的未知参数,输出表示当前模型输入未知参数值的好坏。
-
损失函数的自变量是机器学习函数模型中的未知参数ω(权重)和b(偏差),即损失函数可以表示为:L(b,ω)。
-
损失函数的输出可以反映出:函数模型中未知参数ω(权重)和b(偏差)取值的好坏,输出越小越好。
(1)令预测误差:
e=(y−y^)2=[(b+ωx1)−y^]2
其中:y是预测值,y^是实际值。
注: 实际应用中,预测误差e
的计算方法可以是:
- 平均绝对误差(
mean absolute error
,MAE
):e=∣y−y^∣
- 均方误差(
mean square error
,MSE
): e=(y−y^)2或 e=21(y−y^)2(其中21是为了方便求导)
- 当y和y^都符合概率分布时,我们可以选择使用交叉熵(
Cross-entropy
)损失函数。
(2)则损失函数:
L=N1i=1∑Nei=N1i=1∑N[(b+ωx1i)−yi^]2
其中:N是训练样本的数量,x1i是第i个训练样本的输入值,yi^是第i个训练样本的实际输出值。
调整机器学习函数模型中的未知参数ω(权重)和b(偏差)的值,可以得到不同的损失函数值,再画出等高线即可得到预测模型的误差曲面(Error Surface
)。
上述B
站视频播放量预测模型的误差曲面如下图所示:
其中:若损失函数L(b,ω)的值越大,则红色越深(ω和b的取值约差);若损失函数L(b,ω)的值越小,则蓝色越深(ω和b的取值约好)。
如: 令预测误差:e=∣y−y^∣,则当ω=1、b=0.5k时,拟合函数为:y=0.5k+1x1,损失函数为:L(0.5k,1)。
此时,使用2017/01/01
的访问量预测2017/01/02
的访问量,预测误差:
e1=∣y−y^∣=∣(0.5k+4.8k)−4.9k∣=∣5.3k−4.9k∣=0.4k
使用2017/01/02
的访问量预测2017/01/03
的访问量,预测误差:
e2=∣y−y^∣=∣(0.5k+4.9k)−7.5k∣=∣5.4k−7.5k∣=2.1k
以此类推,我们可以得到每天的预测误差ei。
3.3、最优化
第三步要做的事情,其实是解一个最优化(Optimization
)的问题。即:找一对最佳的ω(权重)和b(偏差)使损失函数的值最小。
取反函数,可得:
ω∗,b∗=arg(ω,bminL)
其中:ω∗是最合适的权重值;b∗是最合适的偏差值。
3.3.1、使用梯度下降法求最佳权重
本课程求解最佳ω和b的唯一方法是:梯度下降法(Gradient Descent
)。
使用梯度下降法求解最佳ω(权重)的步骤如下:
(1)随机选取一个初始的权重值ω0;
(2)计算所有训练样本的损失函数L(b,ω);
为了求最佳的ω,我们可以把b看做常量。此时,损失函数L(b,ω)和ω(权重)的关系如下图所示:
(3)使用所有的训练样本,计算ω=ω0处损失函数的梯度值:
∂ω∂L∣ω=ω0=∂ω∂N1i=1∑N[(b+ωx1i)−yi^]2∣ω=ω0=N2i=1∑N[(b+ωx1i)−yi^]x1i∣ω=ω0
其中:N是训练样本的数量,x1i是第i个训练样本的输入值,yi^是第i个训练样本的实际输出值。
- 若ω=ω0处损失函数L对ω的偏导数<0,则增加ω的值;
- 若ω=ω0处损失函数L对ω的偏导数>0,则减小ω的值。
注: 若ω=ω0处偏导数(即:斜率)的绝对值越大(或越小),则ω的值增加或减小的越大(或越小)。
(4)设置学习效率,计算ω(权重)的调整步长;
此时,ω(权重)的调整步长为:
η×∂ω∂L∣ω=ω0
其中:η是学习效率(learning rate
),用户可以自定义该参数。
注:像η这样需要人手工设置的参数又叫做超参数(hyperparameters
)。
(5)迭代更新ω(权重)的值。
此时,ω(权重)的值由ω0调整为ω1。
ω1=ω0−η×∂ω∂L∣ω=ω0
不断重复步骤(3)到步骤(5),直到迭代次数达到用户自定义的迭代次数上限(或∂ω∂L∣ω=ωi=0)时停止迭代。
注:当使用梯度下降优化机器学习模型的未知参数时,可能会出现局部最小(local minima
)不是全局最小(global minima
)的情况。但该问题其实并不是深度学习过程中面临的痛点问题,因为当预测误差e
取均方误差时,损失函数L(b,ω)是ω的二次函数,此时损失函数是一个抛物线,此时通过梯度下降法得到的最优值一定是全局最优值。
3.3.2、使用梯度下降法求最佳偏差
同样地,我们可以使用梯度下降法求解最佳的b(偏差)。
3.3.3、★小结(梯度下降法)
综上所述: 使用梯度下降法求解两个未知参数(ω和b)最佳值的步骤是:
(1)随机选取一个初始的权重值ω0和偏差值b0;
(2)计算所有训练样本的损失函数L(b,ω);
L(b,ω)=N1i=1∑Nei=N1i=1∑N[(b+ωx1i)−yi^]2
其中:N是训练样本的数量,x1i是第i个训练样本的输入值,yi^是第i个训练样本的实际输出值。
(3)使用所有的训练样本,分别计算ω=ω0,b=b0处损失函数L对各个未知参数的的梯度值;
∂ω∂L∣ω=ω0,b=b0=∂ω∂N1i=1∑N[(b+ωx1i)−yi^]2∣ω=ω0,b=b0=N2i=1∑N[(b+ωx1i)−yi^]x1i∣ω=ω0,b=b0
∂b∂L∣ω=ω0,b=b0=∂b∂N1i=1∑N[(b+ωx1i)−yi^]2∣ω=ω0,b=b0=N2i=1∑N[(b+ωx1i)−yi^]∣ω=ω0,b=b0
其中:N是训练样本的数量,x1i是第i个训练样本的输入值,yi^是第i个训练样本的实际输出值。
注:未知参数在某一处的损失函数值的梯度值是通过训练样本计算得到的。
(4)设置学习效率,分别计算各个未知参数的调整步长;
η×∂ω∂L∣ω=ω0,b=b0
以此类推,梯度下降法可以推广到求解多个未知参数最佳值。
η×∂b∂L∣ω=ω0,b=b0
(5)迭代更新各个未知参数的值。
ω1=ω0−η×∂ω∂L∣ω=ω0,b=b0
b1=b0−η×∂b∂L∣ω=ω0,b=b0
不断重复步骤(3)到步骤(5),直到迭代次数达到用户自定义的迭代次数上限(或∂ω∂L∣ω=ωi,b=bi=0,∂b∂L∣ω=ωi,b=bi=0)时停止迭代。
上述步骤在上述B
站视频播放量预测模型的误差曲面上的更新过程如下图所示:
注: 同样地,上述使用梯度下降法求解未知参数最佳值的步骤和方法可以推广到任意多个参数。
3.4、★小结(线性拟合)
综上所述,使用机器学习模型的方法其实很简单,只需要要3步即可。(就像把大象放进冰箱只需分3步一样)
例: 上述B
站视频播放量预测的例子中,我们使用2017–2020
的数据(训练集)对预测模型进行训练,最终得到的最佳权重ω∗=0.97,最佳偏差b∗=0.1k。此时,损失函数达到最小值0.48k,即:L=0.48k。
即:使用此训练集得到的该视频播放量预测模型为:
y=0.1k+0.97x1
其中:y是视频明天播放量的预测值;x1是视频今天的播放量(即:特征,feature
)。
使用该模型对该视频2021
年可能的播放量(测试集),预测损失L′=0.58k。预测结果如下图所示:
附、模型优化:输入多个特征(多变量线性回归)
仔细观察视频播放量曲线,可以发现其呈周期性变化。 因此,为了提高预测的准确性,我们也可以使用最近7天的播放量来预测该视频明天的播放量。此时,我们可以将带有未知参数的预测函数模型修改为:
y=b+j=1∑7ωjxj
其中:y是视频明天播放量的预测值;xj是视频前j天的播放量(即:特征,feature
);j是输入特征的数量。
此时,我们同样使用2017–2020
的数据(训练集)对预测模型进行训练,训练完成后得到的最佳偏差b∗、xj的最佳权重ωj∗如下表所示:
此时,损失函数达到最小值0.38k,即:L=0.38k。
使用新的模型对该视频2021
年可能的播放量(测试集),预测损失L′=0.49k。
那么,是不是使用的历史播放量天数越多,预测模型的准确性越高呢?答案是否定的。
4、★机器学习拟合非线性函数
4.1、定义一个带有未知参数的函数模型
4.1.1、任意连续函数的多Sigmoid函数累加模型
线性函数模型可能太简单了,可能无法满足实际需求。实际应用建模过程中,机器学习往往需要拟合更加复杂的函数。
例: 我们想拟合下图中的红色折线函数y=f(x1)。
实际上,任意折线都可以拆分成:一个常数 + 一系列(Hard Sigmoid
)函数。
如下图所示:
上述红色折线可以拆分为:
同样地,我们也可以把任意函数曲线看做无数个相邻的点连接而成的折线函数。
因此,任意连续函数都可以拆分成:一个常数 + 一系列(Hard Sigmoid
)函数。
实际应用中,我们使用Sigmoid
函数(又称“S形”函数)来逼近(Hard Sigmoid
)函数。
因此,红色折线函数y=f(x1)可以拆分为:
其中:ωi、bi、ci是未知参数;i是Sigmoid
函数的数量。
附:Sigmoid激活函数
激活函数(Activation Function
) 的主要作用是提供神经网络的非线性建模能力。如果没有激活函数,那么神经网络仅能够表达线性映射,此时即便有再多的隐藏层,其整个网络跟单层神经网络也是等价的。因此,只有加入了激活函数之后,深度神经网络才具备了分层的非线性映射学习能力。
Sigmoid函数的表达式为:
y=c×sigmoid(b+ωx1)=c1+e−(b+ωx1)1
其中:ω、b、c是未知参数。
-
若控制其它参数不变,只改变ω的值,则Sigmoid
函数的斜率将发生变化。
-
若控制其它参数不变,只改变b的值,则Sigmoid
函数将会左右移动。
-
若控制其它参数不变,只改变c的值,则Sigmoid
函数的高度将会随之改变。
4.1.2、模型优化:输入多个特征
同样地,为了提高预测的准确性,我们也可以使用多个特征作为带有未知参数函数模型的输入。
- 如上述示例中,线性模型y=b+ωx1可以优化为:
y=b+j=1∑nωjxj
其中:y是视频明天播放量的预测值;xj是视频前j天的播放量(即:特征,feature
);j是输入特征的数量。
即:
所以,同样地:
y=b+i=1∑mci×sigmoid(bi+ωix1)
其中:ωi、bi、ci是未知参数;i是Sigmoid
函数的数量。
优化为:
y=b+i=1∑mci×sigmoid(bi+j=1∑nωijxj)
其中:ωij、bi、ci是未知参数;i是Sigmoid
函数的数量;j是输入特征的数量。
即:
4.1.3、函数模型的图形化和矩阵表示
为了更加直观地理解机器学习,我们可以将上述非线性函数模型:
y=b+i=1∑mci×sigmoid(bi+j=1∑nωijxj)
其中:ωij、bi、ci是未知参数;i是Sigmoid函数的数量;j是输入特征的数量;ωij是第i个Sigmoid函数中第j个特征的权重。
进行图形化表示,具体表示过程如下:
(1)各Sigmoid函数输入的图形化和矩阵表示
首先,令各Sigmoid函数的输入:
ri=bi+j=1∑nωijxj
若我们取前3天的历史数据作为特征输入神经网络,则:
⎩⎨⎧r1=b1+ω11x1+ω12x2+ω13x3r2=b2+ω21x1+ω22x2+ω23x3r3=b3+ω31x1+ω32x2+ω33x3
r=b+Wx
因此,ri的图形化和矩阵表示如下图所示:
(2)各Sigmoid函数输出的图形化和矩阵表示
然后,将各Sigmoid函数的输入ri带入对应的Sigmoid函数。令各Sigmoid函数的输出:
ai=Sigmoid(ri)=1+e−ri1
则:
⎩⎨⎧a1=Sigmoid(r1)a2=Sigmoid(r2)a3=Sigmoid(r3)
用矩阵可以表示为:
a=σ(r)
因此,ai的图形化和矩阵表示如下图所示:
(3)任意连续函数的图形化和矩阵表示
将各Sigmoid函数的输出ai带入任意连续函数的多Sigmoid函数累加模型,便可以得到任意连续函数的机器学习模型。
即任意连续函数的多Sigmoid函数累加模型:
y=b+i=1∑mci×sigmoid(bi+j=1∑nωijxj)
用矩阵可以表示为:
y=b+cTa
因此,机器学习函数模型的图形化和矩阵表示如下图所示:
综上所述:
⎩⎨⎧r=b+Wxa=σ(r)y=b+cTa
即:任意连续函数的多Sigmoid函数累加模型为:
y=b+cTσ(b+Wx)
4.2、定义训练数据的损失函数
4.2.1、多Sigmoid函数累加模型中的未知参数
在上述任意连续函数的多Sigmoid函数累加模型
y=b+cTσ(b+Wx)
中:x是特征向量,W、b、cT和常量b是未知参数。
为了方便计算未知参数的值,我们将W的所有列、向量b、向量c和常量b组合成一个新的未知参数向量θ。如下图所示:
其中:向量θ中的元素分别为θ1、θ2、θ3……
4.2.2、定义损失函数
接下来,我们同样要定义一个损失函数(Loss
)。
注:
-
损失函数是计算预测值和真实值之间差距的函数。
-
损失函数也是一个函数,其输入为机器学习模型的未知参数,输出表示当前模型输入未知参数值的好坏。
-
由于损失函数的自变量是机器学习函数模型中的所有未知参数,因此损失函数可以表示为:L(θ)。
-
损失函数的输出可以反映出:函数模型中所有未知参数θ取值的好坏,输出越小越好。
同样地,令预测误差:
e=(y−y^)2
其中:y是预测值,y^是实际值。
以预测明天视频可能的播放量为例,我们可以得到每天的预测误差ei。
因此,损失函数:
L=N1i=1∑Nei
其中:N是训练样本的数量。
注:当预测误差e
取均方误差时,损失函数L(θ)是所有未知参数θ的二次函数,此时对于任一未知参数而言,损失函数是一个抛物线,此时通过梯度下降法得到的最优值一定是θ的全局最优值。
4.3、多Sigmoid函数累加模型中未知参数的最优化
同样地,第三步要做的事情,其实是解一个最优化(Optimization
)的问题。即:找出多Sigmoid函数累加模型中所有未知参数(即:向量θ中的所有元素θ1、θ2、θ3……)的最佳值使损失函数的值最小。
取反函数,可得:
θ∗=arg(θminL)
其中:θ∗是多Sigmoid函数累加模型中所有未知参数的最佳值。
4.3.1、使用标准梯度下降法迭代优化未知参数
同样地,我们将使用梯度下降法求解多Sigmoid函数累加模型中所有未知参数的最佳值。具体步骤如下:
(1)随机初始化未知参数向量θ0(即:随机选取所有未知参数的初始值);
(2)计算所有训练样本的损失函数L(θ);
(3)使用所有的训练样本,计算θ=θ0处损失函数的梯度值(向量g);
g=∂θ1∂L∣θ=θ0∂θ2∂L∣θ=θ0⋮
又记作:
g=∇L(θ0)
注:未知参数在某一处的损失函数值的梯度值是通过训练样本计算得到的(具体公式推导过程参考3.3.3节)。
(4)设置学习效率η(常量),得到所有未知参数的调整步长向量;
η×g=η∂θ1∂L∣θ=θ0η∂θ2∂L∣θ=θ0⋮
(5)迭代更新未知参数向量的值。
θ11θ21⋮=θ10θ20⋮−η∂θ1∂L∣θ=θ0η∂θ2∂L∣θ=θ0⋮
即:
θ1=θ0−η×g
不断重复步骤(3)到步骤(5),直到迭代次数达到用户自定义的迭代次数上限(或∂θ1∂L∣θ=θi=0,∂θ2∂L∣θ=θi,⋯=0,⋯)时停止迭代。
4.3.2、梯度下降法的种类
(1)标准的梯度下降法(Batch Gradient Descent, BGD
)
标准的梯度下降法(又称“批量梯度下降法”),指的是每次迭代会使用全部的训练样本来计算梯度向量g的值,然后再通过调整步长向量η×g完成对模型未知参数向量θ值的一轮更新。
当拟合线性函数且预测误差e
取均方误差时,预测模型的损失函数曲面及梯度下降过程如下图所示:
该方法的优点:
- 梯度下降的非常平稳。
- 能够确保找到未知参数向量θ的全局最优解,且最优解的精度非常高。
该方法的缺点:
- 它每更新一次都需要遍历整个训练集,训练时间比较长。
- 不适合大数据集。
(2)随机梯度下降法(Stochastic Gradient Descent, SGD
)
所谓随机梯度下降法,指的是每次迭代会从训练集中随机抽取一个样本来计算梯度向量g的值,然后再通过调整步长向量η×g完成对模型未知参数向量θ值的一轮更新。
当拟合线性函数且预测误差e
取均方误差时,预测模型的损失函数曲面及梯度下降过程如下图所示:
该方法的优点:
该方法的缺点:
- 梯度下降不平稳,最优解的精度较低。
- 未知参数向量θ可能不会收敛,而是在最小值附近振荡。
(3)小批量梯度下降法(Mini-Batch Gradient Descent, MBGD
)
小批量梯度下降法(又称“最速下降法”),指的是每次迭代会从训练集中选择一批(batch
)样本来计算梯度向量g的值,然后再通过调整步长向量η×g完成对模型未知参数向量θ值的一轮更新。
当拟合线性函数且预测误差e
取均方误差时,预测模型的损失函数曲面及梯度下降过程如下图所示:
该方法的优点:
- 梯度下降的速度比较快且比较平稳。
- 最优解的精度相对较高。
4.3.3、使用小批量梯度下降法迭代优化未知参数
实际项目中,我们经常使用小批量梯度下降法迭代优化多Sigmoid函数累加模型中所有未知参数。具体步骤如下:
(1)随机初始化未知参数向量θ0(即:随机选取所有未知参数的初始值);
(2)计算所有训练样本的损失函数L(θ);
(3)将N个训练样本随机分为多批(batch
),每一批包含B个训练样本;
(4)使用第1批训练样本,计算θ=θ0处损失函数的梯度值(向量g);
g=∇L1(θ0)
(5)设置学习效率η(常量),得到所有未知参数的调整步长(向量η×g);
(6)迭代更新未知参数向量的值。
θ1=θ0−η×g
不断重复步骤(4)到步骤(6),直到迭代次数达到用户自定义的迭代次数上限(或∂θ1∂L∣θ=θi=0,∂θ2∂L∣θ=θi,⋯=0,⋯)时停止迭代。
注:
- 当所有批次的训练样本都被训练一遍时(即:当所有的训练样本都被训练一遍时),我们称为一轮(
epoch
)训练。
- 小批量梯度下降法在每次迭代中仅使用一批训练样本来计算损失函数和损失函数的梯度。
- 用户可以根据实际应用自定义每一批训练样本的数量(
Batch Size
),一般每次迭代选取的样本数量在50到256个之间,。
如: 对于一个有2000个训练样本的数据集,将2000个样本分成4个大小为500的Batch
。那么:
- 经过一轮(
Epoch
)训练,所有的未知参数都完成了4次更新。
Batch Num
= 每轮更新(update
)次数 = 4。
Batch Size
= 500。
4.4、Sigmoid激活函数的替代方案
机器学习拟合非线性函数模型时使用的激活函数(Hard Sigmoid
),我们除了使用Sigmoid函数来逼近外,也可以使用两个ReLU
(Rectified Linear Unit
,修正线性单元)相加来替代。如下图所示:
即:(Hard Sigmoid
)=cmax(0,b+ωx1)+c′max(0,b′$ x_1)$。
其中:ReLU
函数的表达式为:cmax(0,b+ωx1)。
因此,上述任意连续函数的多Sigmoid函数累加模型也可替换为多ReLU函数累加模型。如下图所示:
注:
- 多Sigmoid函数累加模型中
Sigmoid
激活函数的数量是i;多ReLU函数累加模型中ReLU
激活函数的数量是2i。
- 所谓激活函数,就是在人工神经网络的神经元上运行的函数,负责将神经元的输入映射到输出端。
- Sigmoid函数和ReLU函数都是实际项目中常用的激活函数。
- 实验表明:多ReLU函数累加模型的拟合效果往往比多Sigmoid函数累加模型好一些。
5、★多层神经网络(深度学习)模型
为了进一步优化机器学习模型,我们可以在上述多Sigmoid函数(或ReLU函数)累加模型中嵌套使用多层Sigmoid函数(或ReLU函数)。即:将上一层Sigmoid函数(或ReLU函数)的输出作为下一层Sigmoid函数(或ReLU函数)的输入。如下图所示:
注: 嵌套的次数也是一个超参数(Hyper Parameter
),用户可以自定义。
此时,上述优化后的多Sigmoid函数(或ReLU函数)累加模型的图形化表示如下图所示:
为了让优化后的多Sigmoid函数(或ReLU函数)累加模型听起来高大上,我们给它起了响亮的名字,即:神经网络(Neural Network)。
注:
-
该模型中的Sigmoid(或ReLU)称为神经元(Neuron
) ,多个神经元连起来就是神经网络(Neural Network
)。
-
图中每一层的神经元称为隐藏层(hidden layer
);多个Hidden Layer
就组成了Deep
。由于在上世纪八九十年代,由于吹捧的太过浮夸,人们已经把神经网络的概念炒臭了。因此,大家又给这套技术人们起了一个新的高大上的名字,即:深度学习(Deep Learning
)。
-
深度学习的层数也不能太多,太多会导致Overfitting(过拟合)。即:在训练集上表现的好,但是在测试集上表现差。
(本讲完,系列博文持续更新中…… )
参考文献:
[1] 《机器学习教程2021》,李宏毅
[2] 《机器学习教程2022》,李宏毅
如何获取资料?
关注 “阿汤笔迹” 微信公众号,在后台回复关键词 “机器学习” ,即可获取更多资料。
原文地址:http://www.atangbiji.com/2023/10/22/regression/
博主最新文章在个人博客 http://www.atangbiji.com/ 发布。