Векторизация алгоритма градиентного спуска

Я кодирую градиентный спуск в матлабе. Для двух функций я могу перейти на шаг обновления:

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));

Пожалуйста, поправьте меня, если я ошибаюсь.