dlgradient

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

Описание

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

Совет

Для большинства задач глубокого обучения можно использовать предварительно обученную сеть и адаптировать ее к собственным данным. Для примера, показывающего, как использовать передачу обучения, чтобы переобучить сверточную нейронную сеть, чтобы классифицировать новый набор изображений, смотрите, Обучают Нейронную сеть для глубокого обучения Классифицировать Новые Изображения. В качестве альтернативы можно создать и обучить нейронные сети с нуля с помощью layerGraph объекты с trainNetwork и trainingOptions функции.

Если trainingOptions функция не обеспечивает опции обучения, в которых вы нуждаетесь для своей задачи, затем можно создать пользовательский учебный цикл с помощью автоматического дифференцирования. Чтобы узнать больше, смотрите, Задают Нейронную сеть для глубокого обучения для Пользовательских Учебных Циклов.

пример

[dydx1,...,dydxk] = dlgradient(y,x1,...,xk) возвращает градиенты y относительно переменных x1 через xk.

Вызвать dlgradient из функции, переданной dlfeval. Смотрите вычисляют градиент Используя автоматическое дифференцирование и используют автоматическое дифференцирование в Deep Learning Toolbox.

[dydx1,...,dydxk] = dlgradient(y,x1,...,xk,Name,Value) возвращает градиенты и задает дополнительные опции с помощью одной или нескольких пар "имя-значение". Например, dydx = dlgradient(y,x,'RetainData',true) заставляет градиент сохранять промежуточные значения для повторного использования в последующем dlgradient вызовы. Этот синтаксис может сэкономить время, но использует больше памяти. Для получения дополнительной информации смотрите Советы.

Примеры

свернуть все

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

type rosenbrock.m
function [y,dydx] = rosenbrock(x)

y = 100*(x(2) - x(1).^2).^2 + (1 - x(1)).^2;
dydx = dlgradient(y,x);

end

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

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

   104

gradval = 
  1x2 dlarray

   396   200

В качестве альтернативы задайте функцию Розенброка в зависимости от двух входных параметров, x1 и x2.

type rosenbrock2.m
function [y,dydx1,dydx2] = rosenbrock2(x1,x2)

y = 100*(x2 - x1.^2).^2 + (1 - x1).^2;
[dydx1,dydx2] = dlgradient(y,x1,x2);

end

Вызовите dlfeval оценивать rosenbrock2 на двух dlarray аргументы, представляющие входные параметры –1 и 2.

x1 = dlarray(-1);
x2 = dlarray(2);
[fval,dydx1,dydx2] = dlfeval(@rosenbrock2,x1,x2)
fval = 
  1x1 dlarray

   104

dydx1 = 
  1x1 dlarray

   396

dydx2 = 
  1x1 dlarray

   200

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

[X1 X2] = meshgrid(linspace(0,1,10));
X1 = dlarray(X1(:));
X2 = dlarray(X2(:));
Y = dlarray(zeros(size(X1)));
DYDX1 = Y;
DYDX2 = Y;

Выполните функцию в цикле. Постройте результат с помощью quiver.

for i = 1:length(X1)
    [Y(i),DYDX1(i),DYDX2(i)] = dlfeval(@rosenbrock2,X1(i),X2(i));
end
quiver(extractdata(X1),extractdata(X2),extractdata(DYDX1),extractdata(DYDX2))
xlabel('x1')
ylabel('x2')

Figure contains an axes object. The axes object contains an object of type quiver.

Используйте dlgradient и dlfeval вычислить значение и градиент функции, которая включает комплексные числа. Можно вычислить комплексные градиенты или ограничить градиенты вещественными числами только.

Задайте функциональный complexFun, перечисленный в конце этого примера. Эта функция реализует следующую сложную формулу:

f(x)=(2+3i)x

Задайте функциональный gradFun, перечисленный в конце этого примера. Это вызовы функции complexFun и использование dlgradient вычислить градиент результата относительно входа. Для автоматического дифференцирования, значение, чтобы дифференцироваться — i.e., значение функции, вычисленной от входа — должно быть действительным скаляром, таким образом, функция берет сумму действительной части результата прежде, чем вычислить градиент. Функция возвращает действительную часть значения функции и градиента, который может быть комплексным.

