Contenido principal

dlgradient

Calcular gradientes para bucles de entrenamiento personalizados usando diferenciación automática

Descripción

La función dlgradient calcula derivadas utilizando la diferenciación automática.

Sugerencia

Para la mayor parte de las tareas de deep learning, puede utilizar una red neuronal preentrenada y adaptarla a sus propios datos. Para ver un ejemplo de cómo usar la transferencia del aprendizaje para volver a entrenar una red neuronal convolucional para clasificar un nuevo conjunto de imágenes, consulte Volver a entrenar redes neuronales para clasificar nuevas imágenes. Como alternativa, puede crear y entrenar redes neuronales desde cero usando las funciones trainnet y trainingOptions.

Si la función trainingOptions no proporciona las opciones de entrenamiento que necesita para la tarea, puede crear un bucle de entrenamiento personalizado mediante diferenciación automática. Para obtener más información, consulte Entrenar una red con un bucle de entrenamiento personalizado.

Si la función trainnet no proporciona la función de pérdida que necesita para la tarea, puede especificar una función de pérdida personalizada para trainnet como identificador de función. Para las funciones de pérdida que requieren más entradas que las predicciones y los objetivos (por ejemplo, funciones de pérdida que requieren acceso a la red neuronal o entradas adicionales), entrene el modelo usando un bucle de entrenamiento personalizado. Para obtener más información, consulte Entrenar una red con un bucle de entrenamiento personalizado.

Si Deep Learning Toolbox™ no proporciona las capas que necesita para la tarea, puede crear una capa personalizada. Para obtener más información, consulte Definir capas de deep learning personalizadas. Para los modelos que no se pueden especificar como redes de capas, puede definir el modelo como una función. Para obtener más información, consulte Train Network Using Model Function.

Para obtener más información sobre qué método de entrenamiento usar para cada tarea, consulte Train Deep Learning Model in MATLAB.

[dydx1,...,dydxk] = dlgradient(y,x1,...,xk) devuelve los gradientes de y respecto a las variables desde x1 hasta xk.

Llame a dlgradient desde dentro de una función pasada a dlfeval. Consulte Calcular gradientes usando diferenciación automática y Use Automatic Differentiation In Deep Learning Toolbox.

ejemplo

[dydx1,...,dydxk] = dlgradient(y,x1,...,xk,Name,Value) devuelve los gradientes y especifica opciones adicionales con uno o más pares nombre-valor. Por ejemplo, dydx = dlgradient(y,x,'RetainData',true) provoca que el gradiente retenga valores intermedios para reutilizarlos en llamadas a dlgradient posteriores. Esta sintaxis puede ahorrar tiempo, pero utiliza más memoria. Para obtener más información, consulte Consejos.

Ejemplos

contraer todo

La función de Rosenbrock es una función de prueba estándar para optimización. La función de ayuda rosenbrock.m calcula el valor de la función y usa la diferenciación automática para calcular su gradiente.

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

Para evaluar la función de Rosenbrock y su gradiente en el punto [–1,2], cree un objeto dlarray del punto y, después, llame a dlfeval en el identificador de función @rosenbrock.

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

   104

gradval = 
  1×2 dlarray

   396   200

De manera alternativa, defina la función de Rosenbrock como una función de dos entradas, x1 y 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

Llame a dlfeval para evaluar rosenbrock2 en dos argumentos de dlarray que representan las entradas –1 y 2.

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

   104

dydx1 = 
  1×1 dlarray

   396

dydx2 = 
  1×1 dlarray

   200

Represente el gradiente de la función de Rosenbrock para varios puntos en el cuadrado de la unidad. Primero, inicialice los arreglos que representan los puntos de evaluación y la salida de la función.

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

Evalúe la función en un bucle. Represente el resultado utilizando 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 with xlabel x1, ylabel x2 contains an object of type quiver.

Use dlgradient y dlfeval para calcular el valor y el gradiente de una función que implica números complejos. Puede calcular gradientes complejos o restringir los gradientes a solo números reales.

Defina la función complexFun, que se enumera al final de este ejemplo. Esta función implementa la siguiente fórmula compleja:

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

Defina la función gradFun, que se enumera al final de este ejemplo. Esta función llama a complexFun y usa dlgradient para calcular el gradiente del resultado con respecto a la entrada. Para la diferenciación automática, el valor para diferenciar, es decir, el valor de la función calculado a partir de la entrada, debe ser un escalar real, por lo que la función toma la suma de la parte real del resultado antes de calcular el gradiente. La función devuelve la parte real del valor de la función y del gradiente, que puede ser complejo.

