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