Entrenamiento de una red neuronal
Ahora aprenderemos a entrenar una red neuronal. También aprenderemos el algoritmo de propagación hacia atrás y el paso hacia atrás en Python Deep Learning.
Tenemos que encontrar los valores óptimos de los pesos de una red neuronal para obtener el resultado deseado. Para entrenar una red neuronal, utilizamos el método de descenso de gradiente iterativo. Comenzamos inicialmente con la inicialización aleatoria de los pesos. Después de la inicialización aleatoria, hacemos predicciones sobre algún subconjunto de los datos con el proceso de propagación hacia adelante, calculamos la función de costo correspondiente C y actualizamos cada peso w en una cantidad proporcional a dC / dw, es decir, la derivada de las funciones de costo wrt el peso. La constante de proporcionalidad se conoce como tasa de aprendizaje.
Los gradientes se pueden calcular de manera eficiente utilizando el algoritmo de retropropagación. La observación clave de la propagación hacia atrás o apoyo hacia atrás es que debido a la regla de diferenciación de la cadena, el gradiente en cada neurona en la red neuronal se puede calcular utilizando el gradiente en las neuronas, tiene bordes de salida hacia. Por lo tanto, calculamos los degradados hacia atrás, es decir, primero calculamos los degradados de la capa de salida, luego la capa superior más oculta, seguida de la capa oculta anterior, y así sucesivamente, terminando en la capa de entrada.
El algoritmo de retropropagación se implementa principalmente utilizando la idea de un gráfico computacional, donde cada neurona se expande a muchos nodos en el gráfico computacional y realiza una operación matemática simple como suma, multiplicación. El gráfico computacional no tiene pesos en los bordes; todos los pesos se asignan a los nodos, por lo que los pesos se convierten en sus propios nodos. El algoritmo de propagación hacia atrás se ejecuta luego en el gráfico computacional. Una vez que se completa el cálculo, solo se requieren los gradientes de los nodos de peso para la actualización. El resto de gradientes se pueden descartar.
Técnica de optimización del descenso de gradientes
Una función de optimización de uso común que ajusta los pesos de acuerdo con el error que causaron se llama "descenso de gradiente".
Gradiente es otro nombre para pendiente, y la pendiente, en un gráfico xy, representa cómo dos variables se relacionan entre sí: la elevación durante la carrera, el cambio en la distancia durante el cambio en el tiempo, etc. En este caso, la pendiente es la relación entre el error de la red y un solo peso; es decir, cómo cambia el error a medida que se varía el peso.
Para decirlo con más precisión, queremos encontrar qué peso produce el menor error. Queremos encontrar el peso que represente correctamente las señales contenidas en los datos de entrada y las traduzca a una clasificación correcta.
A medida que una red neuronal aprende, ajusta lentamente muchos pesos para que puedan asignar la señal al significado correctamente. La relación entre el error de red y cada uno de esos pesos es una derivada, dE / dw, que calcula hasta qué punto un ligero cambio en un peso provoca un ligero cambio en el error.
Cada peso es solo un factor en una red profunda que involucra muchas transformaciones; la señal del peso pasa a través de activaciones y sumas en varias capas, por lo que usamos la regla de la cadena de cálculo para trabajar hacia atrás a través de las activaciones y salidas de la red, lo que nos lleva al peso en cuestión y su relación con el error general.
Dadas dos variables, error y peso, están mediadas por una tercera variable, activation, a través del cual pasa el peso. Podemos calcular cómo un cambio en el peso afecta un cambio en el error calculando primero cómo un cambio en la activación afecta un cambio en el Error, y cómo un cambio en el peso afecta un cambio en la activación.
La idea básica en el aprendizaje profundo no es más que eso: ajustar los pesos de un modelo en respuesta al error que produce, hasta que ya no se pueda reducir el error.
La red profunda se entrena lentamente si el valor del gradiente es pequeño y rápido si el valor es alto. Cualquier inexactitud en la formación conduce a resultados inexactos. El proceso de entrenamiento de las redes desde la salida hasta la entrada se llama propagación hacia atrás o apoyo hacia atrás. Sabemos que la propagación hacia adelante comienza con la entrada y funciona hacia adelante. El apoyo trasero hace lo contrario / opuesto calculando el gradiente de derecha a izquierda.
Cada vez que calculamos un gradiente, usamos todos los gradientes anteriores hasta ese punto.
Empecemos por un nodo de la capa de salida. El borde usa el degradado en ese nodo. A medida que volvemos a las capas ocultas, se vuelve más complejo. El producto de dos números entre 0 y 1 le da un número menor. El valor del gradiente se hace cada vez más pequeño y, como resultado, el apoyo trasero lleva mucho tiempo para entrenar y la precisión se ve afectada.
Desafíos en los algoritmos de aprendizaje profundo
Existen ciertos desafíos tanto para las redes neuronales superficiales como para las redes neuronales profundas, como el sobreajuste y el tiempo de cálculo. Los DNN se ven afectados por el sobreajuste debido al uso de capas adicionales de abstracción que les permiten modelar dependencias raras en los datos de entrenamiento.
RegularizationDurante el entrenamiento se aplican métodos como el abandono, la detención anticipada, el aumento de datos y el aprendizaje por transferencia para combatir el sobreajuste. La regularización de abandono omite aleatoriamente las unidades de las capas ocultas durante el entrenamiento, lo que ayuda a evitar dependencias raras. Los DNN toman en consideración varios parámetros de entrenamiento como el tamaño, es decir, el número de capas y el número de unidades por capa, la tasa de aprendizaje y los pesos iniciales. Encontrar parámetros óptimos no siempre es práctico debido al alto costo de tiempo y recursos computacionales. Varios trucos, como el procesamiento por lotes, pueden acelerar el cálculo. La gran potencia de procesamiento de las GPU ha ayudado significativamente al proceso de entrenamiento, ya que los cálculos matriciales y vectoriales requeridos están bien ejecutados en las GPU.
Abandonar
La deserción es una técnica de regularización popular para redes neuronales. Las redes neuronales profundas son particularmente propensas a sobreajustarse.
Veamos ahora qué es la deserción y cómo funciona.
En palabras de Geoffrey Hinton, uno de los pioneros del aprendizaje profundo, 'si tiene una red neuronal profunda y no está sobreajustada, probablemente debería usar una más grande y usar abandono'.
El abandono es una técnica en la que durante cada iteración de descenso de gradiente, dejamos caer un conjunto de nodos seleccionados al azar. Esto significa que ignoramos algunos nodos al azar como si no existieran.
Cada neurona se mantiene con una probabilidad de q y se elimina aleatoriamente con una probabilidad de 1-q. El valor q puede ser diferente para cada capa de la red neuronal. Un valor de 0.5 para las capas ocultas y 0 para la capa de entrada funciona bien en una amplia gama de tareas.
Durante la evaluación y la predicción, no se utiliza ningún abandono. La salida de cada neurona se multiplica por q para que la entrada a la siguiente capa tenga el mismo valor esperado.
La idea detrás de la deserción es la siguiente: en una red neuronal sin regularización de la deserción, las neuronas desarrollan una codependencia entre sí que conduce a un sobreajuste.
Truco de implementación
El abandono se implementa en bibliotecas como TensorFlow y Pytorch manteniendo la salida de las neuronas seleccionadas al azar como 0. Es decir, aunque la neurona existe, su salida se sobrescribe como 0.
Parada anticipada
Entrenamos redes neuronales utilizando un algoritmo iterativo llamado descenso de gradiente.
La idea detrás de la parada temprana es intuitiva; dejamos de entrenar cuando el error comienza a aumentar. Aquí, por error, nos referimos al error medido en los datos de validación, que es la parte de los datos de entrenamiento que se utilizan para ajustar los hiperparámetros. En este caso, el hiperparámetro es el criterio de parada.
Aumento de datos
El proceso en el que aumentamos la cantidad de datos que tenemos o aumentamos mediante el uso de datos existentes y la aplicación de algunas transformaciones en ellos. Las transformaciones exactas utilizadas dependen de la tarea que pretendamos lograr. Además, las transformaciones que ayudan a la red neuronal dependen de su arquitectura.
Por ejemplo, en muchas tareas de visión por computadora, como la clasificación de objetos, una técnica de aumento de datos efectiva es agregar nuevos puntos de datos que son versiones recortadas o traducidas de los datos originales.
Cuando una computadora acepta una imagen como entrada, toma una matriz de valores de píxeles. Digamos que toda la imagen se desplaza a la izquierda 15 píxeles. Aplicamos muchos cambios diferentes en diferentes direcciones, lo que da como resultado un conjunto de datos aumentado muchas veces el tamaño del conjunto de datos original.
Transferir aprendizaje
El proceso de tomar un modelo previamente entrenado y "afinar" el modelo con nuestro propio conjunto de datos se llama aprendizaje de transferencia. Hay varias formas de hacer esto, algunas se describen a continuación:
Entrenamos el modelo previamente entrenado en un gran conjunto de datos. Luego, eliminamos la última capa de la red y la reemplazamos con una nueva capa con pesos aleatorios.
Luego congelamos los pesos de todas las demás capas y entrenamos la red normalmente. Aquí congelar las capas no cambia los pesos durante el descenso u optimización del gradiente.
El concepto detrás de esto es que el modelo pre-entrenado actuará como un extractor de características, y solo la última capa será entrenada en la tarea actual.