在 2.1 节,我们定义了线性回归的优化目标为:
$$
\min_\mathbf{w} \frac{1}{2n}\sum_{i=1}^{n}(y_i - \mathbf{w}^T\mathbf{x})^2
$$
在 2.2 节,我们了解了梯度下降:其可以通过函数的一阶导数来更新参数,使得函数值逐渐逼近最小值。因此在这一节,我们可以通过对线性回归的优化目标求导来得到梯度下降的更新公式。
我们定义目标函数函数 $J$ 为:
$$
J=\frac{1}{2n}\sum_{i=1}^{n}(y_i - \mathbf{w}^T\mathbf{x})^2
$$
我们将其带入梯度下降的公式中:
$$
\begin{align}
\mathbf{w}
&= \mathbf{w} - \eta \nabla J\\
&= \mathbf{w} - \eta \frac{\partial}{\partial \mathbf{w}} \left( \frac{1}{2N}\sum_{i=1}^{N}(y_i - \mathbf{w}^T\mathbf{x})^2 \right)\\
&= \mathbf{w} - \eta \frac{1}{N}\sum_{i=1}^{N}(\mathbf{w}^T\mathbf{x}_i - y_i)\mathbf{x}_i
\end{align}
$$
其中 $\eta$ 为学习率,$\nabla$ 为梯度算子。我们可以通过不断迭代上述公式来更新权重 $\mathbf{w}$ ,使得目标函数逐渐逼近最小值。
在实际应用中,我们可以通过设置迭代次数或者设置阈值来终止迭代。其代码类似于
const MAX_INTERATION = 1000
w = initWeight()
for (i := 0; i < MAX_INTERATION; i++) {
w = w - eta * gradient(w)
if stopCondition(w) {
break
}
}