Explicación de la red neuronal desde la base, incluida la comprensión de las matemáticas detrás de ella
Me resulta difícil obtener explicaciones detalladas paso a paso sobre redes neuronales en un solo lugar. Siempre faltaba alguna parte de la explicación en los cursos o en los videos.
Así que trato de reunir toda la información y las explicaciones en una entrada de blog (paso a paso). Separaría este blog en 8 secciones, ya que lo considero más relevante.
- Representación del modelo
- Representación del modelo Matemáticas
- Funciones de activación
- Nodo de sesgo
- Costo Función
- Cálculo de propagación directa
- Algoritmo de contrapropagación
- Implementación de código
Entonces, comencemos …
Representación del modelo
Red neuronal artificial es un sistema informático inspirado en la red neuronal biológica que constituye el cerebro animal. Dichos sistemas “aprenden” a realizar tareas considerando ejemplos, generalmente sin estar programados con ninguna regla específica de tarea.
La red neuronal se construye a partir de 3 tipos de capas:
- Entrada capa: datos iniciales de la red neuronal.
- Capas ocultas: capa intermedia entre la capa de entrada y salida y el lugar donde se realiza todo el cálculo.
- Capa de salida: produce el resultado para las entradas dadas.
Hay 3 Círculos amarillos en la imagen de arriba. Representan la capa de entrada y generalmente se anotan como vector X. Hay 4 círculos azules y 4 verdes que representan las capas ocultas.
Estos círculos representan los nodos de “activación” y por lo general se indican como W o θ . El círculo rojo es la capa de salida o el valor predicho (o valores en el caso de varias clases / tipos de salida).
Cada nodo está conectado con cada nodo de la siguiente capa y cada conexión (flecha negra) tiene un peso particular. El peso puede verse como el impacto que ese nodo tiene en el nodo de la siguiente capa. Entonces, si echamos un vistazo a un nodo, se vería así
Veamos el nodo azul superior ( “Imagen 1” ). Todos los nodos de la capa anterior (amarillo) están conectados con ella. Todas estas conexiones representan los pesos (impacto).
Cuando todos los valores de nodo de la capa amarilla se multiplican con su peso y todo esto se resume, se obtiene algún valor para el nodo azul superior. El nodo azul tiene una función de “activación” predefinida ( función de paso de la unidad en “Imagen 2” ) que define si este nodo será “activado” o cuán “activo” será, Basado en el valor resumido. El nodo adicional con valor 1 se denomina nodo de “sesgo”.
Matemáticas de representación del modelo
Para entender las ecuaciones matemáticas usaré un modelo de red neuronal más simple. Este modelo tendrá 4 nodos de entrada (3 + 1 “sesgo”) . Una capa oculta con 4 nodos (3 + 1 “sesgo”) y un nodo de salida.
Vamos a marcar los nodos de “sesgo” como x₀ y a₀ respectivamente. Por lo tanto, los nodos de entrada se pueden colocar en un vector X y los nodos de la capa oculta en el vector A .
Los pesos (flechas) generalmente se indican como θ o W. En este caso los anotaré como θ. Los pesos entre la entrada y la capa oculta representarán la matriz 3×4 . Y los pesos entre la capa oculta y la capa de salida representarán matriz 1×4 .
Si la red tiene a unidades en la capa j y b unidades en la capa j +1, entonces θⱼ será de dimensión b × (a + 1) .
A continuación, lo que queremos es calcular los nodos de “activación” para la capa oculta. Para hacer eso necesitamos multiplicar el vector de entrada X y la matriz de pesos θ¹ para la primera capa ( X * θ¹) y luego aplicar la función de activación g . Lo que obtenemos es:
Y multiplicando el vector de capa oculta con la matriz de pesos θ para la segunda capa ( A * θ ) obtenemos salida para la función de hipótesis:
Este ejemplo es con una sola capa oculta y 4 nodos allí. Si intentamos generalizar para la Red neuronal con múltiples capas ocultas y múltiples nodos en cada una de las capas, obtendríamos la siguiente fórmula.
Donde tenemos L capas con n nodos y L-1 capa con m nodos.
Funciones de activación
En la red neuronal, la función de activación define si el nodo dado debe estar “activado” o no basado en la suma ponderada. Definamos este valor de suma ponderada como z . En esta sección, explicaré por qué la “Función escalonada” y la “Función lineal” no funcionan y hablan de la “Función sigmoidea “, una de las funciones de activación más populares. También hay otras funciones que dejaré de lado por ahora.
Función de paso
Una de las primeras ideas sería utilizar la llamada “[Funcióndepaso” (valores de salida discretos) donde definimos valor umbral y:
si (z> umbral) – “activar” el nodo (valor 1)
si (z <umbral) – no “activar” el nodo (valor 0)
Esto se ve bien pero tiene un inconveniente ya que el nodo solo puede tener el valor 1 o 0 como salida. En caso de que quisiéramos asignar varias clases de salida (nodos) tenemos un problema. El problema es que es posible activar múltiples clases / nodos de salida (tener el valor 1). Por lo tanto, no podemos clasificar / decidir correctamente.
Función lineal
Otra posibilidad sería definir “ Función lineal” y obtener un rango de valores de salida.
Sin embargo, solo se usa lineal La función en la red neuronal causaría que la capa de salida sea una función lineal, por lo que no podemos mapear ningún dato no lineal . La prueba de esto está dada por:
luego por composición de la función obtenemos
que también es una función lineal.
Función sigmoidea
Es una de las activaciones más utilizadas. funciona hoy La ecuación se da con la siguiente fórmula.
Tiene múltiples propiedades que lo hacen tan popular:
- Es una función no lineal
- Los valores del rango están entre (0,1)
- Entre (-2,2) en el eje x la función es muy pronunciada, lo que hace que la función tiende a clasificar los valores éter 1 o 0
Debido a estas propiedades, permite que los nodos tomen cualquier valor entre 0 y 1. Al final, en el caso de varias clases de salida, esto resultaría con diferentes probabilidades de “activación” para cada clase de salida. Y elegiremos el que tenga el valor más alto de “activación” (probabilidad).
Nodo de sesgo
El uso del nodo de “sesgo” suele ser fundamental para crear un modelo de aprendizaje exitoso. En resumen, un valor de sesgo permite desplazar la función de activación a la izquierda o la derecha y ayuda a adaptarse mejor a los datos (mejor función de predicción como resultado).
Abajo hay 3 funciones sigmoideas que dibujo en las que puedes notar cómo la multiplicación / suma / resta la variable x por algún valor puede influir en la función.
- Multiplicando x – hace la función empinada
- Sumar / Restar x – desplaza la función a la izquierda / derecha
Función de costo
Comencemos por definir la ecuación general de la función de costo. Esta función representa la suma del error, la diferencia entre el valor predicho y el valor real (etiquetado).
Dado que este es un tipo de problema de clasificación y solo puede tomar valores discretos {0,1}. Solo puede ser en un tipo de clase. Por ejemplo, si clasificamos imágenes de perros (clase 1), gatos (clase 2) y aves (clase 3). Si la imagen de entrada es perro. Las clases de salida serán el valor 1 para la clase de perro y el valor 0 para las otras clases.
Esto significa que queremos que nuestra hipótesis satisfaga
Por eso es que definiremos nuestra hipótesis como
Donde g en este caso será la función sigmoidea, ya que esta función tiene valores de rango entre (0,1).
Nuestro objetivo es optimizar la función de costo, por lo que necesitamos encontrar min J (θ) . Pero la función Sigmoide es una función “no convexa” (“[ Imagen 15 “) lo que significa que hay múltiples mínimos locales. Por lo tanto, no se garantiza que converja (encuentre) al mínimo global. Lo que necesitamos es una función “convexa” en orden del algoritmo de descenso de gradiente para poder encontrar el mínimo global (minimizar J (θ)). Para hacer eso, usamos la función log .
Por eso usamos la siguiente función de costo para redes neuronales
En el caso de que el valor etiquetado y sea igual a 1 la hipótesis es -log (h (x)) o -log (1-h (x)) de lo contrario.
La intuición es bastante simple si observamos los gráficos de funciones. Veamos primero el caso donde y = 1 . Entonces -log (h (x)) se parecería al gráfico de abajo. Y solo nos interesa el intervalo (0,1) del eje x, ya que la hipótesis solo puede tomar valores en ese rango ( “Imagen 13” )
Lo que podemos ver en el gráfico es que si y = 1 y h (x) se acerca al valor de 1 ( eje x ) el costo se aproxima al valor 0 ( h (x) -y sería 0 ) ya que es la predicción correcta. De lo contrario, si h (x) se acerca a 0 la función de costo llega al infinito (costo muy grande).
En el otro caso donde y = 0 la función de costo es -log (1-h (x))
En el gráfico aquí podemos ver que si h (x) se aproxima al valor de 0 el costo se aproximaría a 0 ya que también es la predicción correcta en este caso.
Dado que y (valor etiquetado) siempre es igual a 0 o 1 podemos escribir la función de costo en una ecuación.
Si escribimos completamente nuestra función de costo con la suma que obtendríamos:
Y esto es para el caso en el que solo hay un nodo en la capa de salida de la red neuronal. Si generalizamos esto para varios nodos de salida (clasificación multiclase), lo que obtenemos es:
Las partes correctas de las ecuaciones representan la función de costo “regularización”. Esta regularización evita que los datos se “sobrecalienten”, al reducir la magnitud / valores de [
Cálculo de propagación hacia adelante
Este proceso de propagación hacia adelante en realidad está obteniendo el valor de salida de la red neuronal basándose en una entrada determinada. Este algoritmo se utiliza para calcular el valor del costo. Lo que hace es el mismo proceso matemático que el descrito en la sección 2 “Matemáticas de representación de modelos”. Donde al final obtenemos nuestro valor de hipótesis “Imagen 7” .
Después de obtener el valor de h (x) (hipótesis) usamos la ecuación de la función de Costo ( “Imagen 21” ) para calcular el costo para el conjunto de entradas dado.
Aquí podemos observar cómo funciona la propagación hacia adelante y cómo una red neuronal genera la predicciones .
Algoritmo de contrapropagación
Lo que queremos hacer es minimizar la función de costo J () usando el conjunto óptimo de valores para θ (pesos) . Backpropagation es un método que utilizamos para calcular la derivada parcial de J () .
Este valor de derivada parcial se usa luego en el algoritmo de pendiente del gradiente ( “Imagen 23” ) para calcular los valores de θ para la red neuronal que minimizan la función de costo J (θ) .
El algoritmo de propagación hacia atrás tiene 5 pasos:
- Conjunto a (1) = X ; para los ejemplos de capacitación
- Realice la propagación hacia adelante y calcule a (l) para las otras capas (l = 2… L)
- Use y y calcule el valor delta para el última capa δ (L) = h (x) – y
- Calcule los valores de δ (l) hacia atrás para cada capa (descrita en la sección “Matemáticas detrás de la propagación hacia atrás”) [19659005] Calcule los valores derivados Δ (l) = (a (l)) ^ T ∘ δ (l + 1) para cada capa, que representan el derivado del costo J () [19659023] con respecto a θ (l) para la capa l
La propagación hacia atrás se trata de determinar cómo el cambio de peso afecta el costo general en la red neuronal. 19659211] Lo que hace es propagar el “error hacia atrás en la red neuronal. En el camino de regreso, está encontrando cuánto contribuye cada peso en el “error” general. Las ponderaciones que contribuyen más al “error” general tendrán valores de derivación más grandes, lo que significa que cambiarán más (al calcular el Descenso de gradiente).
Ahora que tenemos una idea de lo que está haciendo el algoritmo de propagación hacia atrás, podemos profundizar más. los conceptos y las matemáticas detrás.
¿Por qué derivadas?
La derivada de una función (en nuestro caso J (θ) ) en cada variable (en nuestro caso el peso θ ) nos dice la sensibilidad de la función con respecto a esa variable o cómo el cambio de la variable afecta al valor de la función .
Veamos un ejemplo simple de red neuronal
Hay dos nodos de entrada x y y . La función de salida es calcular el producto x y y . Ahora podemos calcular las derivadas parciales para ambos nodos
La derivada parcial con respecto a x es diciendo que si x el valor aumenta por algún valor ϵ entonces aumentaría la función (producto xy ) por 7ϵ y el derivado parcial con respecto a y dice que si y el aumento de valor para algún valor ϵ entonces aumentaría la función en 3ϵ . [19659028] Tal como lo definimos, el algoritmo de Backpropagation calcula la función de la derivada de costo con respecto a cada parámetro de peso . Al hacer esto, determinamos qué tan sensible es la función de costo J () para cada uno de estos parámetros de peso . También nos ayuda a determinar cuánto debemos cambiar cada parámetro de peso θ al calcular el descenso del degradado. Así que al final obtenemos el modelo que mejor se adapta a nuestros datos.
Matemáticas detrás de Backpropagation
Usaremos el siguiente modelo de red neuronal como punto de partida para derivar las ecuaciones.
En este modelo tenemos 3 nodos de salida ( K ) y 2 capas ocultas. Como se definió anteriormente, la función de costo para la red neuronal es:
Lo que necesitamos es calcular la derivada parcial de J (θ) con respecto a cada θ parámetros. Vamos a dejar de lado el resumen, ya que estamos usando una implementación vectorizada (multiplicación de matrices). También podemos omitir la regularización (parte derecha de la ecuación anterior) y la calcularemos por separado al final. Dado que es una adición, la derivada se puede calcular de forma independiente.
NOTA: La implementación vectorizada se usará para que podamos calcular todos los ejemplos de capacitación a la vez.
Comenzamos con la definición de las reglas derivadas que usaremos.
Ahora definimos la ecuación básica para nuestro modelo de red neuronal donde l es notación de capa y L es para la última capa.
En nuestro caso L tiene valor 4, ya que tenemos 4 capas en nuestro modelo. Así que comencemos calculando la derivada parcial con respecto a los pesos entre la 3ª y la 4ª capa.
Paso (6) – Derivada del sigmoide
[19659023] Para explicar el paso (6) necesitamos calcular la derivada parcial de la función sigmoidea.En el caso de la última capa L obtuvimos,
así que,
Paso (11) – Deshazte del resumen (Σ)
También en el último paso (11) es importante tener en cuenta que debemos multiplicar δ por una transposición para deshacerse del resumen (1 … m para ejemplos de entrenamiento).
δ – matriz con dimensiones
[number_of_training_examples, output_layer_size] así que esto también significa que nos libraremos de la segunda resumen (1 … K para el número de nodos de salida).
a – matriz con dimensiones
[hidden_layer_size, number_of_training_examples]Ahora continuamos con el siguiente derivado para θ parámetros entre 2 y 3 capas. Para esta derivación podemos comenzar desde paso (9) ( “Imagen 30” ). Como θ (2) está dentro de la función a (3) debemos aplicar la “Regla de la cadena” al calcular la derivada (paso (6) de la derivada reglas sobre “Imagen 28”).
Ahora obtenemos la derivada para el parámetro θ entre la segunda y la tercera capa. Lo que nos queda por hacer es calcular la derivada para el parámetro θ entre la capa de entrada y la segunda capa. Al hacer esto, veremos que el mismo proceso (ecuaciones) se repetirá para poder derivar las ecuaciones generales δ y las derivadas. De nuevo, continuamos desde paso (3) ( “Imagen 34” ).
De la ecuación anterior puede derivar ecuaciones para δ parámetro y derivado con respecto a θ parámetro.
Al final obtenemos tres matrices (igual que θ matrices de peso) con las mismas dimensiones que las θ matrices de peso y los derivados calculados para cada [19659022] θ parámetro.
Agregue la regularización
Como ya se mencionó, la regularización es necesaria para evitar que el modelo se adapte en exceso a los datos. Ya hemos definido la regularización para nuestra función de costo, que es la parte correcta de la ecuación definida en “Imagen 21”.Para agregar la regularización para el gradiente (derivada parcial ) debemos calcular la derivada parcial para la regularización anterior.
Lo que significa simplemente sumar la suma de todos los valores theta de cada capa a las derivadas parciales con respecto a θ .
Implementación del código
Ahora podemos implementar todas las ecuaciones en el código donde calcularemos el costo y los derivados (utilizando Backpropagation) para poder usarlos en el algoritmo de pendiente del gradiente más adelante para optimizar [19659022] θ parámetros para nuestro modelo.
Conclusión
Conclusión Esperamos que esto sea claro y fácil de entender. Si cree que alguna parte necesita una mejor explicación, siéntase libre de agregar un comentario o sugerencia. Para cualquier pregunta, no dude en ponerse en contacto conmigo.
¡Espero que lo haya disfrutado!
Enlaces útiles