1  Fundamentos

Serie Deep Learning · del perceptrón a los transformers.

Contexto, motivación y representación matemática de los datos para comenzar el recorrido del libro. El entrenamiento de redes se desarrolla en el capítulo Pérdida y backpropagation.

# Importaciones necesarias para todo el notebook
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.datasets import make_classification
import warnings
warnings.filterwarnings('ignore')

# Configuración de visualización
plt.style.use('seaborn-v0_8-whitegrid')
plt.rcParams['figure.figsize'] = (10, 6)
plt.rcParams['font.size'] = 11

1.1 1. Contexto y Motivación

1.1.1 Evolución de Machine Learning a Deep Learning

En muchas aplicaciones de Machine Learning tradicional (regresión lineal, árboles de decisión, SVM, etc.), un humano diseña características (features) a partir de los datos crudos. Por ejemplo, para imágenes se extraían histogramas, bordes o descriptores como SIFT. Ese proceso se llama feature engineering y limita mucho el rendimiento: si las features no capturan bien el problema, el modelo no puede mejorar.

El Deep Learning cambia el paradigma: en lugar de diseñar features a mano, se usan redes neuronales profundas (muchas capas) que aprenden representaciones jerárquicas de los datos de forma automática. Las primeras capas suelen capturar patrones de bajo nivel (bordes, texturas) y las capas profundas combinan esos patrones en conceptos de alto nivel (objetos, escenas). Así, el propio modelo “decide” qué representaciones son útiles para la tarea.

1.1.2 Diferencias clave

Aspecto ML Tradicional Deep Learning
Features Ingeniería manual Aprendidas automáticamente
Escalabilidad Depende del problema y de la representación Puede mejorar con datos informativos y capacidad adecuada
Dominios Tabulares, estructurados Imágenes, texto, audio, secuencias
Interpretabilidad Suele ser más interpretable Modelos más “caja negra”

1.1.3 Aplicaciones industriales actuales

  • Visión artificial: Detección de objetos, reconocimiento facial, vehículos autónomos, diagnóstico por imagen (radiología, dermatología).
  • Procesamiento de lenguaje natural (NLP): Traducción automática, chatbots, análisis de sentimiento, resumen de textos, modelos de lenguaje (GPT, BERT).
  • Sistemas de recomendación: Netflix, Spotify, Amazon y redes sociales usan redes profundas para personalizar contenido y anuncios.
  • Audio: Reconocimiento de voz (asistentes), generación de voz sintética, separación de fuentes.

1.1.4 ¿Por qué Deep Learning funciona mejor con grandes volúmenes de datos?

Las redes profundas tienen millones (o miles de millones) de parámetros. Con pocos datos, esos parámetros pueden ajustarse demasiado a los ejemplos si no hay datos, regularización o transferencia apropiados; entonces el modelo sobreajusta: funciona bien en train pero mal en datos nuevos. Con muchos datos, el modelo puede aprender patrones estadísticamente estables y generalizables, aunque una red también puede memorizar parte de los datos. Por eso el auge del Deep Learning está ligado a la disponibilidad de grandes datasets y capacidad de cómputo (GPUs).


1.2 2. Representación Matemática de los Datos

Para entender cómo aprenden las redes neuronales es esencial manejar la representación matemática de los datos y las operaciones que se hacen sobre ellos.

1.2.1 Conceptos clave

  • Vector: Una lista ordenada de números (en ML suele ser un vector columna). Representa las características (features) de una sola muestra. Ejemplo: una persona puede describirse por el vector \((1.75, 70, 25)\) (altura en m, peso en kg, edad en años). La longitud del vector es la dimensionalidad del problema (aquí, 3).

  • Matriz: Un conjunto de vectores dispuestos en filas (o columnas). En ML es habitual que cada fila sea una muestra y cada columna sea una feature. Así, una matriz \(\mathbf{X}\) de tamaño \(m \times n\) tiene \(m\) muestras y \(n\) features. Todas las operaciones de un batch (lote) de datos se expresan con esta matriz.

  • Dimensionalidad: El número de features (columnas) indica cuántas variables usamos, no cuánta información útil contienen para describir cada muestra. En redes profundas se trabaja con dimensionalidades altas (cientos o miles), lo que hace imprescindible el uso eficiente de operaciones matriciales.

1.2.2 Operaciones fundamentales

  • Producto punto (dot product) entre dos vectores: \(\mathbf{a} \cdot \mathbf{b} = \sum_i a_i b_i\). Da un escalar. Si pensamos en \(\mathbf{a}\) como datos y \(\mathbf{b}\) como pesos, el producto punto es la “combinación lineal” que usa una neurona para una sola muestra.

  • Multiplicación matricial: Para matrices \(\mathbf{A}\) (tamaño \(m \times k\)) y \(\mathbf{B}\) (\(k \times n\)), el resultado \(\mathbf{C} = \mathbf{A}\mathbf{B}\) tiene tamaño \(m \times n\) con \((\mathbf{AB})_{ij} = \sum_{k} A_{ik} B_{kj}\). Así podemos aplicar el mismo conjunto de pesos a todas las muestras de un batch en una sola operación.

  • Interpretación geométrica: Los vectores de datos viven en un espacio de características (cada eje es una feature). Vectores cercanos en ese espacio suelen corresponder a muestras similares. Las transformaciones lineales (producto por una matriz de pesos) pueden combinar, proyectar, rotar o escalar coordenadas según la matriz; las funciones de activación introducen no linealidad y permiten modelar fronteras de decisión complejas.

# Ejemplo: Vectores y matrices en NumPy

# Un vector (una muestra con 3 features: ej. altura, peso, edad)
x = np.array([1.75, 70, 25])
print("Vector (una muestra):", x)
print("Dimensionalidad:", x.shape[0])

# Una matriz (dataset de 4 muestras, 3 features)
X = np.array([
    [1.75, 70, 25],   # persona 1
    [1.60, 55, 30],   # persona 2
    [1.85, 90, 22],   # persona 3
    [1.70, 65, 28],   # persona 4
])
print("\nMatriz (dataset):")
print(X)
print("Forma: {} muestras × {} features".format(X.shape[0], X.shape[1]))

# Producto punto entre dos vectores
w = np.array([0.5, 0.1, -0.2])
producto_punto = np.dot(x, w)
print("\nProducto punto x · w =", producto_punto)

# Multiplicación matricial: X @ w (cada fila de X con w)
predicciones = X @ w  # o np.dot(X, w)
print("Predicciones para todas las muestras:", predicciones)
Vector (una muestra): [ 1.75 70.   25.  ]
Dimensionalidad: 3

Matriz (dataset):
[[ 1.75 70.   25.  ]
 [ 1.6  55.   30.  ]
 [ 1.85 90.   22.  ]
 [ 1.7  65.   28.  ]]
Forma: 4 muestras × 3 features

Producto punto x · w = 2.875
Predicciones para todas las muestras: [2.875 0.3   5.525 1.75 ]

1.3 Continuación

Continúa con Tensores y autograd, Datasets de referencia y Generación de datos. Ese recorrido prepara Perceptrón y MLP.

1.4 Referencias

  • Goodfellow, Bengio y Courville (2016), Deep Learning, capítulos 1, 2 y 6. Alcance, álgebra y redes feedforward.
  • LeCun, Bengio y Hinton (2015), Deep learning. Revisión de representaciones y aplicaciones.