Construya una red neuronal desde cero en Python
Motivación: para obtener una comprensión más profunda del aprendizaje profundo, construiremos una red neuronal desde cero usando el lenguaje Python en lugar de usar un marco empaquetado como Tensorflow. Creo que es muy importante que los científicos de datos comprendan el funcionamiento interno de las redes neuronales.
El contenido de este artículo es lo que he aprendido y espero que pueda resultarte útil.
¿Qué es una red neuronal?
La mayoría de los artículos que presentan las redes neuronales las comparan con el cerebro. Si no ha profundizado en la analogía del cerebro y la red neuronal, es más fácil entender que una red neuronal es una relación matemática que asigna una entrada determinada a una salida deseada.
Una red neuronal consta de los siguientes componentes
Capa de entrada x
Cualquier número de capas ocultas
¿Capa de salida?
Existe un conjunto de pesos y desplazamientos entre cada capa W y b.
Seleccione la función de activación σ para la capa oculta. En el tutorial usamos Sigmoid para activar esta función.
La siguiente imagen es la estructura de una red neuronal de 2 capas (nota: normalmente no incluimos la capa de entrada al calcular el número de capas de red).
La estructura de una red neuronal de dos capas
Las clases de redes neuronales se pueden construir fácilmente usando Python.
Entrenamiento de una red neuronal
¿La salida de esta red? Usado para:
Puedes notar que en la ecuación anterior, ¿el resultado? Es una función de w y b.
Entonces, los valores de W y B afectan la precisión de la predicción, por lo que el proceso de ajustar W y B en función de los datos de entrada se denomina entrenamiento de una red neuronal.
Cada iteración de entrenamiento consta de las dos partes siguientes:
¿Calcular los resultados de la predicción? Este paso se llama propagación hacia adelante.
Al actualizar w y b, este paso se convierte en retropropagación.
El siguiente diagrama de secuencia muestra este proceso:
Propagación hacia adelante
Como se puede ver en la figura anterior, la propagación hacia adelante es solo un cálculo simple. Para una red básica de dos capas, el resultado es el siguiente:
Agregamos una función a la clase NeuralNetwork para calcular la propagación directa. Para simplificar, asumimos que el desplazamiento b es 0:
Pero aún necesitamos una forma de evaluar la calidad de los resultados de la predicción (es decir, el error entre el valor predicho y el valor real). Esto utilizará una función de pérdida.
Función de pérdida
Existen muchas funciones de pérdida de uso común, que se seleccionan de acuerdo con los requisitos del modelo. En este tutorial, utilizamos la suma de errores al cuadrado como función de pérdida.
La suma de errores al cuadrado es la suma de los errores entre cada valor predicho y el valor verdadero. Este error es el cuadrado de su diferencia para que podamos observar el valor absoluto del error.
El objetivo del entrenamiento es encontrar un conjunto de w y b que minimicen la función de pérdida, es decir, que se minimice la distancia entre el valor predicho y el valor real.
Retropropagación
Hemos medido el error (pérdida) de la predicción, ahora necesitamos encontrar una manera de propagar el error y actualizar las ponderaciones y el sesgo en consecuencia.
Para saber cómo ajustar los pesos y compensaciones adecuadamente, necesitamos conocer las derivadas de la función de pérdida con respecto a los pesos w y las compensaciones b.
Recordemos el concepto en cálculo, la derivada de una función es la pendiente de la función.
Método de descenso de gradiente
Si hemos encontrado la derivada, podemos actualizar el peso w y compensar b aumentando o disminuyendo el valor de la derivada (consulte la figura anterior). Este método se llama descenso de gradiente.
Sin embargo, no podemos calcular directamente las derivadas de la función de pérdida con respecto a ponderaciones y sesgos porque no están incluidos explícitamente en la ecuación de la función de pérdida. Por lo tanto, necesitamos utilizar derivadas en cadena para ayudar a calcular las derivadas.
Utilice la regla de la cadena para calcular las derivadas de la función de pérdida con respecto a w y b. Nota por simplicidad. Solo asumimos que la red tiene solo 1 capa de derivadas parciales.
Aunque esto es simple, aún podemos obtener el resultado deseado: la derivada (pendiente) de la función de pérdida con respecto al peso w, por lo que podemos ajustar los pesos en consecuencia.
Ahora agregamos la funcionalidad del algoritmo de retropropagación al código Python.
Para tener una comprensión más profunda de los principios del cálculo y la regla de la derivada de la cadena en retropropagación, recomiendo los siguientes cursos de 3Blue1Brown:
YouTube: https://youtu .be/ tIeHLnjs5U8
Integrar y completar un ejemplo.
Ahora que tenemos el código Python completo, incluido el paso hacia adelante y hacia atrás, apliquémoslo a un ejemplo y veamos cómo funciona.
Las redes neuronales pueden aprender los pesos de funciones. Y no podemos obtener el peso de la función con sólo observarla.
Entrenemos la red neuronal durante 1500 iteraciones y veamos qué sucede. Preste atención a la función de pérdida de cada iteración a continuación. Podemos ver claramente que la función de pérdida disminuye monótonamente hasta el valor mínimo. Esto es consistente con el método de descenso de gradiente que presentamos antes.
Echemos un vistazo a los resultados finales de la predicción de la red neuronal después de 1500 iteraciones:
Los resultados de la predicción después de 1500 iteraciones de entrenamiento.
¡Lo logramos! Entrenamos con éxito la red neuronal utilizando algoritmos de propagación directa y dirigida, y las predicciones convergieron a los valores verdaderos.
Tenga en cuenta que existe un ligero error entre el valor previsto y el valor real. Esto puede evitar que el modelo se sobreajuste y hacer que la red neuronal tenga una mayor capacidad de generalización para datos desconocidos.
¿Qué sigue?
Afortunadamente, nuestro viaje de aprendizaje aún no ha terminado, todavía queda mucho que aprender sobre redes neuronales y aprendizaje profundo. Por ejemplo:
Además de Sigmoide, ¿qué otras funciones de activación se pueden utilizar?
Aplicar tasa de aprendizaje al entrenar la red
Ante la tarea de clasificación de imágenes, utilice redes neuronales convolucionales.
Pronto escribiré más sobre este tema, ¡así que estad atentos!
Pensamientos finales
Yo mismo he escrito una gran cantidad de código de redes neuronales desde cero.
Mientras que los marcos de aprendizaje profundo como Tensorflow y Keras facilitan la construcción de redes profundas sin comprender completamente su funcionamiento interno. Pero creo que es muy beneficioso para los aspirantes a científicos de datos comprender los principios subyacentes.
Este tipo de ejercicio se ha convertido en una inversión de tiempo importante para mí y espero que pueda ayudarte a ti también.