Capítulo 26 — Machine Learning e Inteligencia Artificial en C¶
Objetivos de aprendizaje
- Implementar regresión, redes neuronales (MLP, CNN, RNN) en C puro.
- Entender el autograd y la diferenciación automática.
- Conocer algoritmos clásicos (k-means, árboles, SVM) y la inferencia en producción.
Relación con el capítulo 38
Este capítulo ofrece una panorámica amplia de ML en C; el capítulo 38 profundiza en deep learning construyendo un framework con tensores y autograd desde cero. Aquí establecemos los cimientos.
26.1–26.2 Fundamentos y álgebra lineal para ML¶
ML = ajustar parámetros para minimizar una función de pérdida. El motor es el descenso de gradiente. Todo se reduce a operaciones de álgebra lineal (cap. 16): productos matriz-vector, que en C se implementan con bucles bien ordenados (cap. 21).
26.3 Regresión lineal y logística¶
// Regresión lineal por descenso de gradiente
void entrenar(double *w, double *b, const double *X, const double *y,
int n, int d, double lr, int epocas) {
for (int e = 0; e < epocas; e++) {
for (int i = 0; i < n; i++) {
double pred = *b;
for (int j = 0; j < d; j++) pred += w[j] * X[i*d + j];
double err = pred - y[i];
for (int j = 0; j < d; j++) w[j] -= lr * err * X[i*d + j];
*b -= lr * err;
}
}
}
La logística añade la sigmoide y la entropía cruzada para clasificación binaria.
26.4–26.6 Redes neuronales¶
- MLP (perceptrón multicapa): capas densas + activaciones no lineales (ReLU, sigmoide); entrenamiento por retropropagación.
- CNN: convoluciones para visión; pooling; aprovechan la localidad espacial.
- RNN/LSTM: secuencias (texto, series temporales) con estado recurrente.
double relu(double x) { return x > 0 ? x : 0; }
double sigmoide(double x){ return 1.0 / (1.0 + exp(-x)); }
26.7 Autograd y diferenciación automática¶
El corazón del deep learning: en lugar de derivar a mano, se construye un grafo de cómputo y se propaga el gradiente hacia atrás (reverse-mode AD). Se desarrolla en detalle en el cap. 38.
26.8–26.11 Algoritmos clásicos¶
- Árboles de decisión / Random Forest: interpretables, sin necesidad de GPU.
- k-means: clustering no supervisado.
- SVM: clasificación con margen máximo.
- PCA: reducción de dimensionalidad (autovalores, cap. 16).
26.12–26.13 Inferencia y librerías¶
Para desplegar modelos en C: ONNX Runtime, TensorFlow Lite, llama.cpp, ggml, darknet. La inferencia en C/C++ con cuantización (INT8/INT4) es lo que permite ejecutar modelos en dispositivos sin GPU.
Conexión con la actualidad¶
La explosión de la IA generativa ha puesto a C/C++ en el centro de la
inferencia eficiente. El proyecto llama.cpp de Georgi Gerganov —y su
biblioteca ggml/gguf, escritas en C— permitió por primera vez ejecutar
grandes modelos de lenguaje (LLaMA, Mistral, etc.) en portátiles y móviles
mediante cuantización agresiva, y se ha convertido en uno de los proyectos
más influyentes del ecosistema open-source de IA (es el motor detrás de Ollama
y de incontables aplicaciones locales). Esto confirma una tesis del curso:
mientras el entrenamiento vive en Python/CUDA, la inferencia en el borde
—móviles, IoT, edge— pertenece a C por su control de memoria y rendimiento. La
tinyML (modelos en microcontroladores, cap. 20) es otra frontera donde C es
insustituible.
Ejercicios¶
Ejercicio 26.1 — Regresión lineal ★★
Ajusta una recta a datos con ruido por descenso de gradiente; grafica la pérdida por época.
Ejercicio 26.2 — Clasificador logístico ★★★
Clasifica un dataset 2D linealmente separable y dibuja la frontera de decisión.
Ejercicio 26.3 — MLP para XOR ★★★★
Entrena una red de una capa oculta para resolver XOR con retropropagación implementada a mano.
Ejercicio 26.4 — k-means ★★★
Agrupa puntos 2D en k clústeres y visualiza la convergencia.
Referencias¶
- Neural Networks from Scratch (conceptos); Michael Nielsen, Neural Networks and Deep Learning (gratuito).
- Andrew Ng, Machine Learning (Coursera) — fundamentos.
- llama.cpp / ggml.
- Pattern Recognition and Machine Learning (Bishop).