文中的例子及大部分图片来自立石贤吾《白话机器学习的数学》。
一、几个基本概念
机器学习的一种分类方法:回归,分类,聚类。
从下面的图应该能够大致理解三个概念的区别:
用文字描述一下:
回归(regression)
就是在处理连续数据,如时间序列数据时使用的技术。
分类(classification)鉴别垃圾邮件就可以归类为分类问题。只有两个类别的问题称为二分类,有三个及以上的问题称为多分类,比如数字的识别就属于多分类问题。
聚类(clustering)聚类与分类相似,与分类的区别在于数据带不带标签。也有人把标签称为正确答案数据。
还有一种分类:
有监督学习:使用有标签的数据进行学习,回归,分类属于有监督学习。
无监督学习:使用没有标签的学习,聚类属于无标签学习。
再给一个机器学习的概念:
机器学习是从数据中进行学习,然后给出预测值的过程。
二、最小二乘法
举例说明:
假如下图表示一个网站的点击量与投入广告费的关系,图中标出来的点表示已经通过实践得到的数据,那么如何通过这些数据预测在投入广告费在某一值时的点击量呢?
选择通过一次函数进行模拟:
将训练数据中的广告费代入fθ(x),把得到的模拟点击量与训练数据中实际的点击量相比较,然后找出使二者的差最小的θ。
先假设θ0=1, θ1=2。对比如下:
显然,随便确定的参数计算的值与实际的值存在偏差,这很正常。
理想的情况就是二者一致,也就是y=fθ(x),即y-fθ(x)=0,这是最理想的情况,但再绝大多数情况下,这是不可能的,但是应该让所有点的误差之和尽可能地小。
假设有n个训练数据,那么它们的误差之和可以用下面的表达式表示,你可能在物理实验课上见过类似的式子,只不过把fθ(x)换成了测量数据的平均值,它能够在一定程度上表示出测试数据的准确度。在这里,这个表达式被称为目标函数,E(θ)的E是误差的英语单词Error的首字母。
i不是i次幂的意思,而是指第i个训练数据。此处的1/2是为了使后面的计算更加简单而加的,这不会影响求取最小值的位置。
这里要注意的是,我们的目的并不是要找到E(θ)的最小值,而是找到当E(θ)有最小值的时候,θ0和θ1的值是多少,这样的问题称为最优化问题。
之所以不用绝对值,而用平方是因为之后要对目标函数进行微分,比起绝对值,平方的微分更加简单。
具体算一下:
结果比较大,而我们的目的就是找到让这个值尽量的小的时候,两个θ的值。这种方法叫做最小二乘法。
三、梯度下降法
微分是计算变化的快慢程度时通常使用的方法,复习微分的增减表就会发现:
只要向与导数的符号相反的方向移动x,g(x)就会朝向最小值的方向变化。
导数为正,则是增函数,为了找到最小值的位置,则应该朝负方向变化;
导数为负,则是减函数,为了找到最小值的位置,则应该朝正方向变化;
这种方法被称为最速下降法或梯度下降法。
下面的式子被称为更新表达式,通过这个式子就可以逐渐逼近所寻找的值。
A:=B的意思是通过B来定义A。这里的意思就是用旧的x定义新的x,依次迭代,逐步找到最优值。
对于上面表达式的理解,关键点是:不要考虑微分的值,而只取其符号,值的大小交给η来决定。这样新的x就可以通过旧的x移动来得到,然后再依次迭代,从而得到一个接近最小值的x。后面的学习发现,每个求解的更新表达式都是上面的这种形式。
η被称为学习率,始终是正的常数。根据学习率的大小,到达最小值的更新次数也会发生变化。换种说法就是收敛速度会不同。有时候甚至会出现完全无法收敛,一直发散的情况。
假如有g(x) = (x-1)^2的函数,带入上面的式子,令η=1,从x=3开始,那么x会如何变化呢?
逐次迭代,得到的,但看到结果会陷入死循环:
设η=0.1,同样从x=3开始:
现在就比较慢,但是能很好的说明,它是如何一步步逼近最小值的。但是它会越过最小值而继续往左移动吗?从上面的分析来看是不会的,因为一旦左移超过最低点的时候,微分符号就会反过来,而让它朝右移动。
总之,如果η较大,那么x:=x-η(2x-2)会在两个值上跳来跳去,甚至有可能远离最小值。这就是发散状态。而当η较小时,移动量也变小,更新次数就会增加,但是值确实是会朝着收敛的方向而去。
现在回过头来看之前的表达式。
fθ(x)拥有θ0和θ1两个参数。也就是说这个目标函数是拥有θ0和θ1的双变量函数,所以要用偏微分。如此一来,更新表达式就是这样的。
设:
则:
那么:
再计算v对θ0进行微分:
合在一起:
同样的道理,对θ1进行微分:
合在一起:
所以参数θ0和θ1的更新表达式就是这样的:
四、多项式回归
把fθ(x)定义为二次函数,更能拟合上面讲述的例子。
当然也可以用更高次数的函数:
这样就能更好的拟合图中的数据点,但是显然也会更加复杂,并且也可能会出现过拟合的问题,也就是说所有已知的点都能很好的被求得的函数表达,但是新的点就可能落在函数之外,由于对已知的点太过精确,导致一些实际问题中本应该被忽视的误差或波动也都被包含进了函数中,反而导致函数不能很好的描述实际的问题。
对于要解决的问题,在找出最合适的表达式之前,需要不断地去尝试
u对v微分的部分应该是一样的,并且对θ0,θ1的微分也是一样的。所以只需求v对θ2的微分就行了:
最终得到的更新表达式如下:
像这样增加函数中多项式的次数,然后再使用函数的分析方法被称为多项式回归。
五、多重回归
实际中要解决的很多问题是变量超过2个的复杂问题。
那么就可以用下面的表达式来表示,注意元和次的变化,这里是多元函数,而上面的多项式回归是高次的函数。但系数同样会增多。
分别求目标函数对θ0, ···, θ3的偏微分,然后更新参数就可以了。
更加通用的形式:
用向量的形式:
做一些调整:
再调整:
把θ转置之后,计算一下它与x相乘的结果
之前用多项式表示的fθ,可以像这样用向量来表示。虽然我们说的是向量,但实际在编程时只需用普通的一维数组就可以了。
设u=E(θ)、v=fθ(x)的部分是一样的。为了一般化,可以考虑对第j个元素θj偏微分的表达式。
第j个参数的更新表达式就是这样的。
包含了多个变量的回归称为多重回归,计算量大、计算时间长是最速下降法的一个缺点,那么有没有更好的方法呢?
六、随机梯度下降法
最速下降法除了计算花时间以外,还有一个缺点,那就是容易陷入局部最优解。
用最速下降法来找函数的最小值时,必须先要决定从哪个x开始找起。在前面的例子中,用g(x)说明的时候,我们是从x=3或者x=-1开始的。那是随机选的两个x值。
选用随机数作为初始值的情况比较多。不过这样每次初始值都会变,进而导致陷入局部最优解的问题。这其实就是高数上的极值与最值的问题。
这样可以找到最小值。
这就是陷入局部最优解。
虽然最速下降法很不好用,但是随机梯度下降法就是以最速下降法为基础的。
下面是之前就见到的最速下降法的参数更新表达式:
这个表达式使用了所有训练数据的误差,而在随机梯度下降法中会随机选择一个训练数据,并使用它来更新参数。这个表达式中的k就是被随机选中的数据索引。
此外,随机梯度下降法由于训练数据是随机选择的,更新参数时使用的又是选择数据时的梯度,所以不容易陷入目标函数的局部最优解。
此外还有随机选择m个训练数据来更新参数的做法。
设随机选择m个训练数据的索引的集合为K,那么我们这样来更新参数。
这被称为小批量(mini-batch)梯度下降法。
不管是随机梯度下降法还是小批量梯度下降法,我们都必须考虑学习率η。把η设置为合适的值是很重要的。可以通过反复尝试来找到合适的值