Main Content

trainlm

Retropropagación Levenberg-Marquardt

Descripción

net.trainFcn = 'trainlm' establece la propiedad de red trainFcn.

ejemplo

[trainedNet,tr] = train(net,...) entrena la red con trainlm.

trainlm es una función de entrenamiento de red que actualiza los valores de peso y sesgo de acuerdo con la optimización Levenberg-Marquardt.

trainlm es generalmente el algoritmo de retropropagación más rápido de la toolbox, y se recomienda como el algoritmo supervisado óptimo, a pesar de que requiere más memoria que otros.

El entrenamiento se lleva a cabo según los parámetros de entrenamiento trainlm, que se muestran a continuación con sus valores predeterminados:

  • net.trainParam.epochs: número máximo de épocas que desea entrenar. El valor predeterminado es 1000.

  • net.trainParam.goal: objetivo de rendimiento. El valor predeterminado es 0.

  • net.trainParam.max_fail: máximo de errores de validación. El valor predeterminado es 6.

  • net.trainParam.min_grad: gradiente mínimo de rendimiento. El valor predeterminado es 1e-7.

  • net.trainParam.mu: mu inicial. El valor predeterminado es 0.001.

  • net.trainParam.mu_dec: factor de disminución de mu. El valor predeterminado es 0.1.

  • net.trainParam.mu_inc: factor de aumento de mu. El valor predeterminado es 10.

  • net.trainParam.mu_max: valor máximo de mu. El valor predeterminado es 1e10.

  • net.trainParam.show: épocas entre muestras (NaN cuando no hay muestras). El valor predeterminado es 25.

  • net.trainParam.showCommandLine: generar una salida en la línea de comandos. El valor predeterminado es false.

  • net.trainParam.showWindow: mostrar la interfaz gráfica del entrenamiento. El valor predeterminado es true.

  • net.trainParam.time: tiempo máximo de entrenamiento en segundos. El valor predeterminado es inf.

Los vectores de validación se utilizan para detener el entrenamiento antes de tiempo si el rendimiento de la red en los vectores de validación no mejora o se mantiene sin cambios durante max_fail épocas seguidas. Los vectores de prueba se utilizan a modo de verificación adicional de que la red está generalizando bien, pero no afectan al entrenamiento.

Ejemplos

contraer todo

Este ejemplo muestra cómo entrenar una red neuronal con la función de entrenamiento trainlm.

A continuación se muestra un ejemplo de cómo se entrena una red neuronal para predecir porcentajes de grasa corporal.

[x, t] = bodyfat_dataset;
net = feedforwardnet(10, 'trainlm');
net = train(net, x, t);

{"String":"Figure Neural Network Training (24-Jul-2022 21:30:01) contains an object of type uigridlayout.","Tex":[],"LaTex":[]}

y = net(x);

Argumentos de entrada

contraer todo

Red de entrada, especificada como un objeto de red. Para crear un objeto de red, use feedforwardnet o narxnet, por ejemplo.

Argumentos de salida

contraer todo

Red entrenada, devuelta como un objeto network.

Registro de entrenamiento (epoch y perf), devuelto como una estructura cuyos campos dependen de la función de entrenamiento de la red (net.NET.trainFcn). Puede incluir campos como los siguientes:

  • Funciones y parámetros de entrenamiento, división de datos y rendimiento

  • Índices de división de datos para conjuntos de entrenamiento, validación y prueba

  • Máscaras de división de datos para conjuntos de entrenamiento, validación y prueba

  • Número de épocas (num_epochs) y la mejor época (best_epoch)

  • Una lista de los nombres de estado de entrenamiento (states)

  • Los campos de cada nombre de estado que registra su valor durante el entrenamiento

  • Rendimientos de la mejor red (best_perf, best_vperf y best_tperf)

Limitaciones

Esta función usa la matriz jacobiana para realizar los cálculos, lo que implica que el rendimiento es una media o suma del cuadrado de los errores. Por lo tanto, las redes entrenadas con esta función deben usar las funciones de rendimiento mse o sse.

Más acerca de

contraer todo

Algoritmo de Levenberg-Marquardt

Al igual que los métodos quasi-Newton, el algoritmo de Levenberg-Marquardt se diseñó para aproximarse a la velocidad de entrenamiento de segundo orden sin necesidad de calcular la matriz hessiana. Cuando la función de rendimiento tiene la forma de una suma de cuadrados (como es típico en el entrenamiento de redes prealimentadas), es posible aproximar la matriz hessiana de esta manera:

