Usar la diferenciación automática en Deep Learning Toolbox
Entrenamiento personalizado y cálculos mediante diferenciación automática
La diferenciación automática simplifica la creación de bucles de entrenamiento personalizados, capas personalizadas y otras personalizaciones de deep learning.
Por lo general, la forma más sencilla de personalizar un entrenamiento de deep learning es crear un objeto dlnetwork. Incluya las capas que desea en la red. Después, realice el entrenamiento en un bucle personalizado usando algún tipo de gradiente descendente, donde el gradiente sea el gradiente de la función objetivo. La función objetivo puede ser una función de error de clasificación, entropía cruzada o cualquier otra función escalar pertinente de los pesos de la red. Consulte List of Functions with dlarray Support.
Este ejemplo es una versión de alto nivel de un bucle de entrenamiento personalizado. En este caso, f es la función objetivo, como la pérdida, y g es el gradiente de la función objetivo con respecto a los pesos de la red net. La función update representa algún tipo de gradiente descendente.
% High-level training loop n = 1; while (n < nmax) [f,g] = dlfeval(@model,net,X,T); net = update(net,g); n = n + 1; end
Puede llamar a dlfeval para calcular el valor numérico de la función objetivo y el gradiente. Para habilitar el cálculo automático del gradiente, los datos X deben ser un dlarray.
X = dlarray(X);
La función objetivo tiene una llamada a dlgradient para calcular el gradiente. La llamada a dlgradient debe estar dentro de la función que dlfeval evalúa.
function [f,g] = model(net,X,T) % Calculate objective using supported functions for dlarray Y = forward(net,X); f = fcnvalue(Y,T); % crossentropy or similar g = dlgradient(f,net.Learnables); % Automatic gradient end
Para ver un ejemplo que use una red dlnetwork con una sintaxis dlfeval-dlgradient-dlarray y un bucle de entrenamiento personalizado, consulte Entrenar una red con un bucle de entrenamiento personalizado. Para obtener más información sobre entrenamiento personalizado mediante diferenciación automática, consulte Define Custom Training Loops, Loss Functions, and Networks.
Utilizar dlgradient y dlfeval para la diferenciación automática
Para usar la diferenciación automática, debe llamar a dlgradient dentro de una función y evaluar la función usando dlfeval. Represente el punto en el que toma una derivada como un objeto dlarray, que gestiona las estructuras de datos y habilita el rastreo de evaluación. Por ejemplo, la función de Rosenbrock es una función de prueba habitual para optimización.
function [f,grad] = rosenbrock(x) f = 100*(x(2) - x(1).^2).^2 + (1 - x(1)).^2; grad = dlgradient(f,x); end
Calcule el valor y el gradiente de la función de Rosenbrock en el punto x0 = [–1,2]. Para habilitar la diferenciación automática en la función de Rosenbrock, pase x0 como un objeto dlarray.
x0 = dlarray([-1,2]); [fval,gradval] = dlfeval(@rosenbrock,x0)
fval = 1x1 dlarray 104 gradval = 1x2 dlarray 396 200
Para ver un ejemplo que use la diferenciación automática, consulte Entrenar una red con un bucle de entrenamiento personalizado.
Rastreo de derivadas
Para evaluar numéricamente un gradiente, un objeto dlarray crea una estructura de datos para la diferenciación en modo inverso, tal como se describe en Información sobre la diferenciación automática. Esta estructura de datos es el rastreo del cálculo de la derivada. Tenga en cuenta estas directrices cuando use la diferenciación automática y el rastreo de derivadas:
No introduzca un objeto
dlarraynuevo dentro del cálculo de una función objetivo e intente realizar la diferenciación con respecto a ese objeto. Por ejemplo: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
No utilice
extractdatacon un argumento rastreado. Hacerlo rompe el rastreo. Por ejemplo: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 1Sin embargo, puede usar
extractdatapara introducir una nueva variable independiente a partir de una dependiente.Cuando trabaje en paralelo, si mueve objetos dlarray rastreados entre el cliente y los workers, el rastreo se rompe. El objeto dlarray rastreado se guarda en el worker y se carga en el cliente como un objeto dlarray no rastreado. Para evitar que se rompa el rastreo cuando trabaje en paralelo, calcule todos los gradientes requeridos en el worker y, después, combine los gradientes en el cliente. Para ver un ejemplo, consulte Train Network in Parallel with Custom Training Loop.
Utilice únicamente funciones compatibles. Para obtener una lista de funciones compatibles, consulte List of Functions with dlarray Support. Para utilizar una función no compatible f, pruebe a implementar f utilizando funciones compatibles.
Características de derivadas automáticas
Puede evaluar gradientes usando la diferenciación automática solo para funciones con valores escalares. Los cálculos intermedios pueden tener cualquier número de variables, pero el valor de la función final debe ser escalar. Si es necesario tomar derivadas de una función con valores vectoriales, tome derivadas de un componente cada vez. En este caso, considere establecer el argumento de par nombre-valor
'RetainData'dedlgradiententrue.Una llamada a
dlgradientevalúa derivadas en un punto concreto. El software hace, por lo general, una elección arbitraria del valor de una derivada cuando no hay un valor teórico. Por ejemplo, la funciónrelu,relu(x) = max(x,0), no es diferenciable enx = 0. Sin embargo,dlgradientdevuelve un valor para la derivada.x = dlarray(0); y = dlfeval(@(t)dlgradient(relu(t),t),x)
y = 1x1 dlarray 0El valor en el punto
epscercano es diferente.x = dlarray(eps); y = dlfeval(@(t)dlgradient(relu(t),t),x)
y = 1x1 dlarray 1
Consulte también
dlarray | dlgradient | dlfeval | dlnetwork | dljacobian | dldivergence | dllaplacian
Temas
- Entrenar redes generativas antagónicas (GAN)
- Define Custom Training Loops, Loss Functions, and Networks
- Entrenar una red con un bucle de entrenamiento personalizado
- Specify Training Options in Custom Training Loop
- Define Model Loss Function for Custom Training Loop
- Train Network Using Model Function
- Initialize Learnable Parameters for Model Function
- List of Functions with dlarray Support