Redes neuronales, explicadas para principiantes: comience aquí si lo han confundido

sobre las últimas tecnologías como grandes modelos de lenguaje, IA agente, sistemas multimodales y técnicas como RAG.

¿Cuáles son realmente estas tecnologías?

¿Cómo se construyen?

Aprendí que los modelos de lenguajes grandes (LLM) son sistemas avanzados de inteligencia artificial construidos sobre redes neuronales altamente entrenadas.

También quería aprender sobre estas tecnologías.

Dado que las redes neuronales forman la base de estas últimas tecnologías, quería comenzar por comprender qué es realmente una red neuronal.

Pero cuando me encontré con términos como capas ocultas, funciones de activación, datos de imágenes y datos de texto, me sentí abrumado.

Se volvió difícil seguir aprendiendo sobre redes neuronales.

Entendí que utilizamos el aprendizaje profundo y las redes neuronales principalmente cuando tratamos con datos complejos como imágenes y texto.

Sin embargo, sentí que el uso de datos tan complejos podría dificultar la comprensión de los conceptos básicos de las redes neuronales.

Me preguntaba cómo podría hacerlo más simple. Entonces, en lugar de comenzar con datos complejos, decidí usar datos simples para obtener primero una comprensión detallada de lo que realmente sucede dentro de una red neuronal.

Entonces, el objetivo principal de este artículo es comprender qué son realmente las redes neuronales y cómo aprenden de los datos utilizando un conjunto de datos simple.

En este artículo, construiremos una red neuronal simple desde cero y entenderemos cómo funciona.

Veremos qué sucede dentro de una neurona, cómo funcionan juntas las diferentes capas, por qué agregar más neuronas lineales todavía no es suficiente y cómo las funciones de activación ayudan a las redes neuronales a modelar patrones complejos en los datos.

Cuando una línea recta no es suficiente

Es posible que haya encontrado diagramas similares como este que muestran la estructura básica de las redes neuronales.

Imagen por autor

Entendamos esto capa por capa.

Pero antes de que podamos entender cómo funciona, necesitamos algunos datos. Consideremos este conjunto de datos simple que muestra las puntuaciones de los exámenes de los estudiantes y las horas que estudiaron.

Datos:

Imagen por autor

Ahora, tracemos estos datos.

Código:

importar matplotlib.pyplot como plt hours_studied = [1, 2, 3, 4, 5, 6, 7, 8, 9] exam_scores = [55, 70, 80, 85, 87, 88, 87, 85, 80] plt.scatter(hours_studied, exam_scores, color='darkcyan', s=80) plt.xlabel("Horas estudiadas") plt.ylabel("Puntuación del examen") plt.title("Horas estudiadas vs puntuación del examen") plt.show()

Trama:

Imagen por autor

Ahora, necesitamos predecir la puntuación del examen en función de las horas estudiadas. Apliquemos una regresión lineal simple a estos datos.

Imagen por autor

Podemos observar en el gráfico anterior que la regresión lineal simple no es suficiente para modelar bien estos datos porque la relación en el conjunto de datos parece no ser lineal.

En otras palabras, podemos decir que una sola línea recta no es capaz de capturar el patrón subyacente en los datos.

¿Qué podemos hacer ahora?

Por qué es importante la simplicidad

Construyamos una red neuronal para resolver este problema.

Llegados a este punto, cabría preguntarse: ¿por qué construir una red neuronal? ¿No podemos resolver este problema usando árboles de decisión o bosques aleatorios?

Tienes toda la razón.

De hecho, los algoritmos basados ​​en árboles suelen ser los preferidos para problemas que involucran datos tabulares no lineales como este.

Pero nuestro objetivo aquí es comprender cómo se construye una red neuronal y cómo funciona.

¿Por qué utilizar un conjunto de datos enorme de imágenes o texto para aprender estos conceptos y por qué no comenzar con un conjunto de datos simple?

Piénselo de esta manera: si quisiera aprender a conducir, ¿elegiría un automóvil básico o un automóvil de aventuras muy potente?

La mayoría de nosotros elegiríamos un coche básico.

Si empezáramos con un coche potente, podríamos sentirnos abrumados por su potencia y no poder controlarlo.

Podríamos terminar pensando que conducir es demasiado difícil, lo que nos haría rendirnos antes de aprender los fundamentos.

