22  Redes neuronales multicapa

Las redes neuronales que estudiamos previamente; denominadas de una sola capa, enfrentan una serie de limitaciones debido a su arquitectura simplificada. Principalmente, su habilidad para procesar información se ve restringida a funciones y relaciones lineales. Esto significa que si los datos o el problema que se intenta resolver presentan una complejidad que requiere el discernimiento de patrones no lineales, el perceptrón simple se queda corto. Su estructura no le permite modelar la rica diversidad de relaciones que podrían existir entre los datos de entrada y salida, limitando su utilidad a escenarios donde la relación es directa y sin complicaciones. Esta característica intrínseca las hace inadecuados para tareas más complejas del aprendizaje automático, como el reconocimiento de imágenes o el procesamiento del lenguaje natural, donde la habilidad para capturar y modelar interacciones no lineales entre los datos es crucial.

En esta sección, extenderemos las redes neuronales para que puedan tener varias capas de profundidad. Las redes neuronales multicapa, conocidas también como perceptrones multicapa (MLP por sus siglás en inglés) (Du y Swamy 2013), son una potente evolución en el campo de la inteligencia artificial y el aprendizaje automático, ofreciendo ventajas clave que superan ampliamente las capacidades de los modelos más simples de una sola capa. Una de sus principales fortalezas radica en su habilidad para capturar y aprender patrones no lineales complejos, algo esencial para abordar una amplia gama de problemas del mundo real que van desde el reconocimiento de imágenes hasta la comprensión del lenguaje natural. Esta capacidad se debe a su arquitectura profunda, compuesta por múltiples capas de neuronas interconectadas, donde cada capa puede extraer y refinar características de los datos de entrada, construyendo una representación cada vez más rica y detallada a medida que la información avanza a través de la red.

22.1 Capas ocultas

Las capas ocultas, como se muestra en la figura 14, son aquellas que están contenidas entre las capas de entrada y salida en una red neuronal. Cada capa oculta contiene: una matriz de pesos, un vector de sesgos y una función de activación que se aplica a todas las neuronas de dicha capa.

Como se presentó anteriormente, los pesos pueden estar contenidos en un vector; ahora en los perceptrones multicapa, existen múltiples conexiones sinápticas entre las distintas capas de la red, mismos que se pueden contener en un matriz y estos se etiquetan de la siguiente forma: \(w_{i,j}\) donde \(i\) representa la unidad de entrada y \(j\) denota el perceptrón al que esta asociada esa conexión [^1].

Red neuronal multicapa (izquierda) y matriz de pesos (derecha)

$$

W_k = \[\begin{bmatrix} w_{1,1} & \dots & w_{1,n} \ \vdots & \ddots & \vdots \ w_{m,1} & \dots & w_{m,n} \ \end{bmatrix}\]

\end{bmatrix} $$

Nóteses que se agrega el sub-índice \(k \geq 1\) a la matriz de pesos para indicar la capa oculta. De la misma forma el sesgo ahora se especifica como:

$$

B_k = [b_1, , b_n]$$

De esta forma el valor intermedio se especifica como:

$$

H_k = A_{k-1}W_k + B_k $$

donde, \(A_{k-1}\) representa la salida de la capa anterior.

La función de activación ahora recibe un vector de predicciones y retorna las activaciones, tantas como entradas haya tenido.

$$

A_{k} = f_k(H_k) $$

