14 votos

¿Cómo puedo derivar la fórmula de retropropagación de manera más elegante?

Cuando se calcula el gradiente de la función de costo de una red neuronal con respecto a sus pesos, según mi entendimiento actual, solo se puede hacer calculando la derivada parcial de la función de costo con respecto a cada uno de los pesos individualmente, y luego se colocan en un vector grande. La razón por la que estoy calculando el gradiente es porque quiero derivar la fórmula de retropropagación.

En concreto, si $J$ es la función de costo de la red neuronal, y $\Theta^{(l)}_{ij}$ es el peso que la activación de la neurona $i$ en la capa $l-1$ tiene en el cálculo de la activación de la neurona $j$ en la capa $l$, entonces según mi entendimiento actual, para calcular el gradiente de la función de costo se tiene que calcular $\frac{\partial J}{\partial \Theta^{(l)}_{ij}}$, para cada valor de $i$, $j$ y $l. Sin embargo, al hacer esto se tiene que llevar un seguimiento de estos tres índices, y encuentro esto lo suficientemente poco elegante como para hacer la siguiente pregunta.

¿Existe alguna forma de derivar la fórmula de retropropagación que te permita llevar un seguimiento de los pesos de la red neuronal como un único objeto?

Por ejemplo, con la regresión logística, tienes un vector de pesos $\mathbf{w}$ y la función de costo de máxima verosimilitud es:

\begin{equation} J(\mathbf{w}) = \frac{1}{N}\sum_{i = 0}^{N}\ln\left(1 + e^{-y_i\mathbf{w}^{T}\mathbf{x}_i}\right) \end{equation}

y puedes calcular el gradiente de manera relativamente sencilla: \begin{align*} \nabla_{\mathbf{w}} J &= \frac{1}{N} \sum_{i = 0}^{N}\frac{-y_i\mathbf{x}_i}{1 + e^{-y_i\mathbf{w}^{T}\mathbf{x}_i}} \end{align*}

No necesitas un índice adicional para cada componente de los pesos $\mathbf{w}$ porque los estás colocando en un solo vector. Me gustaría derivar la fórmula de retropropagación de una manera que, similar a la derivación anterior del gradiente de la función de costo de regresión logística, no involucre índices para cada componente de los pesos de la red neuronal. ¿Cómo puedo hacer esto? Creo que marcos como el álgebra geométrica y los tensores podrían ser útiles aquí, por eso los he incluido en las etiquetas.

0 votos

¿Qué son $\Theta_{ij}^l$, $g'$, $z_j^l$ y $\delta_i^l?

0 votos

$\delta^l_i$ son los "errores" que retropropagas. $\Theta^{l}_{ij}$ son los pesos de la neurona en la capa $l$.

0 votos

$z^l_j$ es la combinación lineal de las activaciones de la capa anterior (capa $l-1$) que luego se alimenta a una función para calcular un valor de activación en la capa actual. Después de calcular esta combinación lineal, se alimenta a una función sigmoide, o una función logística, que denoto como $g$.

14voto

MrCranky Puntos 1146

Por mucho que me encante Clifford / álgebra geométrica, no creo que sea útil aquí. CA te permite manejar de forma libre de base los subespacios multidimensionales como objetos algebraicos, haciendo que varias derivaciones complicadas sean más elegantes y transparentes. Sin embargo, en el caso de las redes neuronales, realmente estamos tratando con un vector de parámetros. Si $\theta \in \mathbb{R}^D$ es una lista de parámetros, es de hecho un vector porque la suma de dos vectores de parámetros es nuevamente un vector de parámetros válido y un escalar multiplicado por un vector de parámetros también es un vector de parámetros válido. Este vector no posee naturalmente ninguna estructura adicional que lo convierta en un multivector.

Sin embargo, el Álgebra Lineal estándar, practicada por los matemáticos, te permite hacer cálculos libres de base con vectores. Esto realmente puede hacer que la derivación de la retropropagación sea más transparente.

La esencia de la retropropagación

Básicamente, el algoritmo de retropropagación es una forma eficiente de calcular el gradiente de una función que es la composición de varios funciones: $$ L_\theta(x) = (f_N \circ f_{N-1} \circ \cdots \circ f_1)(x)$$ $L$ se llama la pérdida, y es solo una cadena de funciones $f_i : \mathbb{R}^{D_{i-1}} \times \mathbb{R}^{P_i} \rightarrow \mathbb{R}^{D_i}$, de un vector de parámetros $\theta_i \in \mathbb{R}^{P_i}$ de dimensión $P_i$ y la salida $f_{i-1} \in \mathbb{R}^{D_{i-1}}$ de la capa anterior.