De la misma manera, si comenzamos con un conjunto de datos de imágenes que contiene cientos de entradas, podríamos sentirnos abrumados y tener dificultades para comprender los fundamentos de las redes neuronales.

Entonces, aquí utilizamos este conjunto de datos simple, no porque las redes neuronales estén destinadas solo a resolver problemas como este, sino para comprender cómo funcionan.

Más adelante, podremos aprovechar nuestros aprendizajes para comprender redes neuronales más complejas que aprenden patrones muy complejos a partir de datos.

Es hora de las redes neuronales

Miremos una vez más el diagrama de dispersión de nuestro conjunto de datos.

Imagen por autor

Ya sabemos que una sola línea no es suficiente para capturar los patrones de estos datos.

Entonces, necesitamos una función más flexible que pueda modelar estos patrones. Una forma de modelar tales patrones es mediante el uso de redes neuronales.

Primero miremos una neurona. ¿Qué hace en realidad?

Te sorprenderá saber que una neurona hace algo que ya sabemos.

Toma la entrada de los datos, la multiplica por un peso y agrega sesgo.

podemos escribirlo en forma de ecuación como:

[
z = wx + b
]

Hemos visto esto antes, ¿verdad?

Esto no es más que la ecuación de una línea recta y si la comparamos con una regresión lineal simple, podemos pensar en (w) como la pendiente y (b) como la intersección.

Aquí, hemos considerado solo una característica de entrada, donde una neurona calcula:

[
z = wx + b
]

Sin embargo, en los problemas del mundo real, a menudo tenemos múltiples funciones de entrada. En ese caso, la neurona calcula:

[
z = w_1x_1 + w_2x_2 + cdots + w_nx_n + b
]

En forma matricial, podemos escribir la misma ecuación como:

[
z = mathbf{w}^{T}mathbf{x} + b
]

dónde

[
mathbf{w} =
begin{bmatriz}
w_1
w_2
cdots
w_n
end{bmatriz}
]

es el vector de pesos,

[
mathbf{x} =
begin{bmatriz}
x_1
x_2
cdots
x_n
end{bmatriz}
]

es el vector de características de entrada, y

[
b
]

es el término de sesgo.

Aquí, [z] representa la salida lineal producida por la neurona.

En última instancia, podemos decir que una neurona calcula una función lineal de sus entradas.

Ahora que tenemos una idea de lo que realmente hace una sola neurona, echemos un vistazo nuevamente a este diagrama básico.

Imagen por autor

Capa de entrada

Primero centrémonos en la capa de entrada.

Es sencillo. La capa de entrada no hace más que almacenar los datos y pasarlos a la siguiente capa.

Aquí, para nuestro conjunto de datos, tenemos una característica que son horas de estudio, por lo que tenemos una neurona en la capa de entrada.

La cantidad de neuronas en la capa de entrada se basa en la cantidad de características que tenemos en nuestro conjunto de datos.

Imagen por autor

Capa oculta

Ahora que tenemos una idea de la capa de entrada, pasemos a la capa más importante de una red neuronal, la capa oculta.

Aquí, estamos construyendo una red neuronal y puede haber cualquier cantidad de capas ocultas en ella.

Podemos elegir cuántas capas ocultas incluir en nuestra red neuronal en función del problema que estemos resolviendo.

Aquí, por simplicidad, solo quiero incluir una capa oculta en nuestra red neuronal.

Ahora, la siguiente pregunta es: ¿cuántas neuronas deberíamos tener en nuestra capa oculta?

Esto también es algo que podemos elegir, al igual que el número de capas ocultas.

Aquí estoy considerando 2 neuronas, por lo que podemos decir que nuestra red neuronal usa una capa oculta con 2 neuronas.

En este punto, nuestra red neuronal se ve así,

Imagen por autor

Aquí viene la parte interesante. Ya comentamos que una sola neurona calcula una función lineal de sus entradas.

Una cosa en la que debemos centrarnos aquí es que inicializamos aleatoriamente los pesos y el sesgo de cada neurona.

Podemos entender esto más claramente tomando un ejemplo.

Digamos que para la neurona oculta 1, inicializamos aleatoriamente w1 = 1 y b1 = -5 y para la neurona oculta 2, inicializamos aleatoriamente w2 = -1 y b2 = 7.

