Обратное распространение (Cousera ML от Andrew Ng) уточнение градиентного спуска

Вопрос

Пожалуйста, простите меня за вопрос, связанный с курсом Coursera ML. Надеюсь, кто-то, кто сделал couser, может ответить.

В Coursera ML Week 4 Многоклассовая классификация и нейронные сети назначение, почему градиент веса (тета) добавляет (плюс) производную вместо вычитания?

% Calculate the gradients of Weight2
% Derivative at Loss function J=L(Z) : dJ/dZ = (oi-yi)/oi(1-oi)
% Derivative at Sigmoid activation function dZ/dY = oi(1-oi)

delta_theta2 = oi - yi;  % <--- (dJ/dZ) * (dZ/dY) 

# Using +/plus NOT -/minus
Theta2_grad = Theta2_grad +     <-------- Why plus(+)?
              bsxfun(@times, hi, transpose(delta_theta2)); 

Фрагмент кода

for i = 1:m  
    % i is training set index of X (including bias). X(i, :) is 401 data.
    xi = X(i, :);
    yi = Y(i, :);
    
    % hi is the i th output of the hidden layer. H(i, :) is 26 data.
    hi = H(i, :);
    
    % oi is the i th output layer. O(i, :) is 10 data.
    oi = O(i, :);
    
    %------------------------------------------------------------------------
    % Calculate the gradients of Theta2
    %------------------------------------------------------------------------
    delta_theta2 = oi - yi;
    Theta2_grad = Theta2_grad + bsxfun(@times, hi, transpose(delta_theta2));
 
    %------------------------------------------------------------------------
    % Calculate the gradients of Theta1
    %------------------------------------------------------------------------
    % Derivative of g(z): g'(z)=g(z)(1-g(z)) where g(z) is sigmoid(H_NET).
    dgz = (hi .* (1 - hi));
    delta_theta1 = dgz .* sum(bsxfun(@times, Theta2, transpose(delta_theta2)));
    % There is no input into H0, hence there is no theta for H0. Remove H0.
    delta_theta1 = delta_theta1(2:end);
    Theta1_grad = Theta1_grad + bsxfun(@times, xi, transpose(delta_theta1));
end

Я думал, что это вычитание производной.

введите здесь описание изображения


person mon    schedule 05.12.2020    source источник


Ответы (1)


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

Также я не уверен, когда вы узнаете об этом (уверен, что это где-то в курсе), но вы могли бы также векторизовать код :)

person ntlarry    schedule 05.12.2020