Note que en la ecuación (#eq:prediccion_multicapa) la función de activación se complementa con un sub-índice, esto implica que en cada capa se puede usar una función de activación distinta.

Para la capa de salida el valor de \(A\) se convierte en la predicción. Es decir si la capa \(k\)-ésima es la salida entonces: $$

= A_k$$

Ejemplo

Partiendo del siguiente diagrama de red neuronal multicapa con una capa oculta:

image

y usando los siguientes parámetros: $$

W_1 = \[\begin{bmatrix} 0.3 & 0.2 \ -0.8 & 0.9 \ \end{bmatrix}\]

\end{bmatrix}\[ \]

B_1 = [-0.8, 0.6]\[ \]

f_1 = f_{sigmoide}$$

$$

W_2 = \[\begin{bmatrix} -0.2 \ 0.7 \ \end{bmatrix}\]

\end{bmatrix}\[ \]

B_2 = [-0.1]\[ \]

f_2 = f_{ReLU}$$

Calcule la salida de la red si se introduce: $$

X = [1, 2]$$

Solución: Usando, \(A_0 = X\), y las ecuaciones (#eq:intermedio_multicapa) (#eq:prediccion_multicapa) se calcula $$

H_1 = [1, 2] \[\begin{bmatrix} 0.3 & 0.2 \ -0.8 & 0.9 \ \end{bmatrix}\]

\end{bmatrix} + [-0.8, 0.6]\[ \]

H_1 = [-2.1, 2.6]$$

$$

A_1 = f_{sigmoide} ([-2.1, 2.6])$$

$$

A_1 = [0.109, 0.930]$$

lo que nuevamente se usa para calcular $$

H_2 = [0.109, 0.930] \[\begin{bmatrix} -0.2 \ 0.7 \ \end{bmatrix}\]

\end{bmatrix} + [-0.1]\[ \]

H_2 = [0.529]$$

$$

A_2 = f_{ReLU}([0.529])\[ \]

A_2 = [0.5292]$$

Finalmente, $$

= A_2\[ \]

= [0.5292]$$

22.2 Implementación

La clase RedMulticapa está implementada como un contenedor secuencial que hereda de la clase base Modelo. Su función principal es gestionar una lista de objetos de tipo capa (como instancias de Lineal) y consolidar la información estructural de toda la red. Durante la inicialización, la clase recibe una lista de capas y calcula automáticamente el número total de parámetros del modelo, sumando los atributos n_parametros de cada componente individual. El flujo de datos se resuelve en el método forward, donde se implementa el paso hacia adelante mediante un ciclo que propaga la señal de forma iterativa: la salida de una capa se convierte inmediatamente en la entrada de la siguiente. Esta abstracción permite construir redes de cualquier profundidad y ancho de manera modular y eficiente.

class RedMulticapa(Modelo):
    def init(self, capas):
        super().init()
        self.capas = capas
        # Suma de parametros de todas las capas que componen la red
        self.n_parametros = sum(capa.n_parametros for capa in capas)
    def forward(self, X):
        # Propagacion secuencial de la entrada a traves de cada capa
        for capa in self.capas:
            X = capa.forward(X)
        return X

22.3 La base de muchos avances recientes

A pesar de que el perceptrón multicapa es una arquitectura con una larga historia en el campo de la inteligencia artificial, su importancia no ha mermado y ahora es base fundamental dentro del aprendizaje profundo. Su aplicación se extiende a diversos dominios, incluyendo su rol crucial en la etapa de clasificación de las redes neuronales convolucionales (CNNs)(LeCun, Bengio, y Hinton 2015), donde contribuye a interpretar las características visuales extraídas para la identificación de objetos. Además, se integra dentro de los avanzados mecanismos de atención en los modelos de transformers (Vaswani 2017), facilitando procesos complejos como la comprensión y generación de lenguaje natural. Otro ámbito de aplicación innovador es en el desarrollo de representaciones implícitas, como se ejemplifica en las Neural Radiance Fields (NeRF) (Mildenhall et al. 2021), donde el perceptrón multicapa ayuda a modelar escenas 3D complejas con un nivel de detalle y realismo impresionantes. Esta versatilidad demuestra que, lejos de quedar obsoleto, el perceptrón multicapa sigue adaptándose y encontrando nuevas aplicaciones en la vanguardia de la investigación y el desarrollo tecnológico.

22.4 Ejercicios

Ejercicio

Tomando en cuenta la siguiente red neuronal multicapa: image donde: $$

X = [ 0.1, 0.2 ],

W_1 = \[\begin{bmatrix} -0.5 \ 0.4 \end{bmatrix}\] \end{bmatrix}, W_2 = \[\begin{bmatrix} 0.3 \end{bmatrix}\]

, B_1 = [-0.1], B_2 = [0.8]$$

y suponiendo funciones de activación: $$

f_1 = sigmoid, f_2 = tanh$$

  1. Calcule la salida de la capa oculta, \(A_1\).

  2. Calcule la predicción de la red, \(\hat{Y}\).

Ejercicio

Suponga una red neuronal de dos entradas, una capa intermedia de tres neuronas y una salida de dos. Tal como se ilustra en la siguiente figura:

image

Donde, $$

W_1 = \[\begin{bmatrix} -0.5 & -0.2 & 0.2 \ 0.4 & -0.1 & 0.9 \end{bmatrix}\] .1 & 0.9 \end{bmatrix}, W_2 = \[\begin{bmatrix} 0.3 \ 0.0 \ 0.5 \end{bmatrix}\]

0.5 \end{bmatrix},\[ \]

B_1 = [-0.8, -0.5, 0.0], B_2 = [-0.2]$$

y suponiendo funciones de activación: $$

f_1 = ReLU, f_2 = sigmoide$$

Determine las predicciones de la red para el siguiente conjunto de datos de entrada:

    $X$        $Y$

\([0.4, -0.9]\) 0 \([0.9, 0.8]\) 1

Ejercicio

Muestre que, si se utiliza una función lineal con coeficientes uno, es decir \(f(h) = h\), y se pasa la salida del perceptrón a otra combinación lineal, es decir = \(h_2 = w_2f(w_1x+b_1) + b_2\), se genera nuevamente una combinación lineal del mismo orden.

Du, Ke-Lin, y Madisetti NS Swamy. 2013. Neural networks and statistical learning. Springer Science & Business Media.
LeCun, Yann, Yoshua Bengio, y Geoffrey Hinton. 2015. «Deep learning». nature 521 (7553): 436-44.
Mildenhall, Ben, Pratul P Srinivasan, Matthew Tancik, Jonathan T Barron, Ravi Ramamoorthi, y Ren Ng. 2021. «Nerf: Representing scenes as neural radiance fields for view synthesis». Communications of the ACM 65 (1): 99-106.
Vaswani, A. 2017. «Attention is all you need». Advances in Neural Information Processing Systems.