机器学习之由线性回归到梯度下降法

版权声明:转载请注明出处~ https://blog.csdn.net/sinat_31425585/article/details/82932760

    一谈到机器学习,我们可能会思考,什么是机器学习,到底学习什么?

    一、机器学习学什么?

    我们先来看一张图,如图1所示,这张图来自Andrew Ng机器学习课程第二章,什么意思?我总结一下:

    1) 机器学习目的:建立输入(x)到输出(y)之间的映射关系(h);

    2) 模型建立:模型建立过程中,我们需要根据经验,对要建立模型做一些假设(Hypothesis),比如说,这里假设输入(房屋面积)和输出(房屋价格)之间是满足线性关系的,这样模型的类型就确定了;

    3) 机器学习学的内容:学习内容,其实就是学习我假定模型的参数,例如,这里我们假定是线性的,那么相当于就是假定了一个线性方程y=W^{T}X+b,我们学习的过程,其实就是得到确切的模型参数W^{T},b学习的本质是学习模型的参数。

                               

                                                                         图1 机器学习流程示意图(摘自参考资料[1])

    二、如何学?

    在说如何学之前,我们先聊一下我们是如何去判别一件事情完成的好坏程度。我们在衡量一件事情完成好坏之前,自身会有一个期望结果(预期值),而这件事情有一个实际结果(真实值),这样,我们就可以通过这种实际值与预期值之间的偏差,就可以很好的来判断这件事情的好坏。

    2.1 损失函数

    在机器学习中,同样也是类似的,机器学习中有一个专门的名词:loss(cost),描述loss(cost)使用loss function(损失函数)或error function(误差函数)。

    这里,我们看一下一个具体模型的loss计算过程,如图2所示。

                                                                      图2 Loss 直观解释(摘自参考资料[1])

    期望值与预测值之间的偏差就对应于蓝色线段,预测总的偏差等于所有蓝色线段长度之和,所以,Loss function可以定义如下:

                                                                           L(\theta )=(h_{\theta (x)}- y)^{2}

    衡量整个样本集中的损失,我们采用cost function(代价函数):

                                                                    J(\theta )=\frac{1}{2m}\sum_{i=0}^{m}(h_{\theta (x_{i})}- y_{i})^{2}

    2.2 学习目标

    如果当前模型能够完美的拟合所有样本点,这个时候有:   h_{\theta (x_{i})}= y_{i},i=1,2,...,m,  对应的J(\theta )=0,如图3所示。

                                                                      图3 模型完美拟合样本(摘自参考资料[1])

    因此,如果我们能够最小化损失函数J(\theta ),让J(\theta )足够小,那么这个时候参数\theta对应模型就能较好的拟合样本集,我们就能得到一个我们希望得到的模型,因此,如何学习问题其实就等价于如何来最小化损失函数J(\theta ),学习的目标就是最小化损失函数J(\theta )min_{\theta }J(\theta )

    对于求解的问题,我们可以考虑直接求偏导,然后令之为0,就可以得到解:

                                                                              \theta =(X^{T}X)^{-1}X^{T}Y

    实际求解过程中,求矩阵的逆比较难求,因此采用考虑另外一种思路:梯度下降法。

    2.3 梯度下降法

    我们先看一下损失函数长什么样,损失函数的图像如图4所示。我们需要找寻全局最小值,直接求解可能太过于困难,因此我们考虑将问题进行分解,每一次优化一点,让模型变得更好一点,通过一次次迭代,最终得到一个最优的模型参数。梯度下降法就是按照这个思路设计的,每一次对参数\theta的调整,都会使得损失函数J(\theta )变小,这样多次调整之后,我们就能使得J(\theta )足够小,最终得到理想的模型参数。

                                                                        图4 损失函数图像(摘自参考资料[1])

    那么,具体怎么做?首先回忆一下我们本科学习过的泰勒级数展开式,我们先看一下一阶的泰勒展式:

                                                                      f(x_{k}+\delta )=f(x_{k})+f(x_{k})^{'}\delta

    类似的,对于一个向量X_{k}有:

                                                                    f(X_{k}+d_{k} )=f(X_{k})+g(X_{k})^{T}d_{k}

    这个式子说明了什么问题?我们先将这个式子做一下移项变形,有:

                                                                     f(X_{k}+d_{k} )-f(X_{k})=g(X_{k})^{T}d_{k}

    这样就明显了,如果我们沿着d_{k}方向做一个改变,会引起g(X_{k})^{T}d_{k}大小变化,我们再分析一下g(X_{k})^{T}d_{k}

                                                                 g(X_{k})^{T}d_{k}=||g(X_{k})||*||d_{k}||*cos\alpha

    我们希望损失函数J(\theta )尽可能的变小,因此要求g(X_{k})^{T}d_{k}尽可能的大,而当\alpha =0时,g(X_{k})^{T}d_{k}取得最大值||g(X_{k})||*||d_{k}||,这个时候g(X_{k}),d_{k}同向,这也是为什么梯度下降法要沿着梯度方向来做的原因。

    我们可以再进一步,将问题进行简化,假设当前模型为:h_{\theta (x_{i})}=\theta _{1}x,损失函数的图像如图5所示。

                                                                    图5 梯度下降法示意图(摘自参考资料[1])

    梯度下降的过程为:

                                                                                 Repeat \ until \ converge:

                                                                                      \theta _{j}:=\theta _{j}-\alpha \frac{\partial J(\theta ) }{\theta _{j}}

    其中,\alpha为学习率,在经过一次次迭代之后,偏导数会变得越来越小,直至接近于0,这个时候,\alpha乘以这个偏导数任然接近于0,算法就自然收敛了。

    三、梯度下降法做线性回归

    偏导数求解:

      

    注意,对应于一般的参数方程\theta_{2}x_{2} + \theta _{1}x_{1}+\theta_{0}=0对应于我们常见的ax+by+c=0\theta _{0}=c,x_{0} = 1,这里将所有的参数表示成一个向量只是为了方便表示,其实本质上并没有什么区别,只是表示方法的不同而已。

    四、代码实现

~~~~未完待续~~~~~~

参考资料:

[1] Andrew Ng 的 机器学习课程

猜你喜欢

转载自blog.csdn.net/sinat_31425585/article/details/82932760