Sólo una pendiente porque aquí solo tenemos una característica (horas estudiadas).

Ahora pasemos los datos a la capa oculta desde la capa de entrada.

Veamos cómo se ve nuestra red neuronal en este punto.

Imagen por autor

Rompiendo la capa oculta

Ahora centrémonos en la neurona oculta 1.

A medida que pasamos los datos de la capa de entrada a la Neurona Oculta 1, ésta calcula:

[
z_1 = w_1x + b_1
]

Inicializamos aleatoriamente el peso y el sesgo de la Neurona Oculta 1 como:

[
w_1 = 1
]

y

[
b_1 = -5
]

Sustituyendo estos valores en la ecuación de la neurona, obtenemos:

[
z_1 = (1)x + (-5)
]

cual es

[
z_1 = x – 5
]

Esta ecuación representa la función lineal producida por la Neurona Oculta 1.

Ahora veamos qué sucede cuando el primer punto de datos ingresa a la neurona.

Para el primer estudiante:

[
x = 1
]

Sustituyendo este valor en la ecuación:

[
z_1 = 1 – 5
]

Por lo tanto,

[
z_1 = -4
]

Entonces, cuando el valor de entrada es (x = 1), la Neurona Oculta 1 produce una salida de:

[
z_1 = -4
]

De manera similar, para los valores de entrada restantes, la Neurona Oculta 1 produce las siguientes salidas:

[
x = 2 quad Rightarrow quad z_1 = -3
]

[
x = 3 quad Rightarrow quad z_1 = -2
]

[
x = 4 quad Rightarrow quad z_1 = -1
]

[
x = 5 quad Rightarrow quad z_1 = 0
]

[
x = 6 quad Rightarrow quad z_1 = 1
]

[
x = 7 quad Rightarrow quad z_1 = 2
]

[
x = 8 quad Rightarrow quad z_1 = 3
]

[
x = 9 quad Rightarrow quad z_1 = 4
]

Hasta ahora, hemos pasado los datos a la Neurona Oculta 1 y ha calculado los valores anteriores.

Ahora, tracemos los resultados producidos por la Neurona Oculta 1.

Imagen por autor

Podemos ver que Hidden Neuron 1 produjo una línea. Intentaremos entender qué es, pero antes de eso, echemos un vistazo también a Hidden Neuron 2.

Al igual que la Neurona Oculta 1, ahora pasamos los mismos datos de entrada a la Neurona Oculta 2.

A medida que los datos pasan de la capa de entrada a Hidden Neuron 2, calcula:

[
z_2 = w_2x + b_2
]

Inicializamos aleatoriamente el peso y el sesgo de Hidden Neuron 2 como:

[
w_2 = -1
]

y

[
b_2 = 7
]

Sustituyendo estos valores en la ecuación de la neurona, obtenemos:

[
z_2 = (-1)x + 7
]

cual es

[
z_2 = -x + 7
]

Esta ecuación representa la función lineal producida por Hidden Neuron 2.

Ahora veamos qué sucede cuando el primer punto de datos ingresa a la neurona.

Para el primer estudiante:

[
x = 1
]

Sustituyendo este valor en la ecuación:

[
z_2 = -1 + 7
]

Por lo tanto,

[
z_2 = 6
]

Entonces, cuando el valor de entrada es (x = 1), Hidden Neuron 2 produce una salida de:

[
z_2 = 6
]

De manera similar, para los valores de entrada restantes, Hidden Neuron 2 produce las siguientes salidas:

[
x = 2 quad Rightarrow quad z_2 = 5
]

[
x = 3 quad Rightarrow quad z_2 = 4
]

[
x = 4 quad Rightarrow quad z_2 = 3
]

[
x = 5 quad Rightarrow quad z_2 = 2
]

[
x = 6 quad Rightarrow quad z_2 = 1
]

[
x = 7 quad Rightarrow quad z_2 = 0
]

[
x = 8 quad Rightarrow quad z_2 = -1
]

[
x = 9 quad Rightarrow quad z_2 = -2
]

Ahora, tracemos los resultados producidos por Hidden Neuron 2.

Imagen por autor

Podemos observar en el gráfico anterior que Hidden Neuron 2 también produjo una línea.

Veamos la trama con ambas líneas a la vez.

Imagen por autor

