最近一段时间关于机器学习、人工智能等话题充斥着各大社区。作为一枚热爱技术的系统工程师,我迫切想去揭开它神秘的面纱。
学习的过程是辛苦的,尤其是在大学数学早就还给老师的情况下。花了一点时间恶补了下线性代数,又看了网上很多优秀的博客,总算小有收获。特此将收获总结归纳,希望大家批评指正!
线性回归
让我们先来搞清楚什么是机器学习吧。
举个具体的的例子。我们现在手上有一些关于房屋价格的数据样本,这些数据样本包括了房屋的大小、卧室数量、建造年份,以及这个房屋所对应的价格。
然后机器学习就是让我们利用已知的这些数据去训练出一个有关房屋价格预判的数学模型。
我们假设房屋价格符合线性模型,也就是下面的一般线性方程。
θ代表我们所选举的特征所占的权重。我们在评估一个房屋价格的时候,会选取房屋的大小、卧室数量等特征。
x则代表数据集中该特征的实际大小。例如A房屋的面积是120平方米、3个卧室……
h(θ)就是在当前特征向量θ下,对当前数据样本预测的房屋价格。
所以,你可以理解为机器学习做的事情就是给你一堆历史数据,然后让你找出一个最优的h(θ)函数。
初中的数学题目
已知一元一次函数 y=ax+b
x=2 y=3
x=3 y=5
问:当x=4时,y=?
是不是觉得这道题目特别简单?
其实机器学习做的事情和这道题目是一样的,我们的目的就是求出a和b的值,然后将x带入数学函数,求出目标值y
只是我们在处理实际问题的时候,遇到的模型肯定不是一元函数、大部分情况下他们也不是一次函数。而且,我们也不确定我们的数据就一定是符合某一种数学模型的,搞不好他都不是线性模型(这里我们先不讨论这种情况)。
那这种情况我们肯定不能用初中数学的解法,去将x和y的值代入数学模型求参数,那我们该怎么办呢?
最小二乘法
沿用上面的一般性回归假设函数,我们预测的房价是h(θ),我们设真实的房价值是Y。我们既然没有办法让h(θ)和Y完全一样,那么我们可以让他们的差尽可能的小,直到小到一个我们可以接受的误差范围。(比如房价500万和500.1万的误差我们是完全可以接受的)
这样,我们又引入了第二个数学公式——误差函数
好了,又到了名词解释时间了。
上标i代表了是第i个训练样本,后面的y含义一样。
整个J(θ)的含义就是m个训练样本,预测值和真实值差的平方和*1/2。
至于为什么乘以1/2就是为了后面求导计算方便,并没有特殊意义。因为我们的目的是求这个函数在何处求得最小值(取得最小值时θ的值),那么乘以1/2并不影响对θ的求值。
梯度下降
既然是误差函数,那我们必然需要想办法让这个误差函数取得最小值了。
说到取最小值,那自然会想到对一个函数求导,当导数=0的时候就是函数的最小值的点了。但我们是个多元函数,所以只能挨个对每个变量求偏导,然后让函数沿着让导数下降的方向移动。
所以,我们需要对每一个特征让它沿着导数递减的方向去移动:
大家可能会问,怎么莫名其妙多出了一个α?
原因是这样的,我们对一个函数求偏导数,我们得出的是这个函数是上升/下降和他们的幅度,如果一个函数过于陡峭,我们很有可能移动过多,跑到了最低点的另外一边,然后下一次迭代又跑到了另外一边,循环往复……
所以,我们就靠这个α来控制步长,避免移动过快或过慢 。
矩阵运算
其实,上面我们已经可以解决一般线性方程求近似最小值的问题了,但上面的方式不够直观,也不够简单,现在我们换一种解决方式——矩阵。
我们先将参数使用矩阵表示:
其中m代表是m个样本。
当我们将样本使用矩阵表示以后,h(θ)的表示就变成了:
通过使用矩阵,我们只需要一次矩阵运算就可以将预期值h(θ)计算出来了,是不是很方便?当然,还有更神奇的!
既然我们的h(θ)可以使用矩阵表示,那我们的误差函数J(θ)自然也可以使用矩阵去表示。
通过一个m*n的矩阵我们就可以将有N个特征值、M个训练样本的误差值表示出来。
上面我们是通过最小二乘法去表示损失函数的,现在我们将矩阵表达的误差函数代入最小二乘法,得到下面的J(θ)表达式:
老套路,让我们来看看使用矩阵的时候,θ在何种情况下J(θ)取得最小值,也就是我们的目标θ矩阵。
在进行公示推导之前,我们先复习几个矩阵运算的基础知识。
结合等式(2)和(3)我们又可以得出一个新的等式:
回忆完上面的线性代数基础以后,我们可以下面开始我们愉快的推导了:
在第三步的时候,我们利用了一个实数的trace等于这个实数的性质。
第四步的时候,我们利用了一个矩阵的trace=它的转置矩阵的trace的性质。
第五步的话,我们令A的转置=θ;B=X和它转置的积;C=I。
最后,我们令J(θ)的导数=0,这样θ的取值就代表了J(θ)的最小值。
所以,使用矩阵表示损失函数最小值的最终公式变为:
我们使用矩阵的目的是为了让我们的运算更简单易懂,我们推导出矩阵表示表达时的θ求值函数以后,只需要对样本参数做4次矩阵运算就可以求出特征矩阵,而不是像上面那样用好几个for循环。
怎么样,有没有感觉数学真的很神奇!