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
¿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$.
0 votos
Todos estos son valores reales, por supuesto.
0 votos
@RobertLewis ¿Debería intentar añadir a mi pregunta una explicación de mi notación?
0 votos
Bueno, haría que la pregunta "se viera bien" y fuera más clara. Si estuviera haciendo la pregunta, lo haría. ¡Saludos!
0 votos
@RobertLewis ¿Ahora está suficientemente claro?
0 votos
Creo que es más sencillo y mejor escribir la fórmula de retropropagación y luego describir lo que necesitas
0 votos
@Shuchang sin embargo, la pregunta no se trata de la fórmula de retropropagación, sino de un método para derivar la fórmula de retropropagación.
0 votos
@user1176201 Lo siento, me refiero a la forma original de derivar la fórmula y todo lo que necesitamos hacer es mostrar si se pueden reescribir en lenguaje de matrices. Es mejor incluir más contextos como notaciones y fórmulas. En mi opinión, no tiene (al menos) una forma elegante de derivar en lenguaje de matrices, de lo contrario alguien ya habría propuesto hacerlo público hace mucho tiempo.
0 votos
@María, ¿podrías derivar la fórmula de retropropagación usando este método y colocarla como respuesta?
0 votos
No es realmente una respuesta matemática (esto es más como una respuesta de ingeniería), por eso no la coloco como respuesta aquí. Si piensas en cada capa como una entidad aislada (una clase/objeto), puedes propagar hacia atrás el error dentro de una sola capa usando simples operaciones matriciales/vectoriales. Luego, la computación general también es un simple bucle. No cambia la elegancia de la fórmula actual, pero podría mejorar la elegancia de la implementación.