批量梯度下降算法不收敛

我在尝试为机器学习作业实现批量梯度下降算法。我有一个训练集,其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次迭代。

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注