Алгоритм пакетного градиентного спуска не сходится

Я пытаюсь реализовать алгоритм пакетного грандиозного спуска для домашней работы по машинному обучению. У меня есть тренировочный набор, значение х которого составляет около 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)

В чем дело?

0

Решение

Итак, во-первых, ваш алгоритм выглядит хорошо, за исключением того, что вы должны разделить LRATE на размер;

theta[0] = theta0 - LRATE * dJ0 / size;
theta[1] = theta1 - LRATE * dJ1 / size;

То, что я бы посоветовал вам, следует рассчитать функцию стоимости и контролировать ее;

Функция стоимости

Ваша стоимость должна уменьшаться на каждой итерации. Если он подпрыгивает назад и вперед, вы используете большое значение скорость обучения. Я бы предложил вам использовать 0,01 и делать 400 итераций.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]