H = JTJ(1)

y el gradiente puede calcularse como:

g = JTe(2)

donde J es la matriz jacobiana que contiene las primeras derivadas de los errores de red en relación con los pesos y los sesgos y e es un vector de errores de red. Es posible calcular la matriz jacobiana mediante una técnica estándar de retropropagación (ver [HaMe94]) mucho menos compleja que el cálculo de la matriz hessiana.

El algoritmo de Levenberg-Marquardt utiliza esta aproximación a la matriz hessiana en la siguiente actualización de tipo Newton:

xk+1=xk[JTJ+μI]1JTe

Cuando el escalar µ es cero, se trata simplemente del método de Newton utilizando la matriz hessiana aproximada. Cuando µ es grande, pasa a ser un gradiente descendente con un tamaño de paso pequeño. El método de Newton es más rápido y preciso y tiene un margen de error mínimo, por lo que el objetivo es pasar a utilizar el método de Newton lo antes posible. Por lo tanto, µ disminuye tras cada paso realizado con éxito (reducción en la función de rendimiento) y aumenta solo cuando un paso tentativo aumenta la función de rendimiento. De esta forma, la función de rendimiento siempre se reduce en cada iteración del algoritmo.

La descripción original del algoritmo de Levenberg-Marquardt se encuentra en [Marq63]. La aplicación de Levenberg-Marquardt al entrenamiento de redes neuronales se describe en [HaMe94] y a partir de las páginas 12-19 de [HDB96]. Al parecer, este algoritmo es el método más rápido para entrenar redes neuronales prealimentadas de tamaño moderado (hasta varios cientos de pesos). Además, es posible implementarlo de forma eficiente en el software MATLAB®, ya que la solución de la ecuación de la matriz es una función incorporada, por lo que sus atributos son incluso más pronunciados en un entorno MATLAB.

Pruebe la demostración Neural Network Design nnd12m [HDB96] para ver una aplicación práctica del rendimiento que ofrece el algoritmo de Levenberg-Marquardt por lotes.

Uso de la red

Puede crear una red estándar que use trainlm con feedforwardnet o cascadeforwardnet. Para preparar una red personalizada que se entrene con trainlm:

  1. Establezca NET.trainFcn en trainlm. Esto establece NET.trainParam en los parámetros predeterminados de trainlm.

  2. Establezca las propiedades NET.trainParam en los valores que desee.

En cualquier caso, llamar a train con la red resultante entrena la red con trainlm. Para ver ejemplos, consulte feedforwardnet y cascadeforwardnet.

Algoritmos

trainlm admite el entrenamiento con vectores de validación y de prueba si la propiedad NET.divideFcn de la red está establecida como una función de división de datos. Los vectores de validación se utilizan para detener el entrenamiento antes de tiempo si el rendimiento de la red en los vectores de validación no mejora o se mantiene sin cambios durante max_fail épocas seguidas. Los vectores de prueba se utilizan a modo de verificación adicional de que la red está generalizando bien, pero no afectan al entrenamiento.

trainlm puede entrenar cualquier red, siempre y cuando su peso, entrada combinada y funciones de transferencia tengan funciones derivadas.

La retropropagación se utiliza para calcular la matriz jacobiana jX del rendimiento perf con respecto a las variables de peso y sesgo X. Cada variable se ajusta según Levenberg-Marquardt:

jj = jX * jX
je = jX * E
dX = -(jj+I*mu) \ je

donde E son todo errores y I es la matriz identidad.

El valor adaptativo mu aumenta en mu_inc hasta que el cambio anterior da como resultado un valor de rendimiento reducido. El cambio se realiza después en la red y mu se reduce en mu_dec.

El entrenamiento se detiene cuando tiene lugar alguna de estas condiciones:

  • Se ha alcanzado el número máximo de epochs (repeticiones).

  • Se ha sobrepasado el máximo de time.

  • El rendimiento se minimiza al goal.

  • El gradiente de rendimiento está por debajo de min_grad.

  • mu sobrepasa a mu_max.

  • El rendimiento de validación (error de validación) ha aumentado más de max_fail veces desde la última vez que disminuyó (al utilizar la validación).

Historial de versiones

Introducido antes de R2006a