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

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

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

Обычно самый простой способ настроить обучение глубокому обучению состоит в том, чтобы создать 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);

Целевая функция имеет a 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 синтаксис, смотрите, что 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

Для примера с помощью автоматического дифференцирования смотрите, что CAM градиента Показывает Почему Позади Решений Глубокого обучения.

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

Оценивать градиент численно, dlarray создает структуру данных для дифференцирования реверсного режима, как описано в Автоматическом Фоне Дифференцирования. Этой структурой данных является 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. Чтобы постараться не повреждать трассировку при работе параллельно, вычислите все необходимые градиенты на рабочем и затем объедините градиенты на клиенте. Для примера смотрите, Обучат сеть параллельно с Пользовательским Учебным Циклом.

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

Смотрите также

| | |

Похожие темы