梯度降低(Gradient Descent)小结

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

1、梯度

    在微积分里面,对多元函数的参数求∂偏导数,把求得的各个参数的偏导数以向量的形式写出来,就是梯度。好比函数f(x,y), 分别对x,y求偏导数,求得的梯度向量就是(∂f/∂x, ∂f/∂y)T,简称grad f(x,y)或者▽f(x,y)。对于在点(x0,y0)的具体梯度向量就是(∂f/∂x0, ∂f/∂y0)T.或者▽f(x0,y0),若是是3个参数的向量梯度,就是(∂f/∂x, ∂f/∂y,∂f/∂z)T,以此类推。微信

    那么这个梯度向量求出来有什么意义呢?他的意义从几何意义上讲,就是函数变化增长最快的地方。具体来讲,对于函数f(x,y),在点(x0,y0),沿着梯度向量的方向就是(∂f/∂x0, ∂f/∂y0)T的方向是f(x,y)增长最快的地方。或者说,沿着梯度向量的方向,更加容易找到函数的最大值。反过来讲,沿着梯度向量相反的方向,也就是 -(∂f/∂x0, ∂f/∂y0)T的方向,梯度减小最快,也就是更加容易找到函数的最小值。机器学习

     

2、梯度降低与梯度上升

    在机器学习算法中,在最小化损失函数时,能够经过梯度降低法来一步步的迭代求解,获得最小化的损失函数,和模型参数值。反过来,若是咱们须要求解损失函数的最大值,这时就须要用梯度上升法来迭代了。函数

    梯度降低法和梯度上升法是能够互相转化的。好比咱们须要求解损失函数f(θ)的最小值,这时咱们须要用梯度降低法来迭代求解。可是实际上,咱们能够反过来求解损失函数 -f(θ)的最大值,这时梯度上升法就派上用场了。学习

    下面来详细总结下梯度降低法。        优化

3、梯度降低法算法详解

3.1 梯度降低的直观解释

    首先来看看梯度降低的一个直观的解释。好比咱们在一座大山上的某处位置,因为咱们不知道怎么下山,因而决定走一步算一步,也就是在每走到一个位置的时候,求解当前位置的梯度,沿着梯度的负方向,也就是当前最陡峭的位置向下走一步,而后继续求解当前位置梯度,向这一步所在位置沿着最陡峭最易下山的位置走一步。这样一步步的走下去,一直走到以为咱们已经到了山脚。固然这样走下去,有可能咱们不能走到山脚,而是到了某一个局部的山峰低处。spa

    从上面的解释能够看出,梯度降低不必定可以找到全局的最优解,有多是一个局部最优解。固然,若是损失函数是凸函数,梯度降低法获得的解就必定是全局最优解。blog

3.2 3.2 梯度降低的相关概念

    在详细了解梯度降低的算法以前,咱们先看看相关的一些概念。it

    1. 步长(Learning rate):步长决定了在梯度降低迭代的过程当中,每一步沿梯度负方向前进的长度。用上面下山的例子,步长就是在当前这一步所在位置沿着最陡峭最易下山的位置走的那一步的长度。io

    2.特征(feature):指的是样本中输入部分,好比2个单特征的样本\((x^{(0)},y^{(0)}),(x^{(1)},y^{(1)})\),则第一个样本特征为\(x^{(0)}\),第一个样本输出为\(y^{(0)}\)

    3. 假设函数(hypothesis function):在监督学习中,为了拟合输入样本,而使用的假设函数,记为\(h_{\theta}(x)\)。好比对于单个特征的m个样本\((x^{(i)},y^{(i)})(i=1,2,...m)\),能够采用拟合函数以下: \(h_{\theta}(x) = \theta_0+\theta_1x\)

    4. 损失函数(loss function):为了评估模型拟合的好坏,一般用损失函数来度量拟合的程度。损失函数极小化,意味着拟合程度最好,对应的模型参数即为最优参数。在线性回归中,损失函数一般为样本输出和假设函数的差取平方。好比对于m个样本\((x_i,y_i)(i=1,2,...m)\),采用线性回归,损失函数为:

             \(J(\theta_0, \theta_1) = \sum\limits_{i=1}^{m}(h_\theta(x_i) - y_i)^2\)

     其中\(x_i\)表示第i个样本特征,\(y_i\)表示第i个样本对应的输出,\(h_\theta(x_i)\)为假设函数。   

