Используйте автоматическую дифференциацию в Deep Learning Toolbox

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

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

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

Этот пример является высокоуровневой версией пользовательского цикла обучения. Здесь, f является целевой функцией, такой как потеря и g - градиент целевой функции относительно весов в сети net. The 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 раскрывает причины решений по глубокому обучению». Более сложный пример использования пользовательского цикла обучения см. в Train генеративной состязательной сети» (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 создает структуру данных для дифференцирования в обратном режиме, как описано в Automatic Differentiation Background. Эта структура данных является trace производных расчетов. Имейте в виду эти рекомендации при использовании автоматической дифференциации и трассировки производной:

  • Не вводите новую 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 между клиентом и работниками нарушает трассировку. Трассированный объект dlarray сохраняется в рабочем окне и загружается в клиенте как неотследимый объект dlarray. Чтобы избежать нарушения трассировки при параллельной работе, вычислите все необходимые градиенты в рабочем процессе и затем объедините градиенты в клиентском компьютере. Для получения примера смотрите Train Сеть параллельно с Пользовательским циклом обучения.

  • Используйте только поддерживаемые функции. Список поддерживаемых функций см. в Списке функций с поддержкой 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

См. также

| | |

Похожие темы