Автоматическая дифференциация облегчает создание пользовательских циклов обучения, пользовательских слоев и других индивидуальных настроек глубокого обучения.
Как правило, самый простой способ настроить обучение глубокого обучения - это создать 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
dlarray
| dlfeval
| dlgradient
| dlnetwork