Logo de CursoIA
CursoIA Curso de Inteligencia Artificial

Álgebra lineal aplicada a IA, Unidad 4 — Transformaciones lineales, 4.2 — Transformaciones como capas ·

Composición de transformaciones

Composición de transformaciones

Introducción

La composición de transformaciones es un concepto fundamental en la aplicación del álgebra lineal a inteligencia artificial, particularmente en redes neuronales y aprendizaje profundo. Las transformaciones lineales se utilizan para manipular datos, mapear características y aprender patrones en los datos. La composición de estas transformaciones nos permite crear modelos más complejos y expresivos. En este artículo exploraremos cómo compusimos transformaciones, su importancia en el aprendizaje profundo y algunos errores comunes a evitar.

Explicación principal con ejemplos

Qué es la composición de transformaciones

En álgebra lineal, una transformación lineal puede ser representada por una matriz. Cuando tenemos múltiples transformaciones, podemos compusirlas para crear nuevas transformaciones más complejas. Esto se hace multiplicando las matrices correspondientes.

Por ejemplo, consideremos dos transformaciones: una rotación y una escala. Podemos representarlas con las siguientes matrices:

import numpy as np

# Matriz de rotación 90 grados (con respecto al eje z)
rotacion = np.array([[0, -1], [1, 0]])

# Matriz de escalamiento en el doble de tamaño
escalamiento = np.array([[2, 0], [0, 2]])

Para compusir estas transformaciones, simplemente multiplicamos las matrices:

transformacion_total = rotacion @ escalamiento
print(transformacion_total)

Este código nos da la matriz que representa la composición de ambas transformaciones. Es importante recordar que la multiplicación matricial no es conmutativa, por lo que el orden en el que compusimos las transformaciones importa.

Aplicación en redes neuronales

En redes neuronales, cada capa puede ser vista como una transformación lineal seguida de una función no-lineal (activación). La composición de estas transformaciones nos permite crear modelos más expresivos y poderosos. Por ejemplo, consideremos una red neuronal con dos capas:

import torch

# Definir las matrices de pesos para cada capa
w1 = torch.tensor([[0.5, 0.3], [0.2, -0.4]])
w2 = torch.tensor([[-0.7, 0.6]])

# Aplicar la composición de transformaciones
def apply_transformations(x):
    h = torch.matmul(x, w1)
    y = torch.matmul(h, w2)
    return y

# Entrada a la red neuronal
x = torch.tensor([[1.0], [2.0]])
output = apply_transformations(x)
print(output)

Este ejemplo muestra cómo compusimos transformaciones lineales para crear una representación más compleja del dato de entrada.

Errores típicos / trampas

1. Confundir la composición con la adición

Una de las trampas más comunes es confundir la composición de transformaciones con su adición. Asumir que compusimos transformaciones cuando simplemente sumamos sus matrices puede llevar a resultados incorrectos.

# Incorrecto: suma en lugar de composición
suma = w1 + w2
print(suma)

2. Olvidar el orden de la multiplicación

Como mencionamos antes, la multiplicación matricial no es conmutativa. Olvidarse del orden en que compusimos las transformaciones puede llevar a resultados inesperados.

# Incorrecto: intercambiar el orden de la composición
incorrecto = escalamiento @ rotacion
print(incorrecto)

3. No considerar la función no-lineal

En redes neuronales, es importante recordar que cada capa se sigue por una función no-lineal (activación). Olvidar esta parte puede llevar a un modelo subexpresivo.

# Incorrecto: omitir la función de activación
def apply_transformations(x):
    h = torch.matmul(x, w1)
    return h

output = apply_transformations(x)
print(output)

4. No normalizar los datos correctamente

La composición de transformaciones puede ser sensible a la escala y distribución de los datos. Olvidar normalizar los datos adecuadamente puede afectar el rendimiento del modelo.

# Incorrecto: no normalizando los datos
def apply_transformations(x):
    h = torch.matmul((x - mean) / std, w1)
    return h

output = apply_transformations(x)
print(output)

5. Ignorar la estabilidad numérica

Las operaciones matriciales pueden ser susceptibles a errores de redondeo y estabilidad numérica. Ignorar estos factores puede llevar a resultados inexactos.

# Incorrecto: sin consideración de la estabilidad numérica
def apply_transformations(x):
    h = torch.matmul(x, w1)
    y = torch.matmul(h, w2)
    return y

output = apply_transformaciones(x + 0.0001) # Añadir una pequeña cantidad para demostrar inestabilidad
print(output)

Checklist accionable

  • Verifica que estás compusiendo transformaciones correctamente (no estés sumando matrices).
  • Confirma el orden de la multiplicación al compusir transformaciones.
  • Incorpora funciones no-lineales después de cada capa en tu red neuronal.
  • Normaliza los datos antes de aplicar cualquier transformación lineal.
  • Considera la estabilidad numérica y evita errores de redondeo.

Siguientes pasos

  • Profundizar en la teoría: Estudia más sobre composición de transformaciones en álgebra lineal.
  • Practicar con código: Implementa ejemplos prácticos en tu lenguaje de programación favorito.
  • Aplicar en proyectos: Comienza a compusir transformaciones en tus propios proyectos de inteligencia artificial para mejorar su expresividad.

Siguiendo estos consejos, podrás aprovechar mejor la composición de transformaciones para mejorar el rendimiento y la precisión de tus modelos de IA.

Contacto

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