Я пытаюсь реализовать алгоритм пакетного грандиозного спуска для домашней работы по машинному обучению. У меня есть тренировочный набор, значение х которого составляет около 10^3
и значение у около 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)
Мне кажется, что тета никогда не сойдется.
Я следую решению Вот установить скорость обучения в 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 на размер;
theta[0] = theta0 - LRATE * dJ0 / size;
theta[1] = theta1 - LRATE * dJ1 / size;
То, что я бы посоветовал вам, следует рассчитать функцию стоимости и контролировать ее;
Ваша стоимость должна уменьшаться на каждой итерации. Если он подпрыгивает назад и вперед, вы используете большое значение скорость обучения. Я бы предложил вам использовать 0,01 и делать 400 итераций.
Других решений пока нет …