exponenta event banner

Использовать автоматическую дифференциацию в инструменте для глубокого обучения

Индивидуальное обучение и расчеты с использованием автоматического дифференцирования

Автоматическое дифференцирование упрощает создание пользовательских циклов обучения, пользовательских слоев и других глубоких настроек обучения.

Как правило, самый простой способ настройки глубокого обучения - это создание dlnetwork. Включите нужные слои в сеть. Затем выполните обучение в пользовательском цикле, используя некий градиентный спуск, где градиент является градиентом целевой функции. Целевой функцией может быть ошибка классификации, перекрестная энтропия или любая другая релевантная скалярная функция весов сети. См. Список функций с поддержкой dlarray.

В этом примере представлена высокоуровневая версия пользовательского цикла обучения. Здесь, f является целевой функцией, такой как потеря, и g - градиент целевой функции относительно весов в сети; net. update функция представляет некоторый тип градиентного спуска.

% High-level training loop
n = 1;
while (n < nmax)
    [f,g] = dlfeval(@model,net,dlX,t);
    net = update(net,g);
    n = n + 1;
end

Вы звоните dlfeval для вычисления числового значения цели и градиента. Для автоматического вычисления градиента данные dlX должно быть dlarray.

dlX = dlarray(X);

Целевая функция имеет dlgradient вызовите для вычисления градиента. dlgradient вызов должен находиться внутри функции, которая dlfeval вычисляет.

function [f,g] = model(net,dlX,T)
% Calculate objective using supported functions for dlarray
    y = forward(net,dlX);
    f = fcnvalue(y,T); % crossentropy or similar
    g = dlgradient(f,net.Learnables); % Automatic gradient
end

Для примера использования dlnetwork с простым dlfeval-dlgradient-dlarray синтаксис см. в разделе Grad-CAM «Почему за решениями о глубоком обучении». Более сложный пример использования пользовательского цикла обучения см. в разделе Генеративная состязательная сеть (GAN). Дополнительные сведения о пользовательском обучении с использованием автоматического дифференцирования см. в разделе Определение пользовательских циклов обучения, функций потери и сетей.

Использовать dlgradient и dlfeval Вместе для автоматического дифференцирования

Для использования автоматического дифференцирования необходимо вызвать dlgradient внутри функции и вычислить функцию с помощью dlfeval. Представление точки, в которой производная берется как dlarray объект, который управляет структурами данных и обеспечивает трассировку анализа. Например, функция Розенброка является общей тестовой функцией для оптимизации.

function [f,grad] = rosenbrock(x)

f = 100*(x(2) - x(1).^2).^2 + (1 - x(1)).^2;
grad = dlgradient(f,x);

end

Вычислите значение и градиент функции Розенброка в точке x0 = [–1,2]. Чтобы включить автоматическую дифференциацию в функции Розенброка, пройдите x0 в качестве dlarray.

x0 = dlarray([-1,2]);
[fval,gradval] = dlfeval(@rosenbrock,x0)
fval =

  1x1 dlarray

   104


gradval =

  1x2 dlarray

   396   200

Пример использования автоматического дифференцирования см. в разделе Описание решений Grad-CAM, лежащих в основе глубокого обучения.

Производная трассировка

Чтобы вычислить градиент численно, dlarray конструирует структуру данных для дифференциации в обратном режиме, как описано в разделе Фон автоматической дифференциации. Эта структура данных является трассировкой вычисления производной. Помните следующие рекомендации при использовании автоматической дифференциации и трассировки производных:

  • Не вводить новый dlarray внутри вычисления целевой функции и попытки дифференцировать относительно этого объекта. Например:

    function [dy,dy1] = fun(x1)
    x2 = dlarray(0);
    y = x1 + x2;
    dy = dlgradient(y,x2); % Error: x2 is untraced
    dy1 = dlgradient(y,x1); % No error even though y has an untraced portion
    end
  • Не использовать extractdata с отслеживаемым аргументом. Это нарушает трассировку. Например:

    fun = @(x)dlgradient(x + atan(extractdata(x)),x);
    % Gradient for any point is 1 due to the leading 'x' term in fun.
    dlfeval(fun,dlarray(2.5))
    ans =
    
      1x1 dlarray
    
         1

    Тем не менее, вы можете использовать extractdata ввести новую независимую переменную из зависимой.

  • При параллельной работе перемещение отслеживаемых объектов dlarray между клиентом и работниками нарушает трассировку. Объект traced dlarray сохраняется на работнике и загружается в клиент как объект untraced dlarray. Чтобы избежать нарушения трассировки при параллельной работе, вычислите все необходимые градиенты на рабочем столе, а затем объедините градиенты на клиенте. Пример см. в разделе Сеть поездов параллельно с пользовательским контуром обучения.

  • Используйте только поддерживаемые функции. Список поддерживаемых функций см. в разделе Список функций с поддержкой dlarray. Чтобы использовать неподдерживаемую функцию f, попробуйте реализовать f с помощью поддерживаемых функций.

Характеристики автоматических производных

  • Градиенты можно вычислить с помощью автоматического дифференцирования только для скалярных функций. Промежуточные вычисления могут иметь любое количество переменных, но конечное значение функции должно быть скалярным. Если нужно взять производные векторной функции, возьмите производные одного компонента за раз. В этом случае рассмотрите возможность установки dlgradient 'RetainData' аргумент пары имя-значение для true.

  • Вызов dlgradient вычисляет производные в определенной точке. Программное обеспечение обычно делает произвольный выбор для значения производной, когда нет теоретического значения. Например, relu функция, relu(x) = max(x,0), не дифференцируется при x = 0. Однако dlgradient возвращает значение производной.

    x = dlarray(0);
    y = dlfeval(@(t)dlgradient(relu(t),t),x)
    y =
    
      1x1 dlarray
    
         0

    Значение в ближайшей точке eps отличается.

    x = dlarray(eps);
    y = dlfeval(@(t)dlgradient(relu(t),t),x)
    y =
    
      1x1 dlarray
    
         1

См. также

| | |

Связанные темы