El paso hacia delante da la respuesta
El paso hacia delante (forward pass en inglés) es el cálculo con el que una red neuronal convierte unas entradas en una salida. Cada capa usa el resultado de la anterior.
Si sabes hacerlo a mano en una red pequeña, entiendes lo que hace una red enorme: es el mismo cálculo, repetido muchas veces.
Al final de esta lección
Nota
Puedo calcular a mano qué da una red pequeña.
Palabras clave
| Palabra | Qué significa |
|---|---|
| Entrada | un dato que recibe la red |
| Suma ponderada | cada entrada por su peso, sumadas, más el sesgo |
| Activación | el número que sale de una neurona tras su función |
| Paso hacia delante | calcular la salida capa por capa |
| Salida | el número que da la última capa |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Una neurona hace una suma ponderada
Para calcular una neurona, multiplica cada entrada por su peso y suma los resultados. Después añade el sesgo.
Con entradas 2 y 1, pesos 1 y 1 y sesgo -1, el total es 2 × 1 + 1 × 1 - 1 = 2. ReLU lo deja en 2.
Ejemplo resuelto: dos neuronas con las mismas entradas
| Neurona | Pesos | Sesgo | Total | Tras ReLU |
|---|---|---|---|---|
| Oculta 1 | 1 y 1 | -1 | 2 × 1 + 1 × 1 - 1 = 2 | 2 |
| Oculta 2 | 1 y -2 | 0 | 2 × 1 + 1 × -2 + 0 = 0 | 0 |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
La neurona oculta 1 en el laboratorio
docker exec jupyter python3 -c "print(max(0, 1 * 2 + 1 * 1 - 1))"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Cada capa usa la salida anterior
Primero calculas todas las neuronas de la capa oculta con las entradas. Los números que salen forman una lista nueva.
Esa lista es la entrada de la capa de salida. Así la red avanza capa por capa hasta dar su respuesta.
Ejemplo resuelto: el día [2, 1] completo
| Paso | Cálculo | Resultado |
|---|---|---|
| Oculta 1 | 2 × 1 + 1 × 1 - 1 = 2, ReLU | 2 |
| Oculta 2 | 2 × 1 + 1 × -2 + 0 = 0, ReLU | 0 |
| Salida | 2 × 1 + 0 × 1 - 2 = 0 | total 0 |
| Respuesta | 0 no es positivo | 0, pocos alquileres |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
El mismo cálculo en Python
# Red de 2, 2 y 1 neuronas. Entradas: temperatura y lluvia, en unidades pequeñas.
entradas = [2, 1]
pesos_ocultos = [[1, 1], [1, -2]]
sesgos_ocultos = [-1, 0]
pesos_salida = [1, 1]
sesgo_salida = -2
ocultas = []
for n in range(len(pesos_ocultos)):
total = sesgos_ocultos[n]
for i in range(len(entradas)):
total = total + pesos_ocultos[n][i] * entradas[i]
if total < 0:
total = 0
ocultas.append(total)
print("capa oculta:", ocultas)
total = sesgo_salida
for n in range(len(ocultas)):
total = total + pesos_salida[n] * ocultas[n]
print("total de salida:", total)
if total > 0:
print("muchos alquileres")
else:
print("pocos alquileres")
# Cambia entradas a [1, 3] y ejecuta otra vez.
Un error muy común
Advertencia
Mucha gente se olvida del sesgo, o lo suma antes de aplicar ReLU en una neurona y después en otra. El sesgo va siempre dentro del total, antes de la función de activación, en todas las neuronas.
El total de salida del día [2, 1]
docker exec jupyter python3 -c "print(2 * 1 + 0 * 1 - 2)"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Para ir más lejos: un día con lluvia
Con la red de la lección, prueba el día [3, 1] y el día [1, 1] a mano. Apunta las dos neuronas ocultas, el total de salida y la respuesta.
Después cambia el sesgo de salida de -2 a -4 y repite. ¿Qué días siguen dando «muchos alquileres» y cuáles ya no?