Задайте точки выборки по комплексной плоскости между-2 и 2 и-2i и 2i и преобразуйте в dlarray.

functionRes = linspace(-2,2,100);
x = functionRes + 1i*functionRes.';
x = dlarray(x);

Вычислите значение функции и градиент в каждой точке выборки.

[y, grad] = dlfeval(@gradFun,x);
y = extractdata(y);

Задайте точки выборки, в которых можно отобразить градиент.

gradientRes = linspace(-2,2,11);
xGrad = gradientRes + 1i*gradientRes.';

Извлеките значения градиента в этих точках выборки.

[~,gradPlot] = dlfeval(@gradFun,dlarray(xGrad));
gradPlot = extractdata(gradPlot);

Постройте график результатов. Используйте imagesc показать значение функции по комплексной плоскости. Используйте quiver показать направление и величину градиента.

imagesc([-2,2],[-2,2],y);
axis xy
colorbar
hold on
quiver(real(xGrad),imag(xGrad),real(gradPlot),imag(gradPlot),"k");
xlabel("Real")
ylabel("Imaginary")
title("Real Value and Gradient","Re$(f(x)) = $ Re$((2+3i)x)$","interpreter","latex")

Figure contains an axes object. The axes object with title Real Value and Gradient contains 2 objects of type image, quiver.

Градиент функции является тем же самым через целую комплексную плоскость. Извлеките значение градиента, вычисленного автоматическим differentation.

grad(1,1)
ans = 
  1x1 dlarray

   2.0000 - 3.0000i

Контролем комплексная производная функции имеет значение

df(x)dx=2+3i

Однако функциональное Ре (f(x)) не аналитично, и поэтому никакая комплексная производная не задана. Для автоматического дифференцирования в MATLAB значение, чтобы дифференцироваться должно всегда быть действительным, и поэтому функция никогда не может быть комплексная аналитичный. Вместо этого производная вычисляется таким образом, что возвращенный градиент указывает в направлении самого крутого подъема, как замечено в графике. Это сделано путем интерпретации функционального Ре(f(x))C R как функциональное Ре(f(xR+ixI))R × R R.

function y = complexFun(x)
    y = (2+3i)*x;    
end

function [y,grad] = gradFun(x)
    y = complexFun(x);
    y = real(y);

    grad = dlgradient(sum(y,"all"),x);
end

Входные параметры

свернуть все

Переменная, чтобы дифференцироваться в виде скалярного dlarray объект. Для дифференцирования, y должна быть прослеженная функция dlarray входные параметры (см. Прослеженный dlarray) и должны состоять из поддерживаемых функций для dlarray (см. Список Функций с Поддержкой dlarray).

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

Пример: 100*(x(2) - x(1).^2).^2 + (1 - x(1)).^2

Пример: relu(X)

Типы данных: single | double | logical

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

Если вы задаете x1,...,xk как таблица, таблица должна содержать следующие переменные:

  • Layer — Имя слоя в виде строкового скаляра.

  • Parameter — Название параметра в виде строкового скаляра.

  • Value — Значение параметра в виде массива ячеек, содержащего dlarray.

Пример: dlarray([1 2;3 4])

Типы данных: single | double | logical | struct | cell
Поддержка комплексного числа: Да

Аргументы name-value

Задайте дополнительные разделенные запятой пары Name,Value аргументы. Name имя аргумента и Value соответствующее значение. Name должен появиться в кавычках. Вы можете задать несколько аргументов в виде пар имен и значений в любом порядке, например: Name1, Value1, ..., NameN, ValueN.

Пример: dydx = dlgradient(y,x,'RetainData',true) заставляет градиент сохранять промежуточные значения для повторного использования в последующем dlgradient вызовы

Отметьте, чтобы сохранить данные о трассировке во время вызова функции в виде false или true. Когда этим аргументом является false, dlarray сразу отбрасывает производную трассировку после вычисления производной. Когда этим аргументом является true, dlarray сохраняет производную трассировку до конца dlfeval вызов функции, который оценивает dlgradient. true установка полезна только когда dlfeval вызов содержит больше чем один dlgradient вызвать. true установка заставляет программное обеспечение использовать больше памяти, но может сэкономить время когда несколько dlgradient вызовы используют, по крайней мере, часть той же трассировки.

