5.4.4 梯度下降的详细算法
本节内容需要读者具有一定的微积分基础。读者可跳过本节内容。在微积分里面,对多元函数的参数求∂偏导数,把求得的各个参数的偏导数以向量的形式写出来,就是梯度。比如函数 $\operatorname { f } ( \mathbf { x } , \mathbf { y } )$ ,分别对x、y求偏导数,求得的梯度向量就是 $( \partial \mathbf { f } / \partial \mathbf { x } , \partial \mathbf { f } / \partial \mathbf { y } )$ ,简称 $\mathrm { g r a d f } ( \mathbf { x } , \mathbf { y } )$ 。对于在点 $\left( \mathbf { \boldsymbol { x } } _ { 0 } , \mathbf { \boldsymbol { y } } _ { 0 } \right)$ 的具体梯度向量就是 $( \partial \mathbf { f } / \partial \mathbf { x } _ { 0 } , \partial \mathbf { f } / \partial \mathbf { y } _ { 0 } )$ ,如果是3个参数的向量梯度,就是 $( \partial \mathbf { f } / \partial \mathbf { x } , \partial \mathbf { f } / \partial \mathbf { y }$ $\partial \mathbf { f } / \partial \mathbf { z } )$ ,以此类推。那么,这个梯度向量求出来有什么意义呢?从几何意义上讲,就是函数变化增加最快的地方。具体来说,对于函数 $\mathrm { f } ( \mathbf { \boldsymbol { x } } , \mathbf { \boldsymbol { y } } )$ ,在点 $( \mathbf { x } _ { 0 } , \mathbf { y } _ { 0 } )$ ,沿着梯度向量的方向,就是$( \partial \mathbf { f } / \partial \mathbf { x } _ { 0 } , \partial \mathbf { f } / \partial \mathbf { y } _ { 0 } )$ 的方向,是 $\operatorname { f } ( \mathbf { x } , \mathbf { y } )$ 增加最快的地方。或者说,沿着梯度向量的方向更加容易找到函数的最大值。反过来说,沿着梯度向量相反的方向,也就是 $( \partial \mathbf { f } / \partial \mathbf { x } _ { 0 } , \partial \mathbf { f } / \partial \mathbf { y } _ { 0 } )$ 的方向,梯度减小最快,也就更加容易找到函数的最小值。
梯度下降法的算法可以有代数法和矩阵法(也称向量法)两种表示,如果对矩阵分析不熟悉,则代数法更加容易理解。本节以代数法为例来讲解算法。
- 先决条件:确认优化模型的假设函数和误差函数
比如对于线性回归,假设函数表示为 $\scriptstyle \mathrm { h } _ { 0 } ( \mathrm { x } _ { 1 } , \mathrm { x } _ { 2 } , . . . , \mathrm { x } _ { \mathrm { n } } ) = \displaystyle \theta _ { 0 } + \theta _ { 1 } \mathrm { x } _ { 1 } + . . . + \theta _ { \mathrm { n } } \mathrm { x } _ { \mathrm { n } } ,$ 其中 $\Theta _ { \mathrm { i } } ( \mathrm { i } = 0 , 1 , 2 , . . . , \mathrm { n } )$ 为模型参数, $\mathrm { x _ { i } } ( \mathrm { i } = 0 , 1 , 2 , . . . , \mathrm { n } )$ 为每个样本的n个特征值。这个表示可以简化,我们增加一个特征 $\mathrm { x } _ { 0 } { = } 1$ ,这样 $\scriptstyle \mathrm { h _ { \boldsymbol { \Theta } } ( x _ { 0 } , x _ { 1 } , \ldots , x _ { n } ) = \sum \theta _ { i } x _ { i } }$ ,其中 $_ \mathrm { i = 0 \sim n }$ 。同样是线性回归,对应上面的假设函数,误差函数可以使用样本输出和假设函数的差取平方。
- 算法相关参数初始化
主要是初始化 $\theta _ { 0 } , \theta _ { 1 } , . . . , \theta _ { \mathrm { n } }$ ,以及算法终止距离ε和步长 $a _ { \circ }$ 在没有任何先验知识的时候,我可以将所有的 $\theta$ 初始化为0,将步长初始化为1。在调优的时候再优化。
3.算法过程
(1)确定当前位置的误差函数的梯度。在微积分里面,对多元函数的参数求∂偏导数,把求得的各个参数的偏导数以向量的形式写出来,就是梯度。对于 $\theta _ { i }$ ,其梯度表达式为∂f/∂θi,其中函数f可以是均方差函数。
(2)用步长乘以误差(损失)函数的梯度得到当前位置下降的距离,即对应于前面登山例子中的某一步。
(3)确定是否所有 $\theta i$ 梯度下降的距离都小于ε,如果小于 $\varepsilon _ { \cdot }$ ,则算法终止,当前所有的 $\theta _ { i }$ $( \mathrm { i } { = } 0 , 1 , { \ldots } , \mathrm { n } )$ 即为最终结果。否则进入步骤4。
(4)更新所有的 $\theta ,$ 对于 $\theta i$ ,其更新表达式如下。更新完毕后继续转入步骤(1)。
$$
\theta _ { i } = \theta _ { i } - \frac { 2 r } { \top } \top \top \top \top \top \top
$$
在机器学习中,无约束优化算法除了梯度下降法以外,还有前面提到的最小二乘法,此外还有牛顿法和拟牛顿法。梯度下降法和最小二乘法相比,梯度下降法需要选择步长,而最小二乘法不需要。梯度下降法是迭代求解,最小二乘法是计算解析解。如果样本量不算很大,且存在解析解,最小二乘法比起梯度下降法有优势,计算速度很快。但是如果样本量很大,用最小二乘法由于需要求一个超级大的逆矩阵,这时就很难或者很慢才能求解了,使用迭代的梯度下降法比较有优势。梯度下降法和牛顿法/拟牛顿法相比,两者都是迭代求解,不过梯度下降法是梯度求解,而牛顿法/拟牛顿法是用二阶的海森矩阵的逆矩阵或伪逆矩阵求解。相对而言,使用牛顿法/拟牛顿法收敛更快,但是每次迭代的时间比梯度下降法长。
人工智能与大数据技术导论
154