梯度下降原理小结

  在求解机器学习算法的模型参数,即无约束优化问题时,梯度下降(Gradient Descent)是最常采用的方法之一,另一种常用的方法是最小二乘法。这里就对梯度下降法做一个完整的总结。

1.梯度

  在微积分里,对于多元函数的参数求\partial偏导数,把求得的各个参数的偏导数以向量的形式写出来,就是梯度。比如函数f(x,y)f(x,y),分别对x,yx,y求偏导数,求得的梯度向量就是(fx,fy)T(\frac{\partial f}{\partial x}, \frac{\partial f}{\partial y})^T,简称gradf(x,y)f(x,y)或者f(x,y)\nabla f(x,y)。对于在点(x0,y0)(x_0,y_0)的具体梯度向量就是(fx0,fy0)T(\frac{\partial f}{\partial x_0}, \frac{\partial f}{\partial y_0})^T,或者f(x0,y0)\nabla f(x_0,y_0),如果是三个参数的向量梯度,就是(fx,fy,fz)T(\frac{\partial f}{\partial x}, \frac{\partial f}{\partial y}, \frac{\partial f}{\partial z})^T,以此类推。
  那么这个梯度向量求出来有什么意义呢?他的意义从几何意义上讲,就是函数变化增加最快的地方。具体来说,对于函数f(x,y)f(x,y),在点(x0,y0)(x_0,y_0),沿着梯度向量的方向就是(fx0,fy0)T(\frac{\partial f}{\partial x_0}, \frac{\partial f}{\partial y_0})^T的方向是f(x,y)f(x,y)增加最快的地方。或者说,沿着梯度向量的方向,更加容易找到函数的最大值。反过来说,沿着梯度向量相反的方向,也就是(fx0,fy0)T-(\frac{\partial f}{\partial x_0}, \frac{\partial f}{\partial y_0})^T的方向,梯度减少最快,也就是更加容易找到函数的最小值。

2.梯度下降与梯度上升

  在机器学习算法中,在最小化损失函数时,可以通过梯度下降法来一步步的迭代求解,得到最小化的损失函数,和模型参数值。反过来,如果我们需要求解损失函数的最大值,这时就需要用梯度上升法来迭代了。
  梯度下降法和梯度上升法是可以互相转化的。比如我们需要求解损失函数f(θ)f(θ)的最小值,这时我们需要用梯度下降法来迭代求解。但是实际上,我们可以反过来求解损失函数 f(θ)-f(θ)的最大值,这时梯度上升法就派上用场了。
  下面来详细总结下梯度下降法。

3.梯度下降法算法详解

3.1梯度下降直观解释

  首先来看看梯度下降的一个直观的解释。比如我们在一座大山上的某处位置,由于我们不知道怎么下山,于是决定走一步算一步,也就是在每走到一个位置的时候,求解当前位置的梯度,沿着梯度的负方向,也就是当前最陡峭的位置向下走一步,然后继续求解当前位置梯度,向这一步所在位置沿着最陡峭最易下山的位置走一步。这样一步步的走下去,一直走到觉得我们已经到了山脚。当然这样走下去,有可能我们不能走到山脚,而是到了某一个局部的山峰低处。
  从上面的解释可以看出,梯度下降不一定能够找到全局的最优解,有可能是一个局部最优解。当然,如果损失函数是凸函数,梯度下降法得到的解就一定是全局最优解。
梯度下降原理小结

3.2梯度下降的相关概念

  在详细了解梯度下降的算法之前,我们先看看相关的一些概念。
  1. 步长(Learning rate):步长决定了在梯度下降迭代的过程中,每一步沿梯度负方向前进的长度。用上面下山的例子,步长就是在当前这一步所在位置沿着最陡峭最易下山的位置走的那一步的长度。
  2.特征(feature):指的是样本中输入部分,比如2个单特征的样本(x(0),y(0)),(x(1),y(1))(x^{(0)},y{(0)}),(x^{(1)},y^{(1)}),则第一个样本特征为x(0)x^{(0)},第一个样本输出为y(0)y^{(0)}
  3. 假设函数(hypothesis function):在监督学习中,为了拟合输入样本,而使用的假设函数,记为hθ(x)h_{\theta}(x)。比如对于单个特征的m个样本(x(i),y(i))(i=1,2,m)(x^{(i)},y{(i)}) (i=1,2,\cdots m),可以采用拟合函数如下:hθ(x)=θ0+θ1x1h_\theta(x)=\theta_0+\theta_1x_1。
  4. 损失函数(loss function):为了评估模型拟合的好坏,通常用损失函数来度量拟合的程度。损失函数极小化,意味着拟合程度最好,对应的模型参数即为最优参数。在线性回归中,损失函数通常为样本输出和假设函数的差取平方。比如对于m个样本(x(i),y(i))(i=1,2,m)(x^{(i)},y{(i)}) (i=1,2,\cdots m),采用线性回归,损失函数为:
  J(θ0,θ1)=i=1m(hθ(xi)yi)2J(\theta_0,\theta_1)=\sum\limits_{i=1}^m(h_\theta(x_i)-y_i)^2
  其中xix_i表示第i个样本特征,yiy_i表示第i个样本对应的输出,hθ(xi)h_θ(x_i)为假设函数。

