从最小二乘法到梯度下降法(二)


前言

上一篇我们介绍了最小二乘法,这是一种数学优化方法,常用于拟合回归。它的基本思想就是通过令参数的偏导数为0,计算残差平方和的最小值。但是这种方法有一定的局限性,就是不适合使用计算机进行计算,因为计算机不会解方程。
那么,有没有方便计算机进行计算的方法呢?答案当然是有的。计算机虽然不会解方程,但是它可以通过自己强大的计算能力,把最终答案一步一步试出来。这就是梯度下降法。

线性回归的例子

还是上一篇的例子,我们要求变量 $x, y$ 满足的关系 $y=ax+b$ 。现在我们得到了残差平方和:$$F(a, b) = \sum_{i=1}^n \frac{1}{2} [y_i-(ax_i+b)]^2$$
并求得F关于 $a, b$ 的偏导数: $$\begin{cases} F’_a = \sum_{i=1}^n (-x_i)[y_i-(ax_i+b)] \\ F’_b = \sum_{i=1}^n -[y_i-(ax_i+b)] \end{cases}$$
接着,我们并不直接令 $F’_a, F’_b$ 等于0(因为这样计算机无法处理),而是任意取一组 $\begin{bmatrix} a_0 \\ b_0 \end{bmatrix}$ ,并计算F在该点处的偏导数值 $\begin{bmatrix} F’_{a_0} \\ F’_{b_0} \end{bmatrix}$ 。这个由偏导数组成的向量,我们就称之为梯度。我们的目标是求得函数F的极小值,所以,对于参数a,若 $F’_{a_0} > 0$ ,则函数在 $a_0$ 处递增,我们需要减小a的取值;相反,若 $F’_{a_0} < 0$ ,则函数在 $a_0$ 处递减,我们需要增大a的取值。对于b,同理。那么,我们只需要更新取值为: $$\begin{bmatrix} a_1 \\ b_1 \end{bmatrix} = \begin{bmatrix} a_0 \\ b_0 \end{bmatrix} - \eta \begin{bmatrix} F’_{a_0} \\ F’_{b_0} \end{bmatrix}$$
我们可以确定,新的取值比原来的取值更接近极值点。这里 $\eta$ 是学习速率,我们可以取一个很小的正值,以保证变化的幅度不会太大,以致跳过了极值点。可见,我们只需根据这一规则,不断更新参数的取值,最终便可以得到函数F的极小值点。

扩展到多重回归

同样的,我们扩展到多维。我们可以得到参数 $A=[a_0, a_1, \ldots, a_k]^T$ 的梯度 $\nabla F=[F’_{a_0}, F’_{a_1}, \ldots, F’_{a_k}]^T$ 。首先随机取 $A_0$ ,然后根据公式 $A’ = A-\eta \nabla F$ 不断更新 $A$ 的值,最终求得最优参数 $A_{best}$ 。

随机梯度下降(SGD)

上面我们使用的梯度下降方法称为批梯度下降(BGD),它需要遍历所有样本数据,以求得梯度,在数据量巨大时,效率低下。为此,我们引入另一种梯度下降方法——随机梯度下降。
在随机梯度下降中,我们不是一劳永逸地算出梯度函数 $\nabla F$ ,而是每次都使用一个样本 $\begin{bmatrix} X_i \\ y_i \end{bmatrix}$ ,计算残差平方和,并求得 $\nabla F_i$ ,用作第 $i$ 次更新参数时的梯度。这样减少了梯度函数的计算量,每次只需要使用一个样本数据,但缺点是收敛速度减慢,因为每次算得的梯度方向不一定是整体最优的。

小批量梯度下降(MBGD)

上述两种梯度下降方法各有优势,而小批量梯度下降则将两者结合起来。顾名思义,该方法将样本分成多个批次,每个批次都有多个样本数据。在一次梯度函数 $\nabla F$ 的计算过程中,使用一批样本数据。跟BGD相比,MBGD计算梯度函数时样本量较少,效率高;跟SGD相比,MBGD使用小批量计算梯度,减小了梯度方向的误差,使得收敛速度更快。


坚持原创技术分享,您的支持将鼓励我继续创作!