Asumiendo que ya se conocen conceptos fundamentales para trabajar con procesamiento de información, e incluso que se tienen nociones de Minería de Datos en caso de necesitarlas, ya podemos entrar en el mundo del Aprendizaje Automático, empezando por el Aprendizaje Supervisado.
Las lecciones a tratar en este tema son:
- Regresión y clasificación
- Modelos lineales y probabilísticos
- Modelos no lineales
- Evaluación, optimización y ensamblados
- Redes neuronales artificiales
A la hora de aplicar todo esto a videojuegos hay que tener presente que un modelo supervisado «perfecto» que tarda 50 ms en evaluar un estado es sencillamente inviable dentro del bucle de juego (donde todo el fotograma dispone de 16.6 ms a 60 FPS), de manera que muchas veces es necesario buscar otras soluciones.
Ejercicios
Para practicar lo aprendido pueden hacerse algunos ejercicios.
Prácticas
Para aplicar los conocimientos y las técnicas de este tema pueden realizarse prácticas como estas:
- Regresión lineal con descenso de gradiente programada en Python. Se puede ampliar hasta llegar a la regresión logística de múltiples variables.
- Predecir el famoso churn donde la variables objetivo ya está etiquetada (si el jugador abandona o no). Para este problema tan clásico se usarían modelos de clasificación… como regresión logística, árboles de decisión, bosque aleatorio, XGBoost (incluso LightGBM y CatBoost si se cuentan)… y así se practica cómo entrenar modelos para predicción, dividirlos en tres grupos: entrenamiento, validación y prueba… e incluso evaluar accuracy, precisión, recall, F1 y ROC-AUC… e interpretar la importancia de las variables.
- Predecir el churn pero con una pequeña red neuronal. Implementar un perceptrón multicapa en Python (desde cero, bueno con NumPy, para entender bien cómo funciona) usando descenso de gradiente y backpropagation. El problema puede ser uno clásico «de juguete», como las compuertas lógicas XOR o dígitos MNIST simplificados. Se aprenden conceptos de forward pass, funciones de activación (sigmoide, ReLU…), backpropagation, optimización (SGD, Adam), pérdida (loss function)… Esta práctica es el salto lógico de la regresión logística hacia la complejidad de una red neuronal. ¡Programar el backpropagation (la regla de la cadena para las derivadas hacia atrás) es duro pero fundamental para entender luego cómo aprende cualquier red profunda!
- Programarse el bucle del descenso de gradiente (forward pass, cálculo del error y actualización de pesos mediante derivadas), para entender el concepto de learning rate y convergencia. Después pasar de lineal a logística sólo requiere meter la función sigmoide y cambiar la función de pérdida. Una vez que uno ha hecho el esfuerzo personal de programar el descenso de gradiente a mano, es el momento de aprender que con Sklearn… ¡se hace en tres líneas! Se crea el modelo (model = LinearRegression()), entrenarlo (model.fit(X_train, y_train)) y usarlo (y_pred = model.predict(X_test)). Una vez visto esto se pueden introducir otros modelos como Árboles de Decisión o SVM y las métricas de evaluación… ya se podría por ejemplo resolver un problema mucho más complejo (con variables categóricas, texto o con muchas dimensiones) usando el abanico de modelos de Sklearn y validación cruzada.
- Justo después del MLP manual se puede hacer una práctica con Python o con Keras. Es una forma de ver que el cálculo de gradientes hemos programado a mano en algún ejercicio anterior, ya lo hacen automáticamente estas librerías (autograd). Si el perfil es más científico de datos enfocado a producción rápida, Keras es muy intuitivo. Si el perfil es más de ingeniería, desarrollo de software o investigación avanzada como ocurre con los videojuegos, PyTorch es el estándar de la industria actual y ofrece un control más transparente de los tensores.
- Una segunda parte de una práctica conjunta trataría sobre utilizar PyTorch/Keras para cargar una arquitectura preentrenada o construir una red convolucional/recurrente simple para clasificar imágenes o texto.
- Probar distintos modelos en la práctica usando scikit-learn. De este modo se ve cómo manejar una red neuronal en abstracto: definiendo la arquitectura de capas ocultas, entrenando con una simple llamada a .fit() y prediciendo con .predict().
Referencias
Para complementar este tema es recomendable consultar otros documentos: