机器学习的基础
通俗的概念:机器学习就是找出一个函数,通过函数让机器帮你解决问题
举个列子来说:
在语音辨识中,你输入一段语音机器可以帮你输出一段文字
在图片识别中,输入一张图片,机器可以输出图片的内容
在alpha go中,通过给出棋盘上黑子和白子的位置,机器输出下一步要落子的位置
几种不同类型的函数
1.regression
假设要找的函数的输出是一个数值,一个标量(scalar),这种机器学习的任务称为回归。举个回归的例子,假设机器要预测未来某一个时间的 PM2.5 的数值。机器要找一个函数 f,其输入是可能是种种跟预测 PM2.5 有关的指数,包括今天的 PM2.5 的数值、平均温度、平均的臭氧浓度等等,输出是明天中午的 PM2.5的数值,找出这个函数的过程就叫regression
2.classification
分类任务要让机器做选择题。人类先准备好一些选项,这些选项称为类别(class),现在要找的函数的输出就是从设定好的选项里面选择一个当作输出,该任务称为分类。举个例子,每个人都有邮箱账户,邮箱账户里面有一个函数,该函数可以检测一封邮件是否为垃圾邮件。分类不一定只有两个选项,也可以有多个选项。
AlphaGo 就是一个分类的问题,如果让机器下围棋,做一个 AlphaGo,给出的选项与棋盘的位置有关。棋盘上有 19 × 19 个位置,机器下围棋其实是一个有 19 × 19 个选项的选择题。机器找一个函数,该函数的输入是棋盘上黑子跟白子的位置,输出就是从 19×19 个选项里面,选出一个正确的选项,从 19 × 19 个可以落子的位置里面,选出下一步应该要落子的位置。
几个比较重要的机器学习里面的关键字:
关键字 | 解释说明 |
---|---|
regression | 中文翻译是回归,类似于数学中学习过的线性回归,根据给出的数值来预测未来的数值 |
classification | 分类,在给出的众多个选项中,选择函数要输出的那个标签。例如:在邮件系统中,他会帮助区分哪些是垃圾邮件,哪些是重要邮件 |
model | 类似于高中阶段学习过的带有未知数的函数,比如在给出一个函数图像,通过函数表达式来描述图像,根据假设出来的函数表达式解决问题 |
(w)weight | 权重,例如y=w*x+b 这个表达式中的w就很类似我们初高中所学过的函数表达式里面的k,成为斜率。斜率是来调整x对y的影响。这里的w也是这个作用,只不过我们现在称它为权重 |
(b)bias | 偏置,和上面的w一样也是曾经学到的y=k*x+b中的b,用来调整函数图像的上下移动 |
lr(学习率) | 更新权重参数的一个人为设定的值,可以修改 |
hyparameters(超参数) | 自己设定的参数,比如lr学习率,就是在训练初期人工给出的随机参数,常取的数值有0.1,0.001等 |
全局最小值 | 全局最小值就是最小值,例如y=x^2这个函数,全局最小值就是整个函数图像中y最低的那个数值 |
局部最小值 | 例如:y=x^3 在x的负半轴,y的最小值是负无穷,在x轴的正半轴,y的最小值是0 |
Loss(损失) | 真实值和预测值之间的差值 |
梯度下降(gredient descent) | 一种优化算法,使得函数的损失最小 |
下面根据李宏毅老师的案例来学习一下我们找出这个函数并不断更新的整个过程
问题简述:机器学习的视频被放到youtub中,需要学习的同学就要去看这个视频,从而产生播放量,那么能不能根据已有的数据预测未来的播放量是我们需要解决的问题
1.首先设一个函数
y=w*x+b
y是需要预测的数值(这里假设为需要预测这个频道今天的观看总次数),x是昨天这个频道的观看总次数
w,b都是未知参数
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 日的观看次数(此处的数字是随意生成的)接下来就可以计算损失。
把 2017 年 1 月 1 日的观看次数,代入这一个函数里面yˆ = 500 + 1x1 可以判断 b = 500,w = 1 ,x1 代入 4800,预测隔天实际上的观看次数结果为 yˆ = 5300,但是真正的结果是 4900,真实的值称为标签(label),它高估了这个频道可能的点击次数
也可以计算一下估测的值 yˆ 跟真实值 y 的差距 e。e1 = |y − yˆ| = 400
我们可以算过这 3 年来,每一天的预测的误差,这 3 年来每一天的误差,通通都可以算出来,每一天的误差都可以得到 e。接下来把每一天的误差,通通加起来取得平均,得到损失L=
N代表训练数据的个数 L越大,那么训练出来的这个参数越不好,L越小训练出来的参数越好
计算误差的其他方法:
估测的值跟实际的值之间的差距,其实有不同的计算方法
计算 y 与 yˆ 之间绝对值的差距,称为平均绝对误差(Mean Absolute Error,MAE)。
e =
计算 y 与 yˆ 之间平方的差距,则称为均方误差(Mean SquaredError,MSE)。
e =
下面我们用一些真实数据来演示一下这个过程:下图是这个频道真实的后台的数据,所计算出来的结果。可以调整不同的 w 和不同的 b,求取各种w 和各种 b,组合起来以后,我们可以为不同的 w 跟 b 的组合,都去计算它的损失,就可以画出如下图所示的等高线图。在这个等高线图上面,越偏红色系,代表计算出来的损失越大,就代表这一组 w 跟 b 越差。如果越偏蓝色系,就代表损失越小,就代表这一组 w 跟 b 越好,拿这一组 w 跟 b,放到函数里面,预测会越精准。假设 w = −0.25, b = −500,这代表这个频道每天看的人越来越少,而且损失这么大,跟真实的情况不太合。如果 w = 0.75, b = 500,估测会比较精准。如果 w 代一个很接近 1 的值,b 带一个小小的值,比如说 100 多,这个时候估测是最精准的,这跟大家的预期可能是比较接近的,就是拿前一天的点击的总次数,去预测隔天的点击的总次数,可能前一天跟隔天的点击的总次数是差不多的,因此 w 设 1,b 设一个小一点的数值,也许估测就会蛮精准的。如下图所示的等高线图,就是试了不同的参数,计算它的损失,画出来的等高线图称为误差表面(error surface)。这是机器学习的第 2 步。
3.优化
解一个最优化的问题。找一个 w 跟 b,把未知的参数找一个数值出来,看代哪一个数值进去可以让损失 L 的值最小,就是要找的 w 跟 b。
梯度下降(gradient descent)是经常会使用优化的方法。
为了要简化起见,先假设只有一个未知的参数 w,b 是已知的。w 代不同的数值的时候,就会得到不同的损失,这一条曲线就是误差表面,只是刚才在前一个例子里面,误差表面是 2 维的,这边只有一个参数,所以这个误差表面是 1 维的。
怎么样找一个 w 让损失的值最小呢?
首先要随机选取一个初始的点 。接下来计算
,在 w 等于
的时候,参数 w 对损失的微分。计算在这一个点,在
这个位置的误差表面的切线斜率,也就是这一条蓝色的虚线,它的斜率,如果这一条虚线的斜率是负的,代表说左边比较高,右边比较低。在这个位置附近,左边比较高,右边比较低。如果左边比较高右边比较低的话,就把 w 的值变大,就可以让损失变小。如果算出来的斜率是正的,就代表左边比较低右边比较高。左边比较低右边比较高,如果左边比较低右边比较高的话,就代表把 w 变小了,w 往左边移,可以让损失的值变小。这个时候就应该把 w 的值变小。我们可以想像说有一个人站在这个地方,他左右环视一下,算微分就是左右环视,它会知道左边比较高还是右边比较高,看哪边比较低,它就往比较低的地方跨出一步。这一步的步伐的大小取决于两件事情:
• 第一件事情是这个地方的斜率,斜率大步伐就跨大一点,斜率小步伐就跨小一点。
• 另外,学习率(learning rate)η 也会影响步伐大小。学习率是自己设定的,如果 η 设大一点,每次参数更新就会量大,学习可能就比较快。如果 η 设小一点,参数更新就很慢,每次只会改变一点点参数的数值。这种在做机器学习,需要自己设定,不是机器自己找出来的,称为超参数(hyperparameter)。
把 w0 往右移一步,新的位置为 w1,这一步的步伐是 η 乘上微分的结果,即:
接下来反复进行刚才的操作,计算一下 w1 微分的结果,再决定现在要把 w1 移动多少,再移动到 w2,再继续反复做同样的操作,不断地移动 w 的位置,最后会停下来。往往有两种情况会停下来。
第一种情况是一开始会设定说,在调整参数的时候,在计算微分的时候,最多计算几次。上限可能会设为 100 万次,参数更新 100 万次后,就不再更新了,更新次数也是一个超参数。
• 还有另外一种理想上的,停下来的可能是,当不断调整参数,调整到一个地方,它的微分的值就是这一项,算出来正好是 0 的时候,如果这一项正好算出来是 0,0 乘上学习率 η 还是 0,所以参数就不会再移动位置。假设是这个理想的情况,把 w0 更新到 w1,再更新到 w2,最后更新到 wT 有点卡,wT 卡住了,也就是算出来这个微分的值是 0 了,参数的位置就不会再更新。