机器学习自学笔记--线性回归

最近一直在入门ML的东西,也想写一些东西来总结一下学的知识以便加深记忆,如果有哪里解释的不正确请看官们指出。

在这之前,首先我们先要明确监督式学习中两个概念:回归和分类,建立回归模型输出是数值,可以理解成一个连续量(1.2,3.5...),回归模型是用来预测输出的数值,比如你想预测未来股市,收视率什么的;而分类模型的输出是类别,而不是一个数值结果,分类模型的输出通常是一个(0,1)的概率(posterioi probability),通过这些概率来找到最可能的类别,例如分类猫狗。

机器学习自学笔记--线性回归

                                                                  Figure 1: 估计器选择(from scikit-learn)estimator selection

了解了这两个概念后,接下来我们先来介绍线性回归(linear-regression), 顾名思义就是利用线性模型来预测输出值,线性模型可以表示成:

                                                               机器学习自学笔记--线性回归

我们训练模型的目的就是要优化机器学习自学笔记--线性回归 ,这里我们需要引进一个概念:代价函数(loss-function),这个函数的作用可以类比成对模型建立一个奖罚制度,拟合的数据好,代价就小,反之就大。不同的机器学习模型代价函数也是不同的,在线性模型中代价函数通常采用的是误差的均方和作为代价函数,可以理解成计算所有预测值与label之间欧几里得距离的平方。而我们的目标是通过调节线性模型参数使得模型的代价函数结果达到最小。

 

                                                                   机器学习自学笔记--线性回归

                                                                                机器学习自学笔记--线性回归

 

 

在线性模型中,对于这样一个优化问题,最常用的方法就是最小二乘法,理论推导部分有很多教材和网上资源,这部分我就不再赘述,通过最小二乘法我们能够得到参数最优解:

                                                                                        机器学习自学笔记--线性回归

最小二乘求解优点在于不用迭代,直接求导计算极小值,而最小二乘使用也存在这前提:1. 确保数据是非奇异矩阵 2. 代价函数是凸函数,因为如果是非凸函数极有可能求解到极小值点不是最小值. 3. 只能用于线性问题求解,非线性问题还是需要迭代计算。

而另外一种常见优化方法则是梯度下降算法(gradient descent) , 梯度下降优化参数的方法主要是通过让权重参数在每一次迭代中能够沿梯度负方向更新一个小步长,直到代价函数收敛。下面做一个简单推导,我们想让代价函数收敛,可以理解成每一次权重更新都能满足下面公式一,根据泰勒公式展开我们可以得到公式二,机器学习自学笔记--线性回归 是一个微小值,每次更新一个小步长的结果近似等于当前结果加上一个微小值乘以当前梯度。

                                                                                            机器学习自学笔记--线性回归   

                                                                             机器学习自学笔记--线性回归

那么我们需要证明的是如何保证更新后的值一定小于当前结果,假设机器学习自学笔记--线性回归,这里就引出了梯度下降里面第一个参数机器学习自学笔记--线性回归,也就是步长,这样上面的公式二就可以还写为下面的形式,很显然后项的结果一定严格小于0,除非我们到达了极值点。因此只要在到达极值点之前,公式一会一直成立。这就是梯度下降算法,在每一次迭代之中,权重参数更新通过减去步长乘以当前梯度。

                                                                               机器学习自学笔记--线性回归

梯度下降算法是比较经典的一种参数优化算法,但是有一个缺点就是在实际他速度太慢,我们知道矩阵的梯度相当于代价函数对于每一个权重机器学习自学笔记--线性回归求偏微分从而来得到对于每一个权重方向上的梯度,根据梯度的数值解公式可以看到想要求解每一个权重的梯度时,都需要求解一次机器学习自学笔记--线性回归,这就导致你要再进行一次前向传播来计算机器学习自学笔记--线性回归,可以想象如果有1000个权重每次更新你就要进行1001次前向传播计算,速度实在太慢了,因此就出现了很经典的反向传播算法(back propogation)来计算梯度。

 

                                                                                机器学习自学笔记--线性回归

 

反向传播计算梯度的方法是依照了链式法则的原理,通过代价函数来反向计算出每一层权重的梯度,这样有一个好处是你只需要进行一次前向传播就可以计算出所有权重的梯度,为什么?因为我们计算的方法不再是通过上面公式来求解,如下图所示出自Andrew大神的ML lecture,假设我们有三层神经网络,每一层权重的梯度可以看作:机器学习自学笔记--线性回归, j 指第几个节点,i指第几层。a指该层的输出值,机器学习自学笔记--线性回归指下一层的偏差,图中机器学习自学笔记--线性回归值当前层的权重矩阵,机器学习自学笔记--线性回归指对activation function进行求导对于sigmod求解的结果等于a*(1-a)。详细的演算过程小弟实在是写不动了,BP神经网络的数学原理及其算法实现这位大神的博客写的很详细。整个更新梯度的过程中,你会发现只需要进行一次前向传播(为了得到代价函数的值)就可以得到所有权重的偏导,当然数值准确性上可能没有第一种高,但是速度明显大幅提升。

第一次写博客,有很多地方自己看的时候感觉明白了,真正写成文字又花了很长时间。。。慢慢来吧,有不对的地方欢迎大家指点。

 机器学习自学笔记--线性回归