Когда 'EnableHigherDerivatives' true, затем промежуточные значения сохраняются и 'RetainData' опция не оказывает влияния.

Пример: dydx = dlgradient(y,x,'RetainData',true)

Типы данных: логический

Отметьте, чтобы включить производные высшего порядка в виде одного из следующего:

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

  • false — Отключите производные высшего порядка. Не прослеживайте обратный проход. Используйте эту опцию, когда необходимо вычислить производные первого порядка только, когда это обычно быстрее и требует меньшей памяти.

При использовании dlgradient функционируйте в AcceleratedFunction объект, значением по умолчанию является true. В противном случае значением по умолчанию является false.

Для примеров, показывающих, как обучить модели, которые требуют вычисления производных высшего порядка, см.:

Типы данных: логический

Отметьте, чтобы позволить комплексные переменные в функциональных и комплексных градиентах в виде одного из следующего:

  • true — Позвольте комплексные переменные в функциональных и комплексных градиентах. Переменные в функции могут быть заданы как комплексные числа. Градиенты могут быть комплексными, даже если все переменные действительны. Переменная, чтобы дифференцироваться должна быть действительной.

  • false — Не позволяйте комплексные переменные и градиенты. Переменная, чтобы дифференцироваться и любые переменные в функции должна быть вещественными числами. Градиенты всегда действительны. Промежуточные значения могут все еще быть комплексными.

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

Типы данных: логический

Выходные аргументы

свернуть все

Градиент, возвращенный как dlarray объект, или массив ячеек, структура или таблица, содержащая dlarray объекты или любая комбинация таких аргументов рекурсивно. Размер и тип данных dydx1,...,dydxk совпадают с теми из связанной входной переменной x1,…,xk.

Ограничения

  • dlgradient функция не поддерживает вычисление производных высшего порядка при использовании dlnetwork объекты, содержащие пользовательские слои с пользовательской обратной функцией.

  • dlgradient функция не поддерживает вычисление производных высшего порядка при использовании dlnetwork объекты, содержащие следующие слои:

    • gruLayer

    • lstmLayer

    • bilstmLayer

  • dlgradient функция не поддерживает вычисление производных высшего порядка, которые зависят от следующих функций:

    • gru

    • lstm

    • embed

    • prod

    • interp1

Больше о

свернуть все

Прослеженный dlarray

Во время расчета функции, dlarray внутренне записывает шаги, сделанные в trace, включая реверсному режиму автоматическое дифференцирование. Трассировка происходит в a dlfeval вызвать. Смотрите Автоматический Фон Дифференцирования.

Советы

  • A dlgradient вызов должен быть в функции. Чтобы получить числовое значение градиента, необходимо оценить функциональное использование dlfeval, и аргументом к функции должен быть dlarray. Смотрите использование автоматическое дифференцирование в Deep Learning Toolbox.

  • Включить правильную оценку градиентов, y аргумент должен использовать только поддерживаемые функции для dlarray. См. Список Функций с Поддержкой dlarray.

  • Если вы устанавливаете 'RetainData' аргумент пары "имя-значение" true, трассировка консервов программного обеспечения на время dlfeval вызов функции вместо того, чтобы сразу стереть трассировку после производного расчета. Это сохранение может вызвать последующее dlgradient вызовите в том же самом dlfeval вызовите, чтобы быть выполненными быстрее, но использует больше памяти. Например, в обучении соперничающей сети, 'RetainData' установка полезна, потому что эти две сети осуществляют обмен данными и функции во время обучения. Смотрите Обучают Порождающую соперничающую сеть (GAN).

  • Когда необходимо вычислить производные первого порядка только, гарантировать что 'EnableHigherDerivatives' опцией является false когда это обычно быстрее и требует меньшей памяти.

  • Комплексные градиенты вычисляются с помощью производной Wirtinger. Градиент задан в направлении увеличения действительной части функции, чтобы дифференцироваться. Это вызвано тем, что переменная, чтобы дифференцироваться — например, потеря — должна быть действительной, даже если функция является комплексной.

Расширенные возможности

Введенный в R2019b