机器学习的定义及应用
机器学习(Machine Learning,ML)本质上即是使机器能够对输入产生一个所需的输出。我们通过建立一个复杂的函数关系式,使这种输入能够对应到所需的输出,并通过大量数据的检验,不断修正该函式,使其所输出的结果能够更加精确,贴近实际的结果。
值得注意的是,这种输入类型广泛,它可以是数据,图片,视频等各类型式,这使得机器学习的应用范围相当广泛,从而具有极大价值与潜力。
例如:
可以通过对某频道以往各期视频观看人数的统计与学习,预测下一个该频道视频的观看人数;
AlphaGo通过对大量棋谱的学习,能够拥有击败世界冠军的能力;
盘古模型可以通过对以往天气气候变化数据的学习,预测未来的天气变化;
以上体现了机器学习的极大开发潜力与在实际生活中的应用价值。
常见的两种机器学习类别
一、回归(regression)
随着所需函数的不同,机器学习的类别也有所不同。假设某一函数所需输出的结果是一个数值,一个标量(scalar),那么这种机器学习的任务称为回归(regression)。例如,假设机器要预测未来某一个时间的 PM2.5 的数值。机器要找一个函数 f,其输入是可能是种种跟预测 PM2.5 有关的指数,包括今天的 PM2.5 的数值、平均温度、平均的臭氧浓度等等,输出是明天中午的 PM2.5的数值,找这个函数的任务称为回归(regression)。
二、分类(classification)
分类任务要让机器做选择题。人类先准备好一些选项,这些选项称为类别(class),现在要找的函数的输出就是从设定好的选项里面选择一个当作输出,该任务称为分类。例如,每个人都有邮箱账户,该邮箱账户里的所有邮件即为类别(class),现在机器要使用一个函数,该函数可以检测一封邮件是否为垃圾邮件,检测邮件是否为垃圾邮件的的行为即为分类(classification)。分类不一定只有两个选项,也可以有多个选项。
三、结构化学习(structured learning)
机器不只是要做选择题或输出一个数字,而是产生一个有结构的物体,比如让机器画一张图,写一篇文章。这种叫机器产生有结构的东西的问题称为结构化学习。如Midjourney生成图片。
案例学习:机器学习的步骤
接下来,我们通过李宏毅老师的一个案例来理解机器学习的运作过程
假设有人想要通过视频平台赚钱,他将会在意频道的流量,这样他才能预测他的获利。假设后台可以看到很多相关的信息,例如:每天点赞的人数、订阅人数、观看次数。根据一个频道过往所有的信息可以预测明天的观看次数来确定一个函数,该函数的输入是后台的信息,输出是隔天这个频道会有的总观看的次数。
机器学习找函数的过程,分成 3 个步骤。
第1个步骤
定义一个有未知参数的函数 f,例如:
其中,y 是被预测的对像,即为输出,如果我们要预测的是2 月 26 日这个频道总共观看的人,y 就假设是2月26日总共的观看次数。x1 是这个频道,2 月 25 日总共的观看次数,x1是自变量,y是因变量,b 跟 w 是未知的参数,需要通过大量数据来猜测。将 2 月 25 号的观看次数,乘上一个数值,再加上一个 b 作为修正,将以此方式得出的数值当作是对于 2 月 26 日,观看次数的预测。需要注意的是,这仅仅是一个猜测,我们需要通过反复的验证对它进行修正。带有未知的参数(parameter)的函数称为模型(model)。特征(feature) x1 是这个函数里面已知的。而 w 跟 b 是未知的,参数w 称为权重(weight),b 称为偏置(bias)。
第2个步骤
定义损失(loss),损失也是一个函数,这个函数用来衡量预测结果与实际结果的偏差,损失越小,则假设的模型越优秀。
若模型是 y = b + w ∗ x1,而 b 跟 w 是未知的,损失是函数 L(b, w),其输入是模型参数 b 跟w。假设未知的参数的设定是 b = 500,w = 1,该函数就变成 y = 500 + x1。在这个问题里,采用这一个频道过去的观看次数作为训练数据。例如,从 2017 年 1 月 1 日到 2020 年 12 月 31 日的观看次数(此处的数字是随意生成的)如图 1.1 所示,接下来就可以计算损失。
把 2017 年 1 月 1 日的观看次数,代入函数中。可以判断 b = 500,w = 1 的时候,这个模型的优劣。x1 代入 4800,预测隔天实际上的观看次数结果为 yˆ = 5300,真正的结果是 4900,真实的值称为标签(label),它高估了这个频道可能的点击次数,由此可以计算估测的值 yˆ 跟真实值 y 的差距 e,通过取绝对值的方法,我们得出:
通过代入不同日期的数据,重复上述操作,我们可以得到数个差距e。将所有差距e相加并且取平均值就可以得到损失L。
估测的值跟实际的值之间的差距,其实有不同的计算方法
计算 y 与 yˆ 之间绝对值的差距,如式 (1.6) 所示,称为平均绝对误差(Mean Absolute Error,MAE)。
计算 y 与 yˆ 之间平方的差距,如式 (1.7) 所示,则称为均方误差(Mean SquaredError,MSE)。
有一些任务中 y 和 yˆ 都是概率分布,这个时候可能会选择交叉熵(cross entropy)。通过一组数据,根据计算结果,不断调整w与b的值,即可得到一个等高线图,称为误差表面(error surface)。如图所示,在这个误差表面上面,越偏红色系,代表计算出来的损失越大,就代表这一组 w 跟 b 越差。如果越偏蓝色系,就代表损失越小,就代表这一组 w 跟 b 越好,拿这一组 w 跟 b,放到函数里面,预测会越精准。
第3个步骤
寻找一个 w 跟 b,使得损失 L 的值最小。这个 w 跟 b 称为 w∗ 跟 b∗ 。
在上图中,我们注意到,损失L的值是有负值的。然而,如果根据刚才损失的定义,它不可能是负的。实际上,这里的损失实际上是损失函数,损失函数是自己定义的。例如设置一个损失函数为L=|yˆ-y|-100,其可能就是负值。这个曲线并不是一个真实的损失,并不是一个真实任务的误差表面,因此这个损失的曲线可以是任何形状。
我们可以使用梯度下降(gradient descent)进行优化,假设只有一个未知的参数 w,而b 是已知的。w 代不同的数值的时候,就会得到不同的损失,这一条曲线就是误差表面,现在需要寻找一个w的值使得损失L最小。如图所示,首先要随机选取一个初始的点 w0。接下来计算在 w 等于 w0 的时候,参数 w 对损失L的微分。计算在这一个点,在 w0 这个位置的误差表面的切线斜率,也就是这一条蓝色的虚线的斜率。如果这一条虚线的斜率是负的,将w的值变大,就可以让损失变小。如果算出来的斜率是正的,将w的值变小,可以让损失的值变小。这个时候就应该把 w 的值变小。w调整的幅度取决于两个因素:
• 第一,选取点处的斜率,斜率大幅度就大一点,斜率小幅度就小一点。
• 第二,学习率(learning rate)η 也会影响幅度大小。学习率是自己设定的,如果 η 较大,单次学习的参数更新量大,总学习进展可能就比较快。如果 η 设小一点,单词学习参数的更新幅度小,学习进展可能就慢。这种在机器学习中,需要自己设定的,称为超参数(hyperparameter)。
接下来把,将 w0 往右移,新的位置为 w1,这一步的步伐是 η 乘上微分的结果,即:
如图:
接下来反复进行刚才的操作,不断地移动 w 的位置,最后会停下来。往往有两种情况会停下来:
• 第一种情况是达到了人为设置的参数更新次数上限
• 第二种情况是当参数调整到一个地方,它的微分的值就是这一项,算出来正好是 0 的时候,如果这一项正好算出来是 0。因为0 乘上学习率 η 还是 0,所以参数就不会再移动位置,这是一种理想的情况。
然而,梯度下降有一个很大的问题,没有找到真正最好的解,没有找到可以让损失最小的 w。
再上图中,把 w 设定在最右侧红点附近这个地方可以让损失最小。但如果在梯度下降中,w0 是随机初始的位置,也很有可能走到 wT 这里,训练就停住了,无法再移动 w 的位置。右侧红点这个位置称为全局最小值(global minima),而 wT 这个位置称为局部最小值(local minima),其左右两边都比这个地方的损失还要高一点,但是它不是整个误差表面上面的最低点。
因此有人认为这个方法会有局部最小值的问题,无法真的找到全局最小值。实际上局部最小值是一个假问题,在做梯度下降的时候,真正面对的难题不是局部最小值。有两个参数的情况下使用梯度下降,其实跟一个参数没有什么不同。如果一个参数没有问题的话,可以很快的推广到两个参数。
假设有两个参数,随机初始值为 w0, b0。要计算 w, b 跟损失的微分,计算在 w = w0 的位置,b = b0 的位置,要计算 w 对 L 的微分,计算 b 对 L 的微分
结果如图所示:
参考文献:《深度学习详解 李宏毅机器学习课程》