3.3 3.3 梯度降低的详细算法

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

 

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

    1. 先决条件: 确认优化模型的假设函数和损失函数。

    好比对于线性回归,假设函数表示为 \(h_\theta(x_1, x_2, ...x_n) = \theta_0 + \theta_{1}x_1 + ... + \theta_{n}x_{n}\), 其中$\theta_i $ (i = 0,1,2... n)为模型参数,$x_i $ (i = 0,1,2... n)为每一个样本的n个特征值。这个表示能够简化,咱们增长一个特征$x_0 = 1 $ ,这样\(h_\theta(x_0, x_1, ...x_n) = \sum\limits_{i=0}^{n}\theta_{i}x_{i}\)

    一样是线性回归,对应于上面的假设函数,损失函数为:

           \(J(\theta_0, \theta_1..., \theta_n) = \frac{1}{2m}\sum\limits_{j=0}^{m}(h_\theta(x_0^{(j)}, x_1^{(j)}, ...x_n^{(j)}) - y_j)^2\)

 

    2. 算法相关参数初始化:主要是初始化\(\theta_0, \theta_1..., \theta_n\),算法终止距离\(\varepsilon\)以及步长\(\alpha\)。在没有任何先验知识的时候,我喜欢将全部的\(\theta\)初始化为0, 将步长初始化为1。在调优的时候再 优化。

    3. 算法过程:

      1)肯定当前位置的损失函数的梯度,对于\(\theta_i\),其梯度表达式以下:

        \(\frac{\partial}{\partial\theta_i}J(\theta_0, \theta_1..., \theta_n)\)

      2)用步长乘以损失函数的梯度,获得当前位置降低的距离,即\(\alpha\frac{\partial}{\partial\theta_i}J(\theta_0, \theta_1..., \theta_n)\)对应于前面爬山例子中的某一步。

      3)肯定是否全部的\(\theta_i\),梯度降低的距离都小于\(\varepsilon\),若是小于\(\varepsilon\)则算法终止,当前全部的\(\theta_i\)(i=0,1,...n)即为最终结果。不然进入步骤4.

      4)更新全部的\(\theta\),对于\(\theta_i\),其更新表达式以下。更新完毕后继续转入步骤1.

        \(\theta_i = \theta_i - \alpha\frac{\partial}{\partial\theta_i}J(\theta_0, \theta_1..., \theta_n)\)

    下面用线性回归的例子来具体描述梯度降低。假设咱们的样本是\((x_1^{(0)}, x_2^{(0)}, ...x_n^{(0)}, y_0), (x_1^{(1)}, x_2^{(1)}, ...x_n^{(1)},y_1), ... (x_1^{(m)}, x_2^{(m)}, ...x_n^{(m)}, y_m)\),损失函数如前面先决条件所述:

    \(J(\theta_0, \theta_1..., \theta_n) = \frac{1}{2m}\sum\limits_{j=0}^{m}(h_\theta(x_0^{(j)}, x_1^{(j)}, ...x_n^{(j)})- y_j)^2\)

    则在算法过程步骤1中对于\(\theta_i\) 的偏导数计算以下:   

     \(\frac{\partial}{\partial\theta_i}J(\theta_0, \theta_1..., \theta_n)= \frac{1}{m}\sum\limits_{j=0}^{m}(h_\theta(x_0^{(j)}, x_1^{(j)}, ...x_n^{(j)}) - y_j)x_i^{(j)}\)

    因为样本中没有\(x_0\)上式中令全部的\(x_0^{j}\)为1.

    步骤4中\(\theta_i\)的更新表达式以下:

           \(\theta_i = \theta_i - \alpha\frac{1}{m}\sum\limits_{j=0}^{m}(h_\theta(x_0^{(j)}, x_1^{(j)}, ...x_n^{j}) - y_j)x_i^{(j)}\)

    从这个例子能够看出当前点的梯度方向是由全部的样本决定的,加\(\frac{1}{m}\) 是为了好理解。因为步长也为常数,他们的伺机也为常数,因此这里\(\alpha\frac{1}{m}\)能够用一个常数表示。

    在下面第4节会详细讲到的梯度降低法的变种,他们主要的区别就是对样本的采用方法不一样。这里咱们采用的是用全部样本。

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

    这一部分主要讲解梯度降低法的矩阵方式表述,相对于3.3.1的代数法,要求有必定的矩阵分析的基础知识,尤为是矩阵求导的知识。

    1. 先决条件: 和3.3.1相似, 须要确认优化模型的假设函数和损失函数。对于线性回归,假设函数\(h_\theta(x_1, x_2, ...x_n) = \theta_0 + \theta_{1}x_1 + ... + \theta_{n}x_{n}\)的矩阵表达方式为:

     \(h_\mathbf{\theta}(\mathbf{X}) = \mathbf{X\theta}\) ,其中, 假设函数\(h_\mathbf{\theta}(\mathbf{X})\)为mx1的向量,\(\mathbf{\theta}\)为(n+1)x1的向量,里面有n+1个代数法的模型参数。\(\mathbf{X}\)为mx(n+1)维的矩阵。m表明样本的个数,n+1表明样本的特征数。

             损失函数的表达式为:\(J(\mathbf\theta) = \frac{1}{2}(\mathbf{X\theta} - \mathbf{Y})^T(\mathbf{X\theta} - \mathbf{Y})\), 其中\(\mathbf{Y}\)是样本的输出向量,维度为mx1.

    2. 算法相关参数初始化:
