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

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

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

это хорошо видно, но когда я попробовал, я понял, что это не работает для градиентного спуска поскольку параметры не обновляются одновременно.

тогда как я могу векторизовать этот код и убедиться, что параметры и обновлены одновременно?

4 ответов


ваша векторизация верна. Я также попробовал оба ваших кода, и это дало мне тот же тета. Просто помните, что не используйте обновленную тэту во второй реализации.

Это также работает, но менее упрощено, чем ваша 2-я реализация:

Error = X * theta - y;
for i = 1:2
    S(i) = sum(Error.*X(:,i));
end

theta = theta - alpha * (1/m) * S'

для векторизованной версии попробуйте выполнить следующие действия (два шага для явного одновременного обновления):

 gradient = (alpha/m) * X' * (X*theta -y)
 theta = theta - gradient

чтобы обновить их одновременно, вам нужно сохранить значение theta (1..n) во временном векторе и после операции просто обновите значения в исходном тета-векторе.

Это код, который я использую для этого:

темп обновления

tempChange = нули (длина (тета), 1);

tempChage = theta - (alpha/m) * (X' * (X*theta-y));

фактическое update

theta = tempChage;


theta = theta - (alpha/m) * (X') * ((X*theta)-y)