Вопрос по logistic-regression, machine-learning, gradient-descent, matlab – Верна ли моя реализация стохастического градиентного спуска?

8

Я пытаюсь развить стохастический градиентный спуск, но я нене знаю, правильно ли это на 100%.

Стоимость, сгенерированная моим алгоритмом стохастического градиентного спуска, иногда очень далека от стоимости, сгенерированной FMINUC или пакетным градиентным спуском.в то время как стоимость спуска по пакетному градиенту сходится, когда я устанавливаю альфа-скорость обучения 0,2, я вынужден устанавливать альфа-скорость обучения 0,0001 для моей стохастической реализации, чтобы она не расходилась. Это нормально?

Вот некоторые результаты, которые я получил с тренировочным набором из 10 000 элементов и num_iter = 100 или 500

    FMINUC : 
    Iteration  #100 | Cost: 5.147056e-001

    BACTH GRADIENT DESCENT  500 ITER
    Iteration #500 - Cost = 5.535241e-001

    STOCHASTIC GRADIENT DESCENT 100 ITER
    Iteration #100 - Cost = 5.683117e-001  % First time I launched
    Iteration #100 - Cost = 7.047196e-001  % Second time I launched

Реализация градиентного спуска для логистической регрессии

J_history = zeros(num_iters, 1); 

for iter = 1:num_iters 

    [J, gradJ] = lrCostFunction(theta, X, y, lambda);
    theta = theta - alpha * gradJ;
    J_history(iter) = J;

    fprintf('Iteration #%d - Cost = %d... \r\n',iter, J_history(iter));
end

Реализация стохастического градиентного спуска для логистической регрессии

% number of training examples
m = length(y);

% STEP1 : we shuffle the data
data = [y, X];
data = data(randperm(size(data,1)),:);
y = data(:,1);
X = data(:,2:end);

for iter = 1:num_iters 

     for i = 1:m
        x = X(i,:); % Select one example
        [J, gradJ] = lrCostFunction(theta, x, y(i,:), lambda);
        theta = theta - alpha * gradJ;
     end

     J_history(iter) = J;
     fprintf('Iteration #%d - Cost = %d... \r\n',iter, J);

end

Для справки, вот функция логистической регрессии, использованная в моем примере.

function [J, grad] = lrCostFunction(theta, X, y, lambda)

m = length(y); % number of training examples

% We calculate J    
hypothesis = sigmoid(X*theta); 
costFun = (-y.*log(hypothesis) - (1-y).*log(1-hypothesis));    
J = (1/m) * sum(costFun) + (lambda/(2*m))*sum(theta(2:length(theta)).^2);

% We calculate grad using the partial derivatives
beta = (hypothesis-y); 
grad = (1/m)*(X'*beta);
temp = theta;  
temp(1) = 0;   % because we don't add anything for j = 0  
grad = grad + (lambda/m)*temp; 
grad = grad(:);

end

Ваш Ответ

3   ответа
-1

ость обучения очень высокой, то она будет следовать за желаемой в меньшей степени из-за пропуска. Так что возьмите небольшую скорость обучения, даже если это займет больше времени. Результат будет более убедительным.

0

когда скорости обучения уменьшаются с соответствующей скоростью и при относительно умеренных допущениях, стохастический градиентный спуск почти наверняка сходится кглобальный минимум когда целевая функциявыпуклый или жепсевдовыпуклаи в противном случае сходится почти наверняка кместный минимум, Это на самом деле является следствиемRobbins-Зигмунд теорема.

Роббинс, Герберт; Зигмунд, Дэвид О. (1971). "Теорема сходимости для неотрицательных почти супермартингалов и некоторые приложения », В Рустаги Джагдиш С. Оптимизационные методы в статистике. Академическая пресса

Да, ты прав. То, что я сказал, происходит, когда вы используете фиксированную скорость обучения. NKN
Что я понимаю, если что, если скорость обучения является фиксированной, то стоимость будет "качаться» вокруг глобального минимума, но никогда не достигать его. Тот'Поэтому, если мы уменьшаем скорость обучения с фиксированной скоростью, например, умножая ее на 0,8, то алгоритм будет колебаться все меньше и меньше и в конечном итоге достигнет значения, очень близкого к минимальному. alexandrekow
2

дящего курса обученияalpha, вы должны подумать о применениипоиск строки метод.

Поиск строки - это метод, который выбирает оптимальную скорость обучения для градиентного спуска на каждой итерации, что лучше, чем использование фиксированной скорости обучения на протяжении всего процесса оптимизации. Оптимальное значение для скорости обученияalpha это тот, который локально (из текущегоtheta в направлении отрицательного градиента) минимизирует функцию стоимости.

На каждой итерации градиентного спуска начинайте с скорости обученияalpha = 0 и постепенно увеличиватьсяalpha по фиксированному шагуdeltaAlpha = 0.01, например. Пересчитать параметрыtheta и оценить функцию стоимости. Поскольку функция стоимости выпуклая, увеличиваяalpha (то есть, перемещаясь в направлении отрицательного градиента) функция стоимости сначала начнет уменьшаться, а затем (в какой-то момент) возрастать. В этот момент остановите поиск строки и возьмите последнийalpha до того, как стоимость функции начала расти. Теперь обновите параметрыtheta с этимalpha, Если функция стоимости никогда не начинает расти, остановитесь на.alpha = 1

Замечания: Для больших факторов регуляризации (,lambda = 100lambda = 1000) Возможно, чтоdeltaAlpha слишком велик и градиентный спуск расходится. Если это так, уменьшитеdeltaAlpha 10 раз (,deltaAlpha = 0.001deltaAlpha = 0.0001) пока не доберешься до соответствующегоdeltaAlpha для которого сходится градиентный спуск.

Кроме того, вам следует подумать об использовании некоторого завершающего условия, отличного от количества итераций, например, когда разница между функциями затрат в двух последующих итерациях становится достаточно малой (меньше, чем некоторыеepsilon).

Похожие вопросы