梯度下降算法(一)+https://developer.aliyun.com/article/1544680?spm=a2c6h.13148508.setting.28.2a1e4f0euIPhgb
如果学习率调整为0.3,那么将找不到最低点,还会产生震荡**
我们将学习率改为0.01时,最后的值为path[-1] = 2.9999876804184145,已经很接近x = 3。
我们再将学习率改为0.001,此时曲线将离最低点还有一段距离:
包括我们将迭代次数改为1000次后,我们的x值将为2.999999999256501,无限接近与最低点。
假设我们有一些散点数据,需要拟合它:
train_x = data[:,0] train_y = data[:,1] X = np.concatenate([train_x.reshape(-1,1), np.ones_like(train_x.reshape(-1,1))], axis=1) y = train_y.reshape(-1,1)
我们可以用最小二乘法来求解,求出损失最小的权值w和b,通过正规方程,得出w=0.93099006,b = -1.52679069。
回到最初的问题,正规方程或者是最小二乘法求解过程中,存在诸多的限制,接下来采用梯度下降来求解该问题;
我们使用MSE作为损失函数,则该损失函数的梯度表达式为
def linearRegression_gd(X, y, w): """ 梯度计算公式 """ m = X.shape[0] gd = 2 * X.T.dot(X.dot(w)-y) / m return gd linearRegression_gd(X[:1,:],y[:1,:],np.array([1,1]).reshape(-1,1))
- X.T.dot(误差项)通过将误差项与𝑋X的转置矩阵相乘,实际上是计算了每个参数的偏导数之和,结果是一个与w维度相同的向量。
- X.T.dot(误差项)是用来计算梯度的一种方式,它通过考虑所有样本的贡献来同时更新模型的所有参数。
我们使用梯度下降求解出的结果为w = 0.940894,b = -1.627557 ,现在已经很接近正规方程计算出的最小值,但是还没有收敛,还需继续迭代或者更换学习率。
总结:
梯度下降用于最小化损失函数以找到模型参数的最佳估计,重点就是学习率、迭代次数和初始点的选择;
学习率(Learning Rate)
- 学习率决定了在每次迭代中参数更新的步长
- 学习率过大可能导致学习过程震荡不稳,可能错过最优解,甚至使得损失函数发散。
- 学习率过小收敛过程会变得非常缓慢,需要大量的迭代才能达到较好的解。
- 学习率适当能够保证较快的收敛速度同时避免错过最优解,最理想的情况是逐渐减小学习率,以加速初期训练并在后期更精细地调整参数。
迭代次数(iterations)
- 一个iterations指的是整个训练数据集被模型遍历并用于更新一次参数的完整过程。
- 迭代次数过多可能导致过拟合,尤其是在数据集较小且模型复杂度较高的情况下。
- 迭代次数过小模型可能没有足够的时间从数据中学习到有效的模式,导致欠拟合。
初始点
模型参数初始值会影响梯度下降的收敛速度和最终解,良好的初始化可以加速收敛过程,避免陷入局部极小值或鞍点。
精细地调整参数。
迭代次数(iterations)
- 一个iterations指的是整个训练数据集被模型遍历并用于更新一次参数的完整过程。
- 迭代次数过多可能导致过拟合,尤其是在数据集较小且模型复杂度较高的情况下。
- 迭代次数过小模型可能没有足够的时间从数据中学习到有效的模式,导致欠拟合。
初始点
模型参数初始值会影响梯度下降的收敛速度和最终解,良好的初始化可以加速收敛过程,避免陷入局部极小值或鞍点。
策略:随机初始化,多次选择初始点位,避免一开始从不合适的点迭代