Logo de CursoIA
CursoIA Curso de Inteligencia Artificial

Redes neuronales desde cero, Unidad 1 — De modelos clásicos a redes neuronales, 1.1 — Limitaciones del Machine Learning clásico ·

Necesidad de modelos más flexibles

Necesidad de modelos más flexibles

Introducción

En la búsqueda constante por mejorar el rendimiento y las capacidades de los sistemas de inteligencia artificial, es crucial comprender las limitaciones de los modelos clásicos de aprendizaje automático. Uno de estos aspectos fundamentales es la necesidad de modelos más flexibles para abordar problemas complejos que no pueden ser resueltos con técnicas tradicionales. En esta unidad, exploraremos por qué las limitaciones del machine learning clásico requieren una mayor flexibilidad en nuestros modelos y cómo las redes neuronales cumplen este papel.

Explicación principal

Limitaciones del Machine Learning clásico

Los modelos de machine learning clásicos, como los clasificadores lineales y los árboles de decisión, son limitados por su capacidad para modelar relaciones complejas en datos. Estos modelos generalmente buscan encontrar una representación lineal o polinomial simple de la relación entre las características y el resultado.

Fronteras lineales

Un ejemplo clásico es el problema del separador lineal. Cuando los datos no pueden ser separados por una frontera lineal, como en el caso del conjunto de datos XOR, los modelos lineales fallan. En estos casos, necesitamos un modelo capaz de encontrar fronteras más complejas que puedan separar las clases.

# Ejemplo de separador lineal en 2D para datos no linealmente separables
import numpy as np
import matplotlib.pyplot as plt

x = np.array([[1, 0], [0, 1], [0.5, 0.5]])
y = np.array([0, 0, 1])

# Representación de los datos en un gráfico
plt.scatter(x[y==0, 0], x[y==0, 1], color='blue')
plt.scatter(x[y==1, 0], x[y==1, 1], color='red')

# Ajuste lineal (muestra fallo)
from sklearn.linear_model import LinearRegression

model = LinearRegression()
model.fit(x, y)

x_linea = np.linspace(-1, 2, 100)
y_linea = -model.coef_ * x_linea + model.intercept_

plt.plot(x_linea, y_linea, 'k-')
plt.title("Separador lineal en datos no linealmente separables")
plt.xlabel('Característica 1')
plt.ylabel('Característica 2')
plt.show()

Feature Engineering manual

Aunque el feature engineering es una herramienta poderosa para modelar relaciones complejas, requiere un dominio profundo del problema y mucho tiempo. Además, en muchos casos, los datos no pueden ser transformados de manera manifiesta para cumplir con las suposiciones lineales.

# Ejemplo de feature engineering manual (muestra su dificultad)
x_transformado = np.array([1 - x[:,0]**2, 1 - x[:,1]**2])
model_transformado = LinearRegression()
model_transformado.fit(x_transformado, y)

y_linea_trans = model_transformado.coef_[0] * (1 - x_linea**2) + model_transformado.intercept_

plt.plot(x_linea, y_linea_trans, 'k--')
plt.title("Separador lineal después de transformación")
plt.xlabel('Característica 1')
plt.ylabel('Característica 2')
plt.show()

Necesidad de modelos más flexibles

La necesidad de modelos más flexibles surge naturalmente cuando buscamos resolver problemas que requieren representaciones no lineales. Las redes neuronales, y en particular las redes multicapa (MLP), ofrecen una solución elegante a este desafío.

Errores típicos / trampas

Falta de regularización

Una de las principales trampas es omitir la regularización. Sin ella, los modelos pueden volverse complejos y overfitar el conjunto de datos de entrenamiento, lo que reduce su rendimiento en datos no vistos.

# Ejemplo de sobreajuste sin regularización
from sklearn.neural_network import MLPClassifier

model_overfit = MLPClassifier(hidden_layer_sizes=(10,), max_iter=2000)
model_overfit.fit(x, y)

y_pred = model_overfit.predict(x_linea.reshape(-1, 1))
plt.plot(x_linea, y_pred, 'k-.')
plt.title("Sobreajuste con MLP sin regularización")
plt.xlabel('Característica 1')
plt.ylabel('Predicción')
plt.show()

Tamaño excesivo de la red

Otra trampa es construir una red neuronal demasiado grande. Esto puede resultar en overfitting y reducir el rendimiento general del modelo.

# Ejemplo de overfitting con red too big
model_overbig = MLPClassifier(hidden_layer_sizes=(100,), max_iter=2000)
model_overbig.fit(x, y)

y_pred_overbig = model_overbig.predict(x_linea.reshape(-1, 1))
plt.plot(x_linea, y_pred_overbig, 'k-+')
plt.title("Overfitting con red neuronal too big")
plt.xlabel('Característica 1')
plt.ylabel('Predicción')
plt.show()

Problemas de optimización

Los algoritmos de optimización utilizados en la backpropagation pueden tener problemas para converger a una solución óptima, especialmente en problemas complejos. Esto puede llevar a un rendimiento suboptimo o incluso a no converger.

# Ejemplo de entrenamiento sin convergencia
model_no_converge = MLPClassifier(hidden_layer_sizes=(10,), max_iter=50)
model_no_converge.fit(x, y)

y_pred_no_converge = model_no_converge.predict(x_linea.reshape(-1, 1))
plt.plot(x_linea, y_pred_no_converge, 'k-x')
plt.title("Entrenamiento sin convergencia")
plt.xlabel('Característica 1')
plt.ylabel('Predicción')
plt.show()

Checklist accionable

Paso 1: Evaluación de rendimiento

Evalúa el rendimiento del modelo en un conjunto de validación para detectar overfitting o underfitting. Si el rendimiento es muy alto en entrenamiento pero baja en validación, ajusta los hiperparámetros.

Paso 2: Regularización adecuada

Añade regularización (L1, L2) y ajusta su intensidad para evitar overfitting. Verifica si la regularización mejora el rendimiento en datos no vistos.

Paso 3: Optimización del tamaño de la red

Comienza con una estructura simple y aumenta gradualmente hasta obtener un modelo que funcione bien sin overfitting. Asegúrate de que cada capa tiene un propósito claro.

Paso 4: Configuración correcta de optimizadores

Utiliza optimizadores robustos como Adam o RMSprop, y ajusta la tasa de aprendizaje para obtener una convergencia óptima sin explotar gradients. Experimenta con diferentes configuraciones hasta encontrar lo mejor.

Paso 5: Data augmentation (si aplicable)

Incrementa el tamaño del conjunto de entrenamiento con técnicas de data augmentation para mejorar la generalización del modelo, especialmente en problemas de clasificación.

Cierre

En conclusión, las limitaciones del machine learning clásico nos llevan a buscar modelos más flexibles y potentes. Las redes neuronales ofrecen una solución efectiva al problema de representar relaciones no lineales en los datos. Sin embargo, es crucial estar atento a posibles trampas como overfitting, falta de convergencia o mala configuración del modelo.

Siguientes pasos

  • Estudiar las redes neuronales: Aprende sobre la estructura y funcionamiento de las neuronas artificiales y cómo se entrena una red neuronal.
  • Implementar tu propia red neuronal básica: Practica implementando un modelo simple desde cero en Python para entender mejor los conceptos fundamentales.
  • Experimenta con diferentes arquitecturas y hiperparámetros: Ajusta y optimiza tu red neuronal para mejorar su rendimiento.

¡Estas son solo las primeras etapas del viaje hacia la comprensión y dominio de las redes neuronales!

Contacto

Indica tu objetivo (ChatGPT, RAG, agentes, automatización) y tu stack (web/backend).