达人专栏丨机器学习之 从零动手实现梯度下降(下)前面已经有两篇关于梯度下降的入门文章,本文从简单的线性模型入手,讲解了梯度下降是如何学习其中的参数的。而本篇主要是讲怎么从零开始,使用Python实现梯度下降算法。 承接上一篇文章,过两个点(1,2)和(2,1),训练一个最简单的线性模型:y = ax + b,其在参数a和参数b上的梯度为: 代入其参数更新迭代公式如下: 假设学习率为0.1。实现代码不复杂,完整如下:
运行所得结果如下:
参数a和b越来越接近模型:y = -x + 3 这条直线。该程序支持多个点,只需要修改对应的points的定义即可。 上面已经实现了一个简单的梯度下降算法,但是只能对y = ax + b这样简单的情况,如果多一个特征就必须修改源码。对于y = ax + b,我们标准化一一下: 其中x0=1,也就是我们所理解的一个特征,可以理解为两个特征,只是其中一个特征的值一直都是1(对应线性模型中的常数项,任何数值乘以1都等于其本身)。写成更加通用的矩阵形式如下: 这就是通用的线性模型了。对于有m个特征的模型: 展开如下: 输入一组特征值(x0, x1, ..., xn),会得到一个预测值y,我们还是定义该模型的损失函数为: 其中n为样本数量。把预测值代入展开如下: 对于第i个参数ai计算梯度: 代入参数的梯度下降迭代更新公式: 从第t次迭代到第t+1次迭代的公式如上。 完整代码实现如下:
这是一个相对通用的梯度下降算法了。 后续可以优化的点: 1. 学习率优化算法 2. 加上正则化项 |