Tutorial: una red neuronal
Una red neuronal aprende a partir de ejemplos. Aquí enseñaremos a una a decidir si un punto está dentro o fuera de un círculo, sin decirle nunca qué es un círculo.
1. Los datos
Cada ejemplo es una entrada ([x, y]) y su respuesta correcta (1 dentro, 0 fuera):
randomSeed(1)
var puntos = []
var dentro = []
repeat 200 {
var x = random(-1, 1)
var y = random(-1, 1)
puntos.add([x, y])
dentro.add(x * x + y * y < 0.36 ? 1 : 0) // círculo de radio 0,6
}
print(puntos.length, "ejemplos;", dentro.count(d => d == 1), "dentro")▶ Probar en el editor
2. La red
ai.NeuralNetwork([2, 12, 2], "relu", "softmax") tiene:
- 2 entradas (x e y);
- una capa oculta de 12 neuronas con activación ReLU;
- 2 salidas con softmax: la probabilidad de "fuera" y la de "dentro".
Para entrenarla, las respuestas se escriben en formato one-hot: la clase 1 es [0, 1].
3. Entrenar y comprobar
Separamos 160 ejemplos para aprender y 40 para comprobar con puntos que la red no ha visto:
import ai
randomSeed(1)
var puntos = []
var dentro = []
repeat 200 {
var x = random(-1, 1)
var y = random(-1, 1)
puntos.add([x, y])
dentro.add(x * x + y * y < 0.36 ? 1 : 0)
}
var red = ai.NeuralNetwork([2, 12, 2], "relu", "softmax")
var error = red.train(puntos.take(160), ai.oneHot(dentro.take(160), 2), 300, 0.3, 32)
var acierto = ai.accuracy(red.classify(puntos.skip(160)), dentro.skip(160))
print("Error final:", round(error, 3))
print("Aciertos con puntos nuevos: ${round(acierto * 100)} %")
assert(acierto > 0.8, "la red debería aprender el círculo")
// Lo que ha aprendido: # dentro, . fuera
for fila in 0..9 {
var linea = ""
for col in 0..19 { linea += red.classify([[col / 9 - 1, fila / 4 - 1]])[0] == 1 ? "#" : "." }
print(linea)
}▶ Probar en el editor
4. Qué está pasando
trainrepite muchas veces (épocas): calcula la salida, mide el error y ajusta un poco los pesos en la dirección que lo reduce (descenso del gradiente). La tasa de aprendizaje (0.3) es el tamaño de cada ajuste.- Con
lote(32) los ejemplos se procesan en grupos mezclados: aprende más rápido y generaliza mejor. - Todo el cálculo se hace con
Matrix(en C++); la red en sí son unas 150 líneas de HyperEZ en src/lib/ai.hz. Léelas: es la mejor forma de entender cómo funciona.
Para seguir
- Cambia el número de neuronas, las épocas o la tasa y observa el error (
red.historyguarda el de cada época). - Prueba con datos reales en CSV:
hyper new mi-ia --tipo iacrea un proyecto que clasifica flores. - Guía de IA y datos con regresión lineal, k vecinos y k-medias.
HyperEZ