Sin elegir una base, vemos (usando la derivada total) que el gradiente de $L$ respecto al vector de parámetros completo $\theta$ es

$$ \begin{equation} \begin{aligned} \frac{d}{d \theta} f_N \circ \cdots \circ f_1 (x) \; &= \frac{\partial f_N}{\partial \theta_N} \frac{d \theta_N}{d \theta} + \frac{\partial f_N}{\partial f_{N-1}} \frac{d f_{N-1}}{d \theta} \\ &= \frac{\partial f_N}{\partial \theta_N} \frac{d \theta_N}{d \theta} + \frac{\partial f_N}{\partial f_{N-1}} \frac{\partial f_{N-1}}{\partial \theta_{N-1}} \frac{d \theta_{N-1}}{d\theta} + \frac{\partial f_N}{\partial f_{N-1}} \frac{\partial f_{N-1}}{\partial f_{N-2}} \frac{d f_{N-2}}{d\theta}\\ &= \cdots \end{aligned} \end{equation} $$ ¿Ves el patrón que se desarrolla? Obtienes productos de la forma $\frac{\partial f_N}{\partial f_{N-1}} \frac{\partial f_{N-1}}{\partial f_{N-2}} \cdots \frac{d f_{2}}{d f_1}$. Cada factor en ese producto requiere la salida de la función (capa) anterior, por lo que un algoritmo tonto volvería a calcular $f_i$ para cada término que lo requiera. Un enfoque mejor es hacer un "pase hacia adelante" donde calculamos $f_1(x)$, lo recordamos, luego lo usamos para calcular $f_2(f_1(x))$, lo recordamos, y así sucesivamente.

Luego está la cuestión de cómo calcular $\frac{\partial f_N}{\partial f_{N-1}} \frac{\partial f_{N-1}}{\partial f_{N-2}} \cdots \frac{d f_{2}}{d f_1}$ una vez que tengamos todos los valores de $f_i$. Una vez que elegimos una base (y eventualmente debemos hacerlo para obtener valores numéricos), los factores $\frac{\partial f_{i}}{\partial f_{i-1}}$ son matrices, por lo que estamos hablando de una gran multiplicación de matrices. Por ejemplo, si una capa intermedia mapea $\mathbb{R}^{1000}$ a $\mathbb{R}^{5000}$, entonces $\frac{\partial f_{i}}{\partial f_{i-1}}$ es una matriz de $5000 \times 1000$. La idea clave de la retropropagación es que la función completa $L$ tiene la firma $L : \mathbb{R}^{D_0} \rightarrow \mathbb{R}$, por lo que es mucho mejor calcular $$ \left(\left(\left( \frac{\partial f_N}{\partial f_{N-1}} \cdots \frac{\partial f_{3}}{\partial f_2} \right) \frac{\partial f_{2}}{\partial f_1} \right) \frac{d f_1}{d \theta}\right) $$ que $$ \left(\frac{\partial f_N}{\partial f_{N-1}} \cdots \left(\frac{\partial f_{3}}{\partial f_2} \left(\frac{\partial f_{2}}{\partial f_1} \frac{d f_1}{d \theta}\right)\right)\right) $$

La razón es que en el primer caso, realizamos una secuencia de multiplicaciones de matriz-vector. El resultado del producto vector-matriz $\frac{\partial f_{N}}{\partial f_{N-1}} \frac{\partial f_{N-1}}{\partial f_{N-2}}$ es nuevamente un vector, que luego multiplicamos por $\frac{\partial f_{N-2}}{\partial f_{N-3}}$, y así sucesivamente. El costo de cada multiplicación es $O(D^2)$. Para el segundo caso, se calculan productos de matriz-matriz, que tienen complejidad $O(D^3)$.

Entonces hemos establecido que la retropropagación es la explotación de la asociatividad. A la luz de esto, la retropropagación parece un algoritmo trivial (calcular el producto en el orden correcto..), pero en los años 80 podrías escribir un artículo al respecto y hacerte muy famoso :)

0 votos

Casi entiendo por completo tu derivación, es solo la última parte. El fondo es la explotación de la asociatividad, ¿por qué el primer producto es mejor de calcular que el segundo?

0 votos

He editado la respuesta

0 votos

Aunque he aceptado tu respuesta, porque va en la dirección de lo que estoy buscando. Una última cosa me está confundiendo, en el primer producto empiezas multiplicando cantidades que dependen de $f_1$ y $f_2$, y te mueves hacia afuera hacia la capa final $f_N$, como entiendo que backprop se mueve en la dirección opuesta.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X