线性回归模型是一个非常简单的算法模型,它属于机器学习中的监督学习算法。假设数据集中有特征xi和特征yi,现在每个i对应于一个样本点(xi,yi),希望通过线性回归算法建立如下所示的一个模型。
其中yi为线性模型的预测值,我们肯定是希望yi能够准确预测未知的样本。通俗来讲就是找到一个函数(wxi+b)拟合 yi使得误差最小,即最小化该模型的损失函数:
只要能够使得损失函数最小化,那么此时建立的回归模型就能够较好的预测未知样本。那么如何最小化这个误差呢?这里需要用到梯度下降算法,非常简单,但是却非常强大,它的核心就是链式求导。
梯度
在梯度下降法中,我们首先要明确梯度的概念,一元回归中梯度就是我们所说的导数,多元回归中梯度就是我们所说的偏导数,如下所示是 f(x)=x² 这个函数在 x=1 处的梯度
f(x)=x²
我们为什么要求梯度呢?我们想要最快的进行回归模型的优化,而朝着梯度的方向进行优化往往是最快的。一个点的梯度值是这个函数变化最快的地方,也就是说沿着梯度的反方向,我们能够更快地找到函数的最小值点。
梯度下降算法,我们可以理解为朝着梯度的反方向一点一点的下降,最终我们就能找到损失函数的最小值,此时的模型就是我们所需要的。
比如我们在一座大山上的某处位置(函数的某一位置),由于我们不知道怎么下山,于是决定走一步算一步,也就是在每走到一个位置的时候,求解当前位置的梯度,沿着梯度的负方向,也就是当前最陡峭的位置向下走一步,然后继续求解当前位置梯度,这样一步步的走下去,一直走到山脚,这就是梯度下降算法的直观体现。
在我们进行梯度下降的时候,我们还需要指定算法走的这一步有多大,如果一步太小,那么算法的下降的速度会很慢,如果步长很大就容易在最小值点不断跳动,到不了最低点,所以步长是我们需要考虑中,机器学习中步长我们使用 η表示。
当算法进行一步梯度下降的之后,我们需要重新定位算法所在损失函数的位置,然后进行下一步梯度下降,更新公式是
算法通过不断地迭代更新,最终我们能够找到一组最优的参数w和b,这就是梯度下降法的原理。
当我们找到最优的参数w和b之后,我们就拥有了最终的回归模型,我们就可以使用这个最终的模型来预测未知样本了,这就是机器学习梯度下降优化算法对线性回归模型进行优化的过程。
def linear_model(x): return x * w + b def get_loss(y_, y): return torch.mean((y_ - y_train) ** 2) for e in range(10): # 进行 10 次更新 y_ = linear_model(x_train) loss = get_loss(y_, y_train) w.grad.zero_() b.grad.zero_() loss.backward() w.data = w.data - 1e-2 * w.grad.data # 更新 w b.data = b.data - 1e-2 * b.grad.data # 更新 b print('epoch: {}, loss: {}'.format(e, loss.data[0]))