Aquí, una cosa que debemos entender es que las neuronas ocultas no intentan ajustarse a las puntuaciones de los exámenes.

Lo que hemos hecho es simplemente calcular una combinación lineal de la entrada utilizando valores de sesgo y ponderación aleatorios.

Dimos la misma entrada a ambas neuronas ocultas, pero obtuvimos diferentes transformaciones lineales porque usamos diferentes pesos aleatorios y valores de sesgo.

Ahora bien, ¿qué podemos hacer con estas dos líneas producidas por las neuronas ocultas en la capa oculta?

Si observamos la línea producida por la Neurona Oculta 1, podemos ver que a medida que aumentan las horas de estudio, aumenta la producción de la Neurona Oculta 1.

Ahora, mirando la línea producida por Hidden Neuron 2, podemos ver que a medida que aumentan las horas de estudio, la producción de Hidden Neuron 2 disminuye.

Nuestro objetivo es modelar el patrón curvo en los datos y ahora tenemos dos transformaciones lineales diferentes de la misma entrada.

Cuando miramos el diagrama de dispersión de nuestros datos, podemos observar que hasta 6 horas, la puntuación del examen aumenta a medida que aumentan las horas de estudio y, después, disminuye.

Esto puede llevarnos a preguntarnos: ¿podemos escalar y combinar estas dos líneas para modelar el patrón curvo en nuestros datos?

¿Qué queremos decir con combinar las líneas aquí?

No los uniremos geométricamente. En cambio, pasamos las salidas producidas por la capa oculta a la capa de salida final, donde se realiza otra transformación lineal.

Entendamos esto tomando un ejemplo.

Capa de salida

Ahora estamos en la capa final de nuestra red neuronal, que es la capa de salida.

Aquí, estamos tratando de predecir la puntuación del examen, que es un número único, por lo que tenemos una neurona en la capa de salida.

Ahora es el momento de inicializar los valores de los parámetros aleatorios para nuestra capa de salida.

Digamos w3 = 2, w4 = 3 y b3 = 10.

Tenemos dos pesos porque aquí la capa de salida recibe dos entradas, una de la neurona oculta 1 y otra de la neurona oculta 2.

Antes de continuar, echemos un vistazo a cómo se ve nuestra red neuronal en este punto.

Imagen por autor

La neurona de salida recibe dos entradas:

[
z_1
]

de la neurona oculta 1 y

[
z_2
]

de la Neurona Oculta 2.

Inicializamos aleatoriamente los pesos y el sesgo de la neurona de salida como:

[
w_3 = 2
]

[
w_4 = 3
]

y

[
b_3 = 10
]

La neurona de salida calcula:

[
hat{y} = w_3z_1 + w_4z_2 + b_3
]

Sustituyendo los valores:

[
hat{y} = 2z_1 + 3z_2 + 10
]

Esta ecuación representa la función lineal producida por la neurona de salida.

Ahora veamos qué sucede cuando el primer punto de datos pasa por toda la red.

Para el primer estudiante:

[
x = 1
]

De la neurona oculta 1:

[
z_1 = 1(1) – 5
]

[
z_1 = -4
]

De Neurona Oculta 2:

[
z_2 = -1(1) + 7
]

[
z_2 = 6
]

Ahora estos valores se pasan a la neurona de salida:

[
hat{y} = 2(-4) + 3(6) + 10
]

[
hat{y} = -8 + 18 + 10
]

Por lo tanto,

[
sombrero{y} = 20
]

Entonces, cuando el valor de entrada es (x = 1), la red neuronal produce una predicción de:

[
sombrero{y} = 20
]

De manera similar, para los valores de entrada restantes, la neurona de salida produce las siguientes predicciones:

[
x = 2 quad Rightarrow quad hat{y} = 19
]

[
x = 3 quad Rightarrow quad hat{y} = 18
]

[
x = 4 quad Rightarrow quad hat{y} = 17
]

[
x = 5 quad Rightarrow quad hat{y} = 16
]

[
x = 6 quad Rightarrow quad hat{y} = 15
]

[
x = 7 quad Rightarrow quad hat{y} = 14
]

[
x = 8 quad Rightarrow quad hat{y} = 13
]

[
x = 9 quad Rightarrow quad hat{y} = 12
]

En este punto, hemos completado un paso hacia adelante a través de la red neuronal.