\[ \theta \]
向量能够初始化为默认值,或者调优后的值。算法终止距离\(\varepsilon\),步长\(\alpha\)和3.3.1比没有变化。
    3. 算法过程:

      1)肯定当前位置的损失函数的梯度,对于\(\theta\)向量,其梯度表达式以下:

        \(\frac{\partial}{\partial\mathbf\theta}J(\mathbf\theta)\)

      2)用步长乘以损失函数的梯度,获得当前位置降低的距离,即\(\alpha\frac{\partial}{\partial\theta}J(\theta)\)对应于前面爬山例子中的某一步。

      3)肯定\(\mathbf\theta\)向量里面的每一个值,梯度降低的距离都小于\(\varepsilon\),若是小于\(\varepsilon\)则算法终止,当前\(\mathbf\theta\)向量即为最终结果。不然进入步骤4.

      4)更新\(\theta\)向量,其更新表达式以下。更新完毕后继续转入步骤1.

        \(\mathbf\theta= \mathbf\theta - \alpha\frac{\partial}{\partial\theta}J(\mathbf\theta)\)

   

    仍是用线性回归的例子来描述具体的算法过程。

    损失函数对于\(\theta\)向量的偏导数计算以下:

      \(\frac{\partial}{\partial\mathbf\theta}J(\mathbf\theta) = \mathbf{X}^T(\mathbf{X\theta} - \mathbf{Y})\)

    步骤4中\(\theta\)向量的更新表达式以下:\(\mathbf\theta= \mathbf\theta - \alpha\mathbf{X}^T(\mathbf{X\theta} - \mathbf{Y})\)

    对于3.3.1的代数法,能够看到矩阵法要简洁不少。这里面用到了矩阵求导链式法则,和两个矩阵求导的公式。

 

    这里面用到了矩阵求导链式法则,和两个个矩阵求导的公式。

      公式1:\(\frac{\partial}{\partial\mathbf{x}}(\mathbf{x^Tx}) =2\mathbf{x}\;\;x为向量\)

      公式2:\(\nabla_Xf(AX+B) = A^T\nabla_Yf,\;\; Y=AX+B,\;\;f(Y)为标量\)

    若是须要熟悉矩阵求导建议参考张贤达的《矩阵分析与应用》一书。

 

3.4 3.4 梯度降低的算法调优

    在使用梯度降低时,须要进行调优。哪些地方须要调优呢?

    1. 算法的步长选择。在前面的算法描述中,我提到取步长为1,可是实际上取值取决于数据样本,能够多取一些值,从大到小,分别运行算法,看看迭代效果,若是损失函数在变小,说明取值有效,不然要增大步长。前面说了。步长太大,会致使迭代过快,甚至有可能错过最优解。步长过小,迭代速度太慢,很长时间算法都不能结束。因此算法的步长须要屡次运行后才能获得一个较为优的值。

    2. 算法参数的初始值选择。 初始值不一样,得到的最小值也有可能不一样,所以梯度降低求得的只是局部最小值;固然若是损失函数是凸函数则必定是最优解。因为有局部最优解的风险,须要屡次用不一样初始值运行算法,关键损失函数的最小值,选择损失函数最小化的初值。

    3.归一化。因为样本不一样特征的取值范围不同,可能致使迭代很慢,为了减小特征取值的影响,能够对特征数据归一化,也就是对于每一个特征x,求出它的指望\(\overline{x}\)和标准差std(x),而后转化为:

      \(\frac{x - \overline{x}}{std(x)}\)

    这样特征的新指望为0,新方差为1,迭代次数能够大大加快。

