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

#machine-learning #backpropagation

#машинное обучение #обратное распространение

Вопрос:

Вопрос

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

В Coursera ML Неделя 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
 

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

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

Ответ №1:

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

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