Defina los puntos de muestra sobre el plano complejo entre -2 y 2 y -2i y 2i y conviértalos a dlarray.

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

Calcule el valor de la función y del gradiente en cada punto de muestra.

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

Defina los puntos de muestra en los que mostrar el gradiente.

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

Extraiga los valores del gradiente en esos puntos de muestra.

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

Represente los resultados. Use imagesc para mostrar el valor de la función sobre el plano complejo. Use quiver para mostrar la dirección y la magnitud del gradiente.

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")

El gradiente de la función es el mismo en todo el plano complejo. Extraiga el valor del gradiente calculado mediante diferenciación automática.

grad(1,1)
ans = 
  1×1 dlarray

   2.0000 - 3.0000i

Si la examina, la derivada compleja de la función tiene el valor

df(x)dx=2+3i

Sin embargo, la función Re(f(x)) no es analítica y, por lo tanto, no se define ninguna derivada compleja. Para la diferenciación automática en MATLAB, el valor que se desea diferenciar debe ser siempre real y, por lo tanto, la función nunca puede ser analítica compleja. En su lugar, la derivada se calcula de modo que el gradiente devuelto apunte en la dirección del ascenso más pronunciado, tal como se ve en la gráfica. Esto se hace interpretando la función Re(f(x)): C R como una función Re(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

Argumentos de entrada

contraer todo

Variable que se desea diferenciar, especificada como un objeto dlarray escalar. Para la diferenciación, y debe ser una función rastreada de entradas de objetos dlarray (consulte dlarray rastreado) y debe constar de funciones compatibles con la función dlarray (consulte List of Functions with dlarray Support).

La variable que se desea diferenciar debe ser real incluso cuando la opción nombre-valor 'AllowComplex' está establecida en true.

Ejemplo: 100*(x(2) - x(1).^2).^2 + (1 - x(1)).^2

Ejemplo: relu(X)

Tipos de datos: single | double | logical

Variable en la función, especificada como un objeto dlarray, un arreglo de celdas, una estructura o una tabla que contienen objetos dlarray o cualquier combinación de este tipo de argumentos de forma recursiva. Por ejemplo, un argumento puede ser un arreglo de celdas que contiene un arreglo de celdas que contiene una estructura que contiene objetos dlarray.

Si especifica x1,...,xk como una tabla, la tabla debe contener las siguientes variables:

  • Layer: nombre de la capa, especificado como un escalar de cadena.

  • Parameter: nombre del parámetro, especificado como un escalar de cadena.

  • Value: valor del parámetro, especificado como un arreglo de celdas que contiene un objeto dlarray.

Ejemplo: dlarray([1 2;3 4])

Tipos de datos: single | double | logical | struct | cell
Soporte de números complejos:

Argumentos de par nombre-valor

contraer todo

Especifique pares de argumentos opcionales como Name1=Value1,...,NameN=ValueN, donde Name es el nombre del argumento y Value es el valor correspondiente. Los argumentos de nombre-valor deben aparecer después de otros argumentos. Sin embargo, el orden de los pares no importa.

En las versiones anteriores a la R2021a, use comas para separar cada nombre y valor, y encierre Name entre comillas.

Ejemplo: dydx = dlgradient(y,x,'RetainData',true) provoca que el gradiente retenga valores intermedios para reutilizarlos en llamadas a dlgradient posteriores

Indicador para retener datos usados para calcular gradientes, especificado como uno de estos valores:

  • false o 0: no se retienen datos usados para calcular gradientes.

  • true o 1: se retienen datos usados para calcular gradientes en dydx1,...,dydxk. Las llamadas a dlgradient posteriores pueden reutilizar estos valores sin volver a calcularlos. El software descarta estos valores cuando la función dlfeval completa la evaluación. Esta opción solo es útil cuando la llamada a dlfeval contiene más de una llamada a la función dlgradient. Puede ahorrar tiempo cuando varias llamadas a dlgradient utilizan partes del mismo rastreo, a costa de un uso adicional de memoria.

Cuando EnableHigherDerivatives es true, el software retiene los datos usados para calcular gradientes y el argumento RetainData no tiene ningún efecto.

Ejemplo: dydx = dlgradient(y,x,'RetainData',true)

Tipos de datos: logical

Indicador para habilitar derivadas de orden superior, especificado como uno de estos valores:

  • 1 (true) numérico o lógico: habilita derivadas de orden superior. Rastrea el paso hacia atrás para que los valores devueltos se puedan utilizar en otros cálculos para llamadas posteriores a funciones que calculan derivadas con diferenciación automática (por ejemplo, dlgradient, dljacobian, dldivergence y dllaplacian).

  • 0 (false) numérico o lógico: deshabilita derivadas de orden superior. No rastrea el paso hacia atrás. Cuando desee calcular solo derivadas de primer orden, esta opción es normalmente más rápida y requiere menos memoria.

Cuando se usa la función dlgradient dentro de un objeto AcceleratedFunction, el valor predeterminado es true. De lo contrario, el valor predeterminado es false.

Si EnableHigherDerivatives es true, los valores intermedios se retienen y el argumento RetainData no tiene ningún efecto.

Para ver un ejemplo de cómo entrenar un modelo que requiere calcular derivadas de orden superior, consulte Train Wasserstein GAN with Gradient Penalty (WGAN-GP).

Indicador para permitir variables complejas en funciones y gradientes complejos, especificado como uno de los siguientes:

  • true: permite variables complejas en funciones y gradientes complejos. Las variables en la función se pueden especificar como números complejos. Los gradientes pueden ser complejos incluso si todas las variables son reales. La variable que se desea diferenciar debe ser real.

  • false: no permite variables y gradientes complejos. La variable que se desea diferenciar y cualquier variable en la función deben ser reales. Los gradientes siempre son reales. Los valores intermedios pueden seguir siendo complejos.

La variable que se desea diferenciar debe ser real incluso cuando la opción nombre-valor 'AllowComplex' está establecida en true.

Tipos de datos: logical

Argumentos de salida

contraer todo

Gradiente, especificado como un objeto dlarray o un arreglo de celdas, una estructura o una tabla que contienen objetos dlarray, o cualquier combinación de este tipo de argumentos de forma recursiva. El tamaño y el tipo de datos de dydx1,...,dydxk son los mismos que los de la variable de entrada asociada x1,…,xk.

Limitaciones

  • La función dlgradient no es compatible con el cálculo de derivadas de orden superior cuando se usan objetos dlnetwork que contienen capas personalizadas con una función de retropropagación personalizada.

  • La función dlgradient no es compatible con el cálculo de derivadas de orden superior cuando se usan objetos dlnetwork que contienen las siguientes capas:

    • gruLayer

    • lstmLayer

    • bilstmLayer

  • La función dlgradient no es compatible con el cálculo de derivadas de orden superior que dependen de las siguientes funciones:

    • gru

    • lstm

    • embed

    • prod

    • interp1

Más acerca de

contraer todo

Sugerencias

  • Una llamada de dlgradient debe estar dentro de una función. Para obtener un valor numérico de un gradiente, debe evaluar la función utilizando dlfeval y el argumento de la función debe ser un objeto dlarray. Consulte Use Automatic Differentiation In Deep Learning Toolbox.

  • Para permitir la evaluación correcta de los gradientes, el argumento y debe usar solo funciones que sean compatibles con objetos dlarray. Consulte List of Functions with dlarray Support.

  • Si establece el argumento de par nombre-valor 'RetainData' en true, el software preserva el rastreo durante la llamada a la función dlfeval en lugar de borrar el rastreo inmediatamente después del cálculo de la derivada. Esta preservación puede provocar que una llamada a dlgradient posterior dentro de la misma llamada a dlfeval se ejecute con más rapidez, pero utiliza más memoria. Por ejemplo, cuando se entrena una red antagónica. el ajuste 'RetainData' resulta útil porque las dos redes comparten datos y funciones durante el entrenamiento. Consulte Entrenar redes generativas antagónicas (GAN).

  • Cuando necesite calcular solo derivadas de primer orden, asegúrese de que la opción 'EnableHigherDerivatives' es false, ya que es normalmente más rápida y requiere menos memoria.

  • Los gradientes complejos se calculan utilizando la derivada de Wirtinger. El gradiente está definido en la dirección de aumento de la parte real de la función que se desea diferenciar. Esto se debe a que la variable que se desea diferenciar, por ejemplo, la pérdida, debe ser real, aunque la función sea compleja.

  • Para acelerar las llamadas a funciones de deep learning, como funciones de modelo y funciones de pérdida de modelo, puede utilizar la función dlaccelerate. La función devuelve un objeto AcceleratedFunction que optimiza, almacena en caché y reutiliza automáticamente los rastreos.

Capacidades ampliadas

expandir todo

Historial de versiones

Introducido en R2019b