线性回归及梯度下降算法详解

一、线性回归问题
  回归最简单的定义是,给出一个点集D,用一个函数去拟合这个点集,并且使得点集与拟合函数间的误差最小,如果这个函数曲线是一条直线,那就被称为线性回归,如果曲线是一条二次曲线,就被称为二次回归。
  总的来说,回归的目的就是建立一个回归方程用来预测目标值,回归的求解就是求这个回归方程的回归系数。预测的方法当然十分简单,回归系数乘以输入值再全部相加就得到了预测值。
  下面以一元线性回归为例来解释线性回归的概念,下图1为某地区的房屋面积(feet)与价格的一个数据集,在该数据集中,只有一个自变量面积(feet),和一个因变量价格,所以我们可以将数据集呈现在二维空间上,如图2所示。利用该数据集,我们的目的是训练一个线性方程,无限逼近所有数据点,然后利用该方程与给定的某一自变量(本例中为面积),可以预测因变量(本例中为房价)。本例中,训练所得的线性方程如图3所示。

线性回归及梯度下降算法详解

线性回归及梯度下降算法详解

线性回归及梯度下降算法详解

  线性回归的目的就是找到预测性能最好的线性方程:

线性回归及梯度下降算法详解

  如果再在该案例中增添了一个自变量:房间数,数据集如下所示:

线性回归及梯度下降算法详解

  此时,预测性能最好的线性方程应为如下所示:

线性回归及梯度下降算法详解

  因此,无论是一元线性方程还是多元线性方程,可统一写成如下的格式:

线性回归及梯度下降算法详解

  因为参数只有θ,所以找到预测性能最好的线性方程换言之也就是找到最好的θ值,从而使得线性方程的预测最好。那么我们该如何评估线性函数h(x)的好坏呢,这时候我们引入损失函数(loss function)的概念,用它来评估线性函数的好坏。

线性回归及梯度下降算法详解

  损失函数J(θ)也就是对每个样本x(i)的估计值与真实值y(i)差的平方进行求和,得到整个样本预测的值跟真实值之间的差距和损失,现在找最优的线性方程的问题可转化为求解损失函数J(θ)的最小值。
  如何调整θ以使得J(θ)取得最小值有很多方法,其中有最小二乘法(min square)和梯度下降法(Gradient Descent)。下面详细讲解梯度下降法。

二、梯度下降法
  由上可知,原始问题已转化成求解J(θ)的最小值,也就是求解得到J(θ)取得最小值时θ0,θ1 … θn的值。这里采用梯度下降的方法来进行相应值的求解,找到损失函数的最小值。
  我们先来看一张图来理解梯度下降的概念:

线性回归及梯度下降算法详解

  上图黑线即为梯度下降的走势,在给定初始点开始向下走,往最低的点一步一步向下进行,直到找到最小点。但是这里存在一个问题,初始点选择不好有可能导致梯度下降的最终点不是全局最小点,而是一个局部最小点,如上图紫色线所示,最终得到的值是一个局部最小点。
  但是对于损失函数J(θ)为凸函数的情况,就不会存在上面的问题,它只有一个全局最优解,如下图所示:

线性回归及梯度下降算法详解

  所以由上可知,梯度下降的原理可以形象表示为:比如我们在一座大山上的某处位置,由于我们不知道怎么下山,于是决定走一步算一步,也就是在每走到一个位置的时候,求解当前位置的梯度,沿着梯度的负方向,也就是当前最陡峭的位置向下走一步,然后继续求解当前位置梯度,向这一步所在位置沿着最陡峭最易下山的位置走一步。这样一步步的走下去,一直走到觉得我们已经到了山脚。当然这样走下去,有可能我们不能走到山脚,而是到了某一个局部的山峰低处。
  所以对于梯度下降法,它的主要步骤如下:
  (1) 先确定向下一步的步伐大小,我们称为学习率α;
  (2) 任意给定一个初始值:;
  (3) 确定一个向下的方向,并向下走预先规定的步伐,并更新θ值;
  (4) 当下降的高度小于某个定义的值ε,则停止下降。
  它的核心算法可以用下面一张图来概括:

线性回归及梯度下降算法详解

  具体来说就是,α为学习率,决定了下降的步伐大小;损失函数J(θ)关于θ的偏导数决定了下降的方向;当损失函数J(θ)收敛时,停止更新θ的值。
  最后强调一下,梯度下降的步伐大小(即学习率α)非常重要,因为如果太小,会使得找到损失函数最小值的速度变得很慢,如果α太大,则有可能会出现跳过最优的现象,从而找不到损失函数的最优解。在实际应用中,若损失函数的值不断变大,则有可能是步长速率a太大,导致算法不收敛,这时可适当调整a值。

三、梯度下降算法的优化调试
3.1、算法的步长选择
  实际上,步长的取值取决于数据样本,可以多取一些值,从大到小,分别运行算法,看看迭代效果,如果损失函数在变小,说明取值有效,否则要增大步长。前面说了。步长太大,会导致迭代过快,甚至有可能错过最优解。步长太小,迭代速度太慢,很长时间算法都不能结束。所以算法的步长需要多次运行后才能得到一个较为优的值。
3.2、参数初始值的选择
  初始值不同,获得的最小值也有可能不同,因此梯度下降求得的只是局部最小值;当然如果损失函数是凸函数则一定是最优解。由于有局部最优解的风险,需要多次用不同初始值运行算法,关键损失函数的最小值,选择损失函数最小化的初值。
3.3、归一化
  由于样本不同特征的取值范围不一样,可能导致迭代很慢,为了减少特征取值的影响,可以对特征数据归一化,也就是对于每个特征x,求出它的平均值mean(x)、最大值max和最小值min,然后转化为: [x-mean(x)]/(max-min)。