dlgradient

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

Описание

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

Совет

Для большинства задач глубокого обучения можно использовать предварительно обученную сеть и адаптировать ее к собственным данным. Для примера, показывающего, как использовать передачу обучения для переобучения сверточной нейронной сети для классификации нового набора изображений, смотрите Train Нейронной сети для глубокого обучения для классификации новых изображений. Также можно создавать и обучать сети с нуля, используя 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 вызовы. Этот синтаксис может сэкономить время, но использует больше памяти. Для получения дополнительной информации см. советы».

Примеры

свернуть все

Функция Розенбрка является стандартной тестовой функцией для оптимизации. The 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 и x 2.

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. The axes contains an object of type quiver.

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

свернуть все

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

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

Пример: relu(X)

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

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

  • Layer - Имя слоя, заданное как строковый скаляр.

  • Parameter - Имя параметра, заданное как строковый скаляр.

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

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

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

Аргументы в виде пар имя-значение

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

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

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

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

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

Типы данных: logical

Флаг для включения производных высокого порядка, заданный как разделенная запятыми пара, состоящая из 'EnableHigherDerivatives' и одно из следующих:

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

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

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

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

Типы данных: logical

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

свернуть все

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

Ограничения

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

  • dlgraident функция не поддерживает вычисление производных более высокого порядка при использовании 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' настройка полезна, потому что две сети совместно используют данные и функции во время обучения. См. «Train генеративной состязательной сети» (GAN).

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

Введенный в R2019b