Recreación del minijuego de matemáticas de Brain-Age usando redes neuronales en C++ para la identificación de dígitos.
- Datos generales
- Requisitos e instalación
- Investigación teórica
- Diseño e implementación
- Análisis del rendimiento
- Trabajo en equipo
- Conclusiones
- Bibliografía
- Licencia
-
Tema: Red Neuronal intérprete de imágenes
-
Grupo:
turinmachin
-
Integrantes:
- Grayson Tejada, José Daniel – 202410372 ()
- Lopez Del Carpio, Joaquin Adrian – 202410220 ()
- Figueroa Winkelried, Diego Alonso – 202410533 ()
- Valladolid Jimenes, Gonzalo Andrés – 202410186 ()
- Walde Verano, Matías Sebastian – 202410626 ()
-
Compilador: GCC 14+
-
Dependencias:
- CMake 3.29+
- SDL3
- SDL3_ttf
- Catch2 v3 (incluido en el repositorio, no requiere instalación)
-
Instalación:
git clone https://github.com/CS1103/projecto-final-turinmachin.git
cd projecto-final-turinmachin
# Descargar SDL y SDL_ttf
git clone https://github.com/libsdl-org/SDL.git vendored\SDL
git clone https://github.com/libsdl-org/SDL_ttf.git vendored\SDL_ttf
cd .\vendored\SDL_ttf
.\external\Get-GitModules.ps1
cmake -S . -B build
cd build
cmake --build .
./brain_ager
- Objetivo: Explorar fundamentos y arquitecturas de redes neuronales.
- Contenido de ejemplo:
- 1943: McCulloch y Pitts proponen el primer modelo de neurona artificial, capaz de realizar operaciones lógicas básicas.
- 1958: Rosenblatt introduce el Perceptrón, una red de una sola capa capaz de clasificar datos linealmente separables.
- 1986: Se populariza el uso del algoritmo de backpropagation, que permite entrenar redes con múltiples capas (MLP).
- Década de 2010: Surgen redes profundas (deep learning) con muchas capas ocultas, impulsadas por el aumento en capacidad computacional y la disponibilidad de grandes volúmenes de datos.
- Actualidad: Las redes neuronales están presentes en múltiples campos como visión por computadora, procesamiento de lenguaje natural, videojuegos, medicina, finanzas, entre otros.
- Compuesta por capas densamente conectadas.
- Cada neurona aplica una transformación lineal seguida por una función de activación.
- Útil en tareas de clasificación y regresión con datos tabulares o estructurados.
- Especializadas en el procesamiento de datos con estructura espacial, como imágenes.
- Usan capas convolucionales que detectan características locales (bordes, formas).
- Incorporan pooling para reducir dimensiones y mejorar la eficiencia.
- Ampliamente usadas en reconocimiento facial, visión autónoma y clasificación de imágenes.
- Diseñadas para manejar datos secuenciales (texto, audio, series temporales).
- Cada salida depende no solo del input actual, sino también de estados anteriores.
- Variantes modernas como LSTM y GRU resuelven problemas de memoria a largo plazo.
- Aplicadas en traducción automática, generación de texto y análisis de sentimientos.
- Algoritmo base para ajustar los pesos en redes neuronales.
- Calcula el gradiente del error respecto a cada peso usando la regla de la cadena.
- Permite que la red aprenda minimizando una función de pérdida mediante optimización.
- Miden qué tan lejos están las predicciones del valor real.
- Ejemplos:
- MSE (Error Cuadrático Medio) para regresión.
- Cross-Entropy para clasificación.
- Usan los gradientes calculados para actualizar los pesos eficientemente.
- Optimizadores comunes:
- GD (Gradient Descent): Optimizador simple basado en gradiente.
- Adam: adapta el learning rate individualmente para cada parámetro.
- RMSprop: combina ideas de SGD y adaptación dinámica de la tasa de aprendizaje.
-
Patrones de diseño: Factory para ecuaciones del juego, Registry para capas.
-
Estructura de carpetas:
projecto-final-turinmachin ├── docs/ ├── doxy.conf ├── CMakeLists.txt ├── config.h.in ├── default.nix ├── shell.nix ├── flake.nix ├── flake.lock ├── deps/ │ └── catch/ ├── include │ ├── common/ │ ├── game/ │ │ ├── math/ │ │ └── sdl/ │ ├── trainer/ │ └── utec/ │ ├── algebra/ │ ├── nn/ │ └── utils/ ├── LICENSE ├── README.md ├── share/ ├── src/ │ ├── common/ │ ├── game/ │ │ ├── math/ │ │ └── sdl/ │ ├── trainer/ │ └── trainer_kan/ └── tests/
-
Cómo ejecutar:
./build/brain_ager
-
Casos de prueba:
- Test unitario de capa Dense, al verificar que una capa Dense y una capa de activación Sigmoid produce una salida del tamaño correcto y con valores entre 0 y 1, validando la propagación hacia adelante.
- Test de función de activación ReLU, para aproximar funciones lineales
$(f(x) = 2x)$ , no lineales$(f(x) = x^2)$ y periódicas$(f(x) = sin(x))$ , evaluando que la salida predicha se acerca suficientemente al valor esperado. - Se entrena una red con múltiples épocas sobre el dataset XOR. Se valida que la función de pérdida disminuye y que los resultados se ajustan a los valores esperados (
$<0.2$ para$0$ y$>0.8$ para$1$ ). - Verifica que una red neuronal sin capas devuelve exactamente el mismo tensor que recibe como entrada.
-
Métricas de ejemplo:
- Iteraciones: 500 épocas.
- Tiempo total de entrenamiento: 1m30s.
- Precisión final: 85.42%.
-
Ventajas/Desventajas:
- Código ligero y dependencias mínimas.
- Sin paralelización, rendimiento limitado.
-
Mejoras futuras:
- Uso de paralelización para mejor rendimiento.
- Uso de CUDA para mejorar potencia de cómputo.
- Mejorar implemetación de Kolmogorov Arnold Networks (KAN) para volverrlo viable.
Tarea | Miembro | Rol |
---|---|---|
Investigación teórica | Lopez Del Carpio, Joaquin Adrian | Documentar bases teóricas |
Diseño de la arquitectura | Grayson Tejada, José Daniel | UML y esquemas de clases |
Implementación del modelo | Figueroa Winkelried, Diego Alonso | Código C++ de la NN |
Pruebas y benchmarking | Walde Verano, Matías Sebastian | Generación de métricas |
Documentación y demo | Valladolid Jimenes, Gonzalo Andrés | Tutorial y video demo |
- Logros: Implementar NN desde cero, validar en dataset de ejemplo.
- Se implementó desde cero una red neuronal en C++.
- El sistema reconoce números escritos a mano y resuelve operaciones matemáticas, como en Brain Age.
- Se integró la lógica de predicción con una interfaz visual basada en SDL3.
- Evaluación:
- El modelo demuestra buena precisión en pruebas simples.
- Cumple los objetivos académicos con un diseño ligero y funcional.
- Aprendizajes:
- Comprensión práctica de backpropagation.
- Uso de funciones de activación (ReLU, Sigmoid) y optimización con MSE y BSE.
- Recomendaciones:
- Ampliar el entrenamiento con datasets reales para hacer pruebas completas.
KAN: Kolmogorov-Arnold Networks
KAN 2.0: Kolmogorov-Arnold Networks Meet Science
Este proyecto usa la licencia GPL 3. Ver LICENSE para detalles.