我在尝试为机器学习作业实现批量梯度下降算法。我有一个训练集,其x值约为10^3
,y值约为10^6
。我试图找到[theta0, theta1]
的值,使y = theta0 + theta1 * x
收敛。我将学习率设置为0.0001
,最大迭代次数设置为10
。这是我在Qt中的代码。
QVector<double> gradient_descent_batch(QVector<double> x, QVector<double>y){ QVector<double> theta(0); theta.resize(2); int size = x.size(); theta[1] = 0.1; theta[0] = 0.1; for (int j=0;j<MAX_ITERATION;j++) { double dJ0 = 0.0; double dJ1 = 0.0; for (int i=0;i<size;i++) { dJ0 += (theta[0] + theta[1] * x[i] - y[i]); dJ1 += (theta[0] + theta[1] * x[i] - y[i]) * x[i]; } double theta0 = theta[0]; double theta1 = theta[1]; theta[0] = theta0 - LRATE * dJ0; theta[1] = theta1 - LRATE * dJ1; if (qAbs(theta0 - theta[0]) < THRESHOLD && qAbs(theta1 - theta[1]) < THRESHOLD) return theta; } return theta;}
我每迭代一次就打印theta
的值,以下是结果。
QVector(921495, 2.29367e+09) QVector(-8.14503e+12, -1.99708e+16) QVector(7.09179e+19, 1.73884e+23) QVector(-6.17475e+26, -1.51399e+30) QVector(5.3763e+33, 1.31821e+37) QVector(-4.68109e+40, -1.14775e+44) QVector(4.07577e+47, 9.99338e+50) QVector(-3.54873e+54, -8.70114e+57) QVector(3.08985e+61, 7.57599e+64) QVector(-2.6903e+68, -6.59634e+71)
看起来theta永远不会收敛。我按照这里的解决方案,将学习率设置为0.00000000000001
,最大迭代次数设置为20
。但似乎还是不会收敛。以下是结果。
QVector(0.100092, 0.329367) QVector(0.100184, 0.558535) QVector(0.100276, 0.787503) QVector(0.100368, 1.01627) QVector(0.10046, 1.24484) QVector(0.100552, 1.47321) QVector(0.100643, 1.70138) QVector(0.100735, 1.92936) QVector(0.100826, 2.15713) QVector(0.100918, 2.38471) QVector(0.101009, 2.61209) QVector(0.1011, 2.83927) QVector(0.101192, 3.06625) QVector(0.101283, 3.29303) QVector(0.101374, 3.51962) QVector(0.101465, 3.74601) QVector(0.101556, 3.9722) QVector(0.101646, 4.1982) QVector(0.101737, 4.424) QVector(0.101828, 4.6496)
哪里出了问题?
回答:
首先,你的算法看起来没问题,但你应该将LRATE除以size;
theta[0] = theta0 - LRATE * dJ0 / size;theta[1] = theta1 - LRATE * dJ1 / size;
我建议你计算成本函数并监控它;
你的成本应该在每次迭代中都减少。如果它来回波动,说明你使用的学习率值过大。我建议你使用0.01并进行400次迭代。