3.3梯度下降的详细算法

  梯度下降法的算法可以有代数法和矩阵法(也称向量法)两种表示,如果对矩阵分析不熟悉,则代数法更加容易理解。不过矩阵法更加的简洁,且由于使用了矩阵,实现逻辑更加的一目了然。这里先介绍代数法,后介绍矩阵法。

3.3.1梯度下降法的代数方式描述

  1. 先决条件: 确认优化模型的假设函数和损失函数。
  比如对于线性回归,假设函数表示为hθ(x1,x2,xn)=θ0+θ1x1++θnxnh_\theta(x_1,x_2,\cdots x_n)=\theta_0+\theta_1x_1+\cdots+\theta_nx_n,其中θi(i=0,1,2,n)\theta_i (i=0,1,2,\cdots n)为模型参数,xi(i=0,1,2,n)x_i (i=0,1,2,\cdots n)为每个样本的n个特征值。这个表示可以简化,我们增加一个特征x0=1x_0 = 1,这样hθ(x0,x1,,xn)=i=1nθixih_\theta(x_0,x_1,\cdots,x_n)=\sum\limits_{i=1}^n\theta_ix_i
  同样是线性回归,对应于上面的假设函数,损失函数为:
  J(θ0,θ1,,θn)=12mj=0m(hθ(x0(j),x1(j),,xn(j))yj)2J(\theta_0,\theta_1,\cdots,\theta_n)=\frac{1}{2m} \sum\limits_{j=0}^m(h_{\theta}(x_0^{(j)},x_1^{(j)},\cdots,x_n^{(j)})-y_j)^2
  2. 算法相关参数初始化:主要是初始化θ0,θ1,,θn\theta_0,\theta_1,\cdots,\theta_n,算法终止距离ϵ\epsilon以及步长α\alpha。在没有任何先验知识的时候,我喜欢将所有的θθ初始化为0, 将步长初始化为1。在调优的时候再优化。
  3. 算法过程:
    1)确定当前位置的损失函数的梯度,对于θiθ_i,其梯度表达式:θiJ(θ0,θ1,,θn)\frac{\partial}{\partial \theta_i}J(\theta_0,\theta_1,\cdots,\theta_n)
    2)用步长乘以损失函数的梯度,得到当前位置下降的距离,即αθiJ(θ0,θ1,,θn)\alpha\frac{\partial}{\partial \theta_i}J(\theta_0,\theta_1,\cdots,\theta_n)对应于前面登山例子中的某一步。
    3)确定是否所有的θiθ_i,梯度下降的距离都小于εε,如果小于εε则算法终止,当前所有的θi(i=0,1,...n)θ_i(i=0,1,...n)即为最终结果。否则进入步骤4.
    4)更新所有的θθ,对于θiθ_i,其更新表达式如下。更新完毕后继续转入步骤1.
   θi=θiαθiJ(θ0,θ1,,θn)\theta_i=\theta_i-\alpha\frac{\partial}{\partial \theta_i}J(\theta_0,\theta_1,\cdots,\theta_n)
  下面用线性回归的例子来具体描述梯度下降。假设我们的样本是(x1(0),x2(0),,xn(0),y0),(x1(1),x2(1),,xn(1),y1),...(x1(m),x2(m),,xn(m),ym)(x^{(0)}_1, x^{(0)}_2, \cdots, x^{(0)}_n, y_0), (x^{(1)}_1, x^{(1)}_2, \cdots, x^{(1)}_n, y_1),...(x^{(m)}_1, x^{(m)}_2, \cdots, x^{(m)}_n, y_m),损失函数如前面先决条件所述:
  J(θ0,θ1,,θn)=12mj=0m(hθ(x0(j),x1(j),,xn(j))yj)2J(\theta_0,\theta_1,\cdots,\theta_n)=\frac{1}{2m} \sum\limits_{j=0}^m(h_{\theta}(x_0^{(j)},x_1^{(j)},\cdots,x_n^{(j)})-y_j)^2
  则在算法过程步骤1中对于θiθ_i 的偏导数计算如下:
  θiJ(θ0,θ1,,θn)=1mj=0m(hθ(x0(j),x1(j),,xn(j))yj)xi(j)\frac{\partial}{\partial\theta_i}J(\theta_0,\theta_1,\cdots,\theta_n)=\frac{1}{m} \sum\limits_{j=0}^m(h_{\theta}(x_0^{(j)},x_1^{(j)},\cdots,x_n^{(j)})-y_j)x_i^{(j)}
  由于样本中没有x0x_0上式中令所有的x0jx^j_0为1。
  步骤4中θiθ_i的更新表达式如下:
  θi=θiαmj=0m(hθ(x0(j),x1(j),,xn(j))yj)xi(j)\theta_i=\theta_i-\frac{\alpha}{m} \sum\limits_{j=0}^m(h_{\theta}(x_0^{(j)},x_1^{(j)},\cdots,x_n^{(j)})-y_j)x_i^{(j)}
  从这个例子可以看出当前点的梯度方向是由所有的样本决定的,加1m\frac{1}{m} 是为了好理解。由于步长也为常数,他们的乘积也为常数,所以这里αm\frac{\alpha}{m}可以用一个常数表示。
  在下面第4节会详细讲到的梯度下降法的变种,他们主要的区别就是对样本的采用方法不同。这里我们采用的是用所有样本。

3.3.2梯度下降法的矩阵方式描述

未完待续\cdots