exponenta event banner

dlgradient

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

Описание

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

Совет

Для выполнения большинства задач глубокого обучения можно использовать предварительно подготовленную сеть и адаптировать ее к собственным данным. Пример, показывающий, как использовать transfer learning для переподготовки сверточной нейронной сети для классификации нового набора изображений, см. в разделе Train Deep Learning Network to Classify New Images. Кроме того, можно создавать и обучать сети с нуля с помощью layerGraph объекты с trainNetwork и trainingOptions функции.

Если trainingOptions функция не предоставляет возможности обучения, необходимые для выполнения задачи, после чего можно создать индивидуальный цикл обучения с помощью автоматического дифференцирования. Дополнительные сведения см. в разделе Определение сети глубокого обучения для пользовательских циклов обучения.

пример

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

Звонить dlgradient изнутри функция, переданная dlfeval. См. раздел Расчет градиента с использованием автоматической дифференциации и Использование автоматической дифференциации в инструментарии глубокого обучения.

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

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

свернуть все

Переменная для дифференцирования, заданная как скаляр dlarray объект. Для дифференциации, y должна быть отслеживаемой функцией dlarray входы (см. Traced 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, a dlarray отбрасывает производную трассировку сразу после вычисления производной. Когда этот аргумент true, a dlarray сохраняет след производной до конца dlfeval вызов функции, который вычисляет dlgradient. true параметр полезен только в том случае, если dlfeval вызов содержит более одного dlgradient звоните. true параметр заставляет программное обеспечение использовать больше памяти, но может сэкономить время, когда несколько dlgradient вызовы используют, по крайней мере, часть одной трассировки.

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

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

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

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

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

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

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

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

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

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

свернуть все

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

Ограничения

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

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

    • gruLayer

    • lstmLayer

    • bilstmLayer

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

    • gru

    • lstm

    • embed

    • prod

    • interp1

Подробнее

свернуть все

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

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

Совет

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

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

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

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

Представлен в R2019b