4、梯度降低法你们族(BGD,SGD,MBGD)

4.1 批量梯度降低法(Batch Gradient Descent)

    批量梯度降低法,是梯度降低法最经常使用的形式,具体作法也就是在更新参数时使用全部的样原本进行更新,这个方法对应于前面3.3.1的线性回归的梯度降低算法,也就是说3.3.1的梯度降低算法就是批量梯度降低法。  

    \(\theta_i = \theta_i - \alpha\sum\limits_{j=0}^{m}(h_\theta(x_0^{(j)}, x_1^{(j)}, ...x_n^{(j)}) - y_j)x_i^{(j)}\)

    因为咱们有m个样本,这里求梯度的时候就用了全部m个样本的梯度数据。

4.2 4.2 随机梯度降低法(Stochastic Gradient Descent)

    随机梯度降低法,其实和批量梯度降低法原理相似,区别在与求梯度时没有用全部的m个样本的数据,而是仅仅选取一个样本j来求梯度。对应的更新公式是:

    \(\theta_i = \theta_i - \alpha (h_\theta(x_0^{(j)}, x_1^{(j)}, ...x_n^{(j)}) - y_j)x_i^{(j)}\)

    随机梯度降低法,和4.1的批量梯度降低法是两个极端,一个采用全部数据来梯度降低,一个用一个样原本梯度降低。天然各自的优缺点都很是突出。对于训练速度来讲,随机梯度降低法因为每次仅仅采用一个样原本迭代,训练速度很快,而批量梯度降低法在样本量很大的时候,训练速度不能让人满意。对于准确度来讲,随机梯度降低法用于仅仅用一个样本决定梯度方向,致使解颇有可能不是最优。对于收敛速度来讲,因为随机梯度降低法一次迭代一个样本,致使迭代方向变化很大,不能很快的收敛到局部最优解。

    那么,有没有一个中庸的办法可以结合两种方法的优势呢?有!这就是4.3的小批量梯度降低法。

4.3 4.3 小批量梯度降低法(Mini-batch Gradient Descent)

  小批量梯度降低法是批量梯度降低法和随机梯度降低法的折衷,也就是对于m个样本,咱们采用x个样子来迭代,1<;x<;m。通常能够取x=10,固然根据样本的数据,能够调整这个x的值。对应的更新公式是:

    \(\theta_i = \theta_i - \alpha \sum\limits_{j=t}^{t+x-1}(h_\theta(x_0^{(j)}, x_1^{(j)}, ...x_n^{(j)}) - y_j)x_i^{(j)}\)

5、梯度降低法和其余无约束优化算法的比较

    在机器学习中的无约束优化算法,除了梯度降低之外,还有前面提到的最小二乘法,此外还有牛顿法和拟牛顿法。

    梯度降低法和最小二乘法相比,梯度降低法须要选择步长,而最小二乘法不须要。梯度降低法是迭代求解,最小二乘法是计算解析解。若是样本量不算很大,且存在解析解,最小二乘法比起梯度降低法要有优点,计算速度很快。可是若是样本量很大,用最小二乘法因为须要求一个超级大的逆矩阵,这时就很难或者很慢才能求解解析解了,使用迭代的梯度降低法比较有优点。

    梯度降低法和牛顿法/拟牛顿法相比,二者都是迭代求解,不过梯度降低法是梯度求解,而牛顿法/拟牛顿法是用二阶的海森矩阵的逆矩阵或伪逆矩阵求解。相对而言,使用牛顿法/拟牛顿法收敛更快。可是每次迭代的时间比梯度降低法长。

(欢迎转载,转载请注明出处。欢迎沟通交流: 微信:nickchen121)

相关文章
相关标签/搜索