Ahora tracemos los valores de salida de la capa de salida.

Imagen por autor

las cosas se estan poniendo interesantes

Intentemos comprender qué sucedió realmente aquí.

Primero obtuvimos las dos líneas producidas por las dos neuronas ocultas.

Luego pensamos, escalemos estas dos líneas y combinémoslas para que podamos modelar el patrón curvo en los datos.

Entonces, escalamos la línea producida por Hidden Neuron 1 en 2, escalamos la línea producida por Hidden Neuron 2 en 3 y luego las sumamos.

Sin embargo, agregar líneas rectas no crea una curva. El resultado es simplemente otra línea recta, que podemos ver en el gráfico anterior.

Sigamos las ecuaciones a continuación para que podamos entender esto completamente.

En primer lugar tenemos dos líneas producidas por las neuronas ocultas:

[
z_1 = x – 5
]

[
z_2 = -x + 7
]

La neurona de salida combina estas líneas usando sus pesos:

[
hat{y} = 2z_1 + 3z_2 + 10
]

Sustituyendo (z_1) y (z_2):

[
sombrero{y} = 2(x – 5) + 3(-x + 7) + 10
]

Ampliando los términos:

[
sombrero{y} = 2x – 10 – 3x + 21 + 10
]

Combinando términos semejantes:

[
sombrero{y} = -x + 21
]

Podemos ver que el resultado final todavía tiene la forma:

[
hat{y} = mx + c
]

que es la ecuación de una recta.

Por lo tanto, aunque combinamos las salidas de múltiples neuronas ocultas, el resultado final sigue siendo una línea.

¿Qué podemos hacer ahora?

Esto nos lleva al concepto más importante en aprendizaje profundo y redes neuronales: funciones de activación.

Funciones de activación

Aquí, nuestros datos siguen un patrón no lineal, pero una línea recta sólo puede modelar relaciones lineales.

No importa cuántas neuronas lineales combinemos, la salida sigue siendo una función lineal.

Entonces, ¿cómo aprenden estas redes neuronales patrones complejos como curvas, formas, imágenes y texto?

La solución es sorprendentemente sencilla.

¿Qué hemos hecho hasta ahora? Pasamos las salidas de las dos neuronas ocultas directamente a la capa de salida.

Pero en lugar de pasarlas directamente a la capa de salida, las salidas de las neuronas ocultas se transforman primero utilizando una función especial llamada función de activación.

Pero, ¿qué hace una función de activación?

Introduce no linealidad en la red, permitiéndole aprender patrones complejos.

Tenemos muchas funciones de activación, pero aquí consideremos una de las funciones de activación más utilizadas, ReLU (Unidad lineal rectificada).

Pero ¿qué hace ReLU?

La idea detrás de ReLU es sorprendentemente simple.

Dado un valor de entrada (z),

[
text{ReLU}(z) =
begin{casos}
0, & z < 0 \ z, & z geq 0 end{cases} ] En palabras simples, podemos decirlo como, si la entrada es negativa, ReLU genera (0). Si la entrada es positiva, ReLU la deja sin cambios. Veamos algunos ejemplos: [ text{ReLU}(-5) = 0 ] [ text{ReLU}(-2) = 0 ] [ text{ReLU}(3) = 3 ] [ text{ReLU}(7) = 7 ] Observe lo que sucedió. Todos los valores negativos se convirtieron a cero, mientras que los valores positivos pasaron sin cambios. Antes de la activación, una neurona simplemente produce una salida lineal: [ z = wx + b ] Con ReLU, la neurona ahora produce: [ a = text{ReLU}(z) ] o equivalente, [ a = text{ReLU}(wx+b) ] donde: [ z ] es la salida lineal de la neurona, [ a ] es la salida activada, [ w ] es el peso, [ x ] es la entrada y [ b ] es el sesgo.

Esta simple transformación lo cambia todo.

En lugar de pasar una salida puramente lineal a la siguiente capa, la neurona ahora aplica una transformación no lineal.

Como resultado, la combinación de múltiples neuronas ya no da como resultado otra línea recta.

Esto es lo que permite a las redes neuronales aprender patrones complejos no lineales.

Volver a la capa oculta

Ahora necesitamos volver a la capa oculta y transformar las salidas de 2 neuronas ocultas usando la función de activación ReLU.

En este momento, nuestra red neuronal se ve así:

Imagen por autor

Sabemos que nuestras neuronas ocultas produjeron:

[
z_1 = x – 5
]

[
z_2 = -x + 7
]

Después de aplicar ReLU:

[
a_1 = text{ReLU}(z_1)
]

[
a_2 = text{ReLU}(z_2)
]

Veamos qué sucede para diferentes valores de (x).

[
begin{matriz}{c|c|c|c|c}
x y
z_1=x-5&
a_1=text{ReLU}(z_1) &
z_2=-x+7 &
a_2=text{ReLU}(z_2)
\
hline
1 y -4 y 0 y 6 y 6 \
2 y -3 y 0 y 5 y 5 \
3 y -2 y 0 y 4 y 4 \
4 y -1 y 0 y 3 y 3 \
5 y 0 y 0 y 2 y 2 \
6 y 1 y 1 y 1 y 1 \
7 y 2 y 2 y 0 y 0 \
8 y 3 y 3 y -1 y 0 \
9 y 4 y 4 y -2 y 0 \
10 y 5 y 5 y -3 y 0
end{matriz}
]

Podemos observar lo que está haciendo ReLU:

La neurona oculta 1 permanece inactiva (emite (0)) hasta que (x) llega a (5).

Después de (x=5), la neurona oculta 1 comienza a producir resultados positivos.

Hidden Neuron 2 está activa para valores más pequeños de (x).

Una vez que (x) se vuelve mayor que (7), la Neurona Oculta 2 se vuelve inactiva y genera (0).

En otras palabras, ReLU permite que diferentes neuronas se activen en diferentes regiones del espacio de entrada.

Este es el primer paso para permitir que las redes neuronales aprendan patrones no lineales complejos.

Ahora visualicemos la salida proporcionada por dos neuronas ocultas después de aplicar la función de activación.

Imagen por autor
Imagen por autor

Podemos ver claramente cómo las salidas producidas por las dos neuronas ocultas cambiaron después de aplicar ReLU.

Antes de ReLU, ambas neuronas ocultas producían líneas rectas simples y sus salidas pasaban directamente a la capa de salida.

Ahora bien, ya no son líneas rectas que se extienden infinitamente en ambas direcciones. Las llamamos funciones lineales por partes.

Después de aplicar ReLU, todas las salidas negativas se convierten a cero, mientras que las salidas positivas permanecen sin cambios.

Como resultado, el comportamiento de las neuronas ocultas cambia significativamente.

Veamos dos ejemplos.

Para

[
x = 3
]

Neurona Oculta 1 producida

[
z_1 = 3 – 5 = -2
]

Se produce la Neurona Oculta 2

[
z_2 = -3 + 7 = 4
]

Aplicando ReLU:

[
a_1 = text{ReLU}(-2) = 0
]

[
a_2 = text{ReLU}(4) = 4
]

Note lo que pasó.

La Neurona Oculta 1 se vuelve inactiva porque su salida se convierte a cero, mientras que la Neurona Oculta 2 permanece activa.

Ahora considere otra entrada:

[
x = 8
]

Neurona Oculta 1 producida

[
z_1 = 8 – 5 = 3
]

Se produce la Neurona Oculta 2

[
z_2 = -8 + 7 = -1
]

Aplicando ReLU:

[
a_1 = text{ReLU}(3) = 3
]

[
a_2 = text{ReLU}(-1) = 0
]

Esta vez, la Neurona Oculta 1 permanece activa, mientras que la Neurona Oculta 2 queda inactiva.

Esto es exactamente lo que observamos en los gráficos anteriores.

Para valores más pequeños de (x), la Neurona Oculta 2 está activa mientras que la Neurona Oculta 1 está inactiva.

Para valores mayores de (x), la Neurona Oculta 1 está activa mientras que la Neurona Oculta 2 está inactiva.

En otras palabras, diferentes neuronas ocultas se activan en diferentes regiones del espacio de entrada.

En lugar de que cada neurona oculta contribuya en todas partes, algunas neuronas ocultas contribuyen sólo cuando sus resultados son útiles.

Este simple cambio introduce no linealidad en la red, que es la razón clave por la que las redes neuronales pueden aprender patrones complejos que no pueden representarse con una sola línea recta.

Ahora pasemos estas salidas activadas a la neurona de salida y veamos cómo cambia la predicción final.

