Векторизация алгоритма градиентного спуска
Я кодирую градиентный спуск в матлабе.
Для двух функций я могу перейти на шаг обновления:
temp0 = theta(1,1) - (alpha/m)*sum((X*theta-y).*X(:,1));
temp1 = theta(2,1) - (alpha/m)*sum((X*theta-y).*X(:,2));
theta(1,1) = temp0;
theta(2,1) = temp1;
Однако я хочу векторизовать этот код и использовать его для любого количества функций.
Для части векторизации это было указано мне, что то, что я пытаюсь сделать, это умножение матрицы
theta = theta - (alpha/m) * (X' * (X*theta-y));
Это хорошо видно, но когда я попытался, я понял, что он не работает для градиентного спуска, потому что параметры не обновляются одновременно.
Затем, как я могу векторизовать этот код и убедиться, что параметры и обновлены в одно и то же время?
Ответы
Ответ 1
Ваша векторизация верна. Я также пробовал использовать оба кода, и это дало мне ту же самую тету. Просто помните, что не используйте обновленную тету во второй реализации.
Это также работает, но менее упрощается, чем ваша вторая реализация:
Error = X * theta - y;
for i = 1:2
S(i) = sum(Error.*X(:,i));
end
theta = theta - alpha * (1/m) * S'
Ответ 2
Для векторизованной версии попробуйте выполнить следующие действия (два шага, чтобы сделать одновременное обновление явно):
gradient = (alpha/m) * X' * (X*theta -y)
theta = theta - gradient
Ответ 3
Чтобы обновить их одновременно, вам нужно сохранить значение theta (1..n) во временном векторе и после операции просто обновить значения в исходном тета-векторе.
Это код, который я использую для этой цели:
Обновление Temp
tempChange = нули (длина (тета), 1);
tempChage = theta - (alpha/m) * (X '* (X * theta-y));
Фактическое обновление
theta = tempChage;
Ответ 4
theta = theta - (alpha/m) * (X') * ((X*theta)-y)
Ответ 5
Я очень новичок в этой теме, но мое мнение таково: если вы вычисляете X*theta
заранее, тогда при выполнении векторизованной операции по настройке theta не нужно быть в темпе. другими словами: если вы вычисляете X*theta
при обновлении тета-вектора, theta (1) обновляется до theta (2) и, следовательно, изменяет X*theta
. но если мы вычислим X*theta
как y_pred, а затем сделаем векторизацию op для theta, все будет в порядке.
поэтому мое предложение (без использования temp):
y_pred = X*theta %theta is [1;1] and X is mX2 matrix
theta = theta - (alpha/m) * (X' * (y_pred-y));
Пожалуйста, поправьте меня, если я ошибаюсь.