Volver a la capa de salida

Imagen por autor

Sabemos que la neurona de salida calcula:

[
sombrero{y}
=
2a_1
+
3a_2
+
10
]

dónde

[
a_1 = text{ReLU}(x-5)
]

y

[
a_2 = text{ReLU}(-x+7).
]

La siguiente tabla muestra los cálculos completos realizados por la red para diferentes valores de (x).

[
begin{matriz}{c|c|c|c|c|c}
x y
a_1=text{ReLU}(x-5) &
a_2=text{ReLU}(-x+7) &
2a_1 y
3a_2 y
hat{y}=2a_1+3a_2+10
\
hline
1 y 0 y 6 y 0 y 18 y 28 \
2 y 0 y 5 y 0 y 15 y 25 \
3 y 0 y 4 y 0 y 12 y 22 \
4 y 0 y 3 y 0 y 9 y 19 \
5 y 0 y 2 y 0 y 6 y 16 \
6 y 1 y 1 y 2 y 3 y 15 \
7 y 2 y 0 y 4 y 0 y 14 \
8 y 3 y 0 y 6 y 0 y 16 \
9 y 4 y 0 y 8 y 0 y 18
end{matriz}
]

Finalmente, hemos calculado la predicción final de nuestra red.

Veamos la trama de la predicción final.

Imagen por autor

Anteriormente, intentamos escalar y combinar líneas rectas (producidas por dos neuronas ocultas en la capa oculta), pero hemos visto que el resultado final seguía siendo una línea recta.

Ahora la situación es diferente.

Después de aplicar ReLU, las neuronas ocultas produjeron funciones lineales por partes.

Cuando la neurona de salida escaló y combinó estas funciones, la red ya no está restringida a una sola línea recta.

Esto permite que la red represente patrones no lineales que no pueden representarse con una sola línea recta.

Esta es la función producida por nuestra red neuronal después de aplicar ReLU.

[
qué y
=
2,text{ReLU}(x-5)
+
3,text{ReLU}(-x+7)
+
10
]

Se podría pensar que esta función tampoco encaja bien. Y sí, tienes razón.

Esta no es la función final aprendida por nuestra red neuronal, ni estos son los valores de salida finales predichos por nuestra red neuronal.

En el siguiente paso, comparamos los puntajes de los exámenes previstos con los puntajes de los exámenes reales y luego calculamos el error cuadrático medio (MSE).

A partir de este error se produce el aprendizaje.

Aquí, nos presentan uno de los conceptos más importantes en el aprendizaje profundo y las redes neuronales: la retropropagación.

Este concepto funciona junto con Gradient Descent para actualizar los pesos y sesgos de la red.

Hasta ahora, lo que hemos hecho es propagación hacia adelante.

En el próximo blog, nos centraremos en cómo aprende una red neuronal mediante la retropropagación y el descenso de gradiente.

Resumen

En este artículo aprendimos que una neurona calcula una función lineal.

Luego construimos una red neuronal simple y descubrimos que la combinación de múltiples neuronas lineales aún daba como resultado una función lineal.

Finalmente, introdujimos funciones de activación y vimos cómo permiten que las redes neuronales modelen patrones no lineales.

Espero que esta publicación de blog le haya brindado algo para comenzar con respecto a las redes neuronales y el aprendizaje profundo.

Lo que quiero decir es que si tenemos una comprensión clara de los fundamentos, podemos seguir fácilmente temas avanzados en lugar de confundirnos.

Si esto le resultó útil, no dude en compartirlo con personas que puedan necesitarlo.

En caso de que tengas alguna duda o idea, puedes comentar en LinkedIn.

Lectura adicional

Como vamos a discutir la retropropagación a continuación, y dado que está estrechamente relacionada con el descenso de gradiente, he publicado un blog detallado sobre el descenso de gradiente y el descenso de gradiente estocástico.

Si estás interesado, puedes leerlo aquí.

Gracias por leer hasta aquí.

Esta vez, tengo ganas de terminar esto con una cita.

“El experto en cualquier cosa alguna vez fue un principiante que se negaba a darse por vencido”.

-HeLEN Hayes

Nos vemos en el próximo blog, donde exploraremos cómo las redes neuronales aprenden realmente mediante la retropropagación y el descenso de gradiente.

Gracias.