7: Retropropagación
- Page ID
- 51026
This page is a draft and is under active development.
\( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)
\( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)
\( \newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\)
( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\)
\( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\)
\( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\)
\( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\)
\( \newcommand{\Span}{\mathrm{span}}\)
\( \newcommand{\id}{\mathrm{id}}\)
\( \newcommand{\Span}{\mathrm{span}}\)
\( \newcommand{\kernel}{\mathrm{null}\,}\)
\( \newcommand{\range}{\mathrm{range}\,}\)
\( \newcommand{\RealPart}{\mathrm{Re}}\)
\( \newcommand{\ImaginaryPart}{\mathrm{Im}}\)
\( \newcommand{\Argument}{\mathrm{Arg}}\)
\( \newcommand{\norm}[1]{\| #1 \|}\)
\( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\)
\( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\AA}{\unicode[.8,0]{x212B}}\)
\( \newcommand{\vectorA}[1]{\vec{#1}} % arrow\)
\( \newcommand{\vectorAt}[1]{\vec{\text{#1}}} % arrow\)
\( \newcommand{\vectorB}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)
\( \newcommand{\vectorC}[1]{\textbf{#1}} \)
\( \newcommand{\vectorD}[1]{\overrightarrow{#1}} \)
\( \newcommand{\vectorDt}[1]{\overrightarrow{\text{#1}}} \)
\( \newcommand{\vectE}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash{\mathbf {#1}}}} \)
\( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)
\( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)
\(\newcommand{\avec}{\mathbf a}\) \(\newcommand{\bvec}{\mathbf b}\) \(\newcommand{\cvec}{\mathbf c}\) \(\newcommand{\dvec}{\mathbf d}\) \(\newcommand{\dtil}{\widetilde{\mathbf d}}\) \(\newcommand{\evec}{\mathbf e}\) \(\newcommand{\fvec}{\mathbf f}\) \(\newcommand{\nvec}{\mathbf n}\) \(\newcommand{\pvec}{\mathbf p}\) \(\newcommand{\qvec}{\mathbf q}\) \(\newcommand{\svec}{\mathbf s}\) \(\newcommand{\tvec}{\mathbf t}\) \(\newcommand{\uvec}{\mathbf u}\) \(\newcommand{\vvec}{\mathbf v}\) \(\newcommand{\wvec}{\mathbf w}\) \(\newcommand{\xvec}{\mathbf x}\) \(\newcommand{\yvec}{\mathbf y}\) \(\newcommand{\zvec}{\mathbf z}\) \(\newcommand{\rvec}{\mathbf r}\) \(\newcommand{\mvec}{\mathbf m}\) \(\newcommand{\zerovec}{\mathbf 0}\) \(\newcommand{\onevec}{\mathbf 1}\) \(\newcommand{\real}{\mathbb R}\) \(\newcommand{\twovec}[2]{\left[\begin{array}{r}#1 \\ #2 \end{array}\right]}\) \(\newcommand{\ctwovec}[2]{\left[\begin{array}{c}#1 \\ #2 \end{array}\right]}\) \(\newcommand{\threevec}[3]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \end{array}\right]}\) \(\newcommand{\cthreevec}[3]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \end{array}\right]}\) \(\newcommand{\fourvec}[4]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \\ #4 \end{array}\right]}\) \(\newcommand{\cfourvec}[4]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \\ #4 \end{array}\right]}\) \(\newcommand{\fivevec}[5]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \\ #4 \\ #5 \\ \end{array}\right]}\) \(\newcommand{\cfivevec}[5]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \\ #4 \\ #5 \\ \end{array}\right]}\) \(\newcommand{\mattwo}[4]{\left[\begin{array}{rr}#1 \amp #2 \\ #3 \amp #4 \\ \end{array}\right]}\) \(\newcommand{\laspan}[1]{\text{Span}\{#1\}}\) \(\newcommand{\bcal}{\cal B}\) \(\newcommand{\ccal}{\cal C}\) \(\newcommand{\scal}{\cal S}\) \(\newcommand{\wcal}{\cal W}\) \(\newcommand{\ecal}{\cal E}\) \(\newcommand{\coords}[2]{\left\{#1\right\}_{#2}}\) \(\newcommand{\gray}[1]{\color{gray}{#1}}\) \(\newcommand{\lgray}[1]{\color{lightgray}{#1}}\) \(\newcommand{\rank}{\operatorname{rank}}\) \(\newcommand{\row}{\text{Row}}\) \(\newcommand{\col}{\text{Col}}\) \(\renewcommand{\row}{\text{Row}}\) \(\newcommand{\nul}{\text{Nul}}\) \(\newcommand{\var}{\text{Var}}\) \(\newcommand{\corr}{\text{corr}}\) \(\newcommand{\len}[1]{\left|#1\right|}\) \(\newcommand{\bbar}{\overline{\bvec}}\) \(\newcommand{\bhat}{\widehat{\bvec}}\) \(\newcommand{\bperp}{\bvec^\perp}\) \(\newcommand{\xhat}{\widehat{\xvec}}\) \(\newcommand{\vhat}{\widehat{\vvec}}\) \(\newcommand{\uhat}{\widehat{\uvec}}\) \(\newcommand{\what}{\widehat{\wvec}}\) \(\newcommand{\Sighat}{\widehat{\Sigma}}\) \(\newcommand{\lt}{<}\) \(\newcommand{\gt}{>}\) \(\newcommand{\amp}{&}\) \(\definecolor{fillinmathshade}{gray}{0.9}\)Idea intuitiva de la retropropagación
El algoritmo de retropropagación es un método muy utilizado en redes neuronales para minimizar la conocida como función de pérdida o de error de la red. Esta función proporciona, durante el entrenamiento de la red neuronal, una medida de cuánto se desvían los valores proporcionados por la red de los valores reales o deseados. Los parámetros desconocidos de la red, que son las incógnitas del problema y suelen denominarse pesos, se modifican de tal forma que los valores de salida de la red se ajusten lo más posible a los deseados. Para ello, se utiliza el método del gradiente descendente, que permite minimizar el error en función de los pesos. Puesto que el error se calcula al final de la red (en la capa de salida) es más fácil calcular el efecto de las variaciones de los pesos (y, por tanto, ajustarlos) comenzando desde el final, esto es, cambiando los pesos que llegan a la capa de salida. Sucesivamente, se modifican los de cada capa intermedia en dirección hacia la capa inicial. En este proceso será de utilidad la regla de la cadena.
Vamos a considerar las funciones escalares \(f(x)=x^2\), \(g(y)=\sin y\) y \(h(z)=\exp(-z)\). La composición de las tres funciones \((h\circ g \circ f)(x)\) da lugar a \(J(x)=\exp \left(-\sin x^2 \right)\). Vamos a calcular \(\dfrac{{\rm d}J}{{\rm d}x}\) utilizando el algoritmo de retropropagación.
Aunque la composición de funciones se realiza hacia delante: \[x \rightarrow y=f(x)=x^2 \rightarrow z=g(y)=\sin y \rightarrow J(x)=h(z) =\exp(-z)\] el cálculo de la derivada lo realizamos hacia atrás, utilizando la regla de la cadena:
- Empezamos por \(h(z)=\exp(-z)\): \[\dfrac{{\rm d} J}{{\rm d} z} \rightarrow -\exp(-z)\]
- Después por \(z=g(y)=\sin(y)\): \[\dfrac{{\rm d} J}{{\rm d} y} \rightarrow \dfrac{{\rm d} J}{{\rm d} z} \dfrac{{\rm d} z}{{\rm d} y}, \quad \dfrac{{\rm d} z}{{\rm d} y}=\cos(y)\]
- Por último por \(y=f(x)=x^2\): \[\dfrac{{\rm d} J}{{\rm d} x} \rightarrow \dfrac{{\rm d} J}{{\rm d} y} \dfrac{{\rm d} y}{{\rm d} x}, \quad \dfrac{{\rm d} y}{{\rm d} x}=2x\]
- Así, resulta \[\dfrac{{\rm d} J}{{\rm d} x}(x)=-2x\cos(x^2)\exp(-\sin(x^2))\]
Sean \(\textbf{x}=(x_1,x_2)\) y las funciones: \(f(x_1,x_2)=a_1x_1 +a_2x_2\) con \(a_1\) y \(a_2\) constantes, \(g(y)=1+e^{-y}\) y \(h(z)=\dfrac{1}{z}\). La composición de las tres funciones \((h\circ g \circ f)(x)\) da lugar a \(J(x_1,x_2)=\dfrac{1}{1+e^{-(a_1x_1+a_2x_2)}}\). Esto es: \[(x_1,x_2) \rightarrow y=f(x_1,x_2)=a_1x_1 +a_2x_2 \rightarrow z=g(y)=1+e^{-y} \rightarrow J(\textbf{x})=h(z)=\dfrac{1}{z}\] El objetivo en este caso es el cálculo del gradiente de la función \(J\), \(\nabla J(\textbf{x})\), que tiene por coordenadas \(\dfrac{\partial}{\partial x_i}J(\textbf{x})\), para \(i=1,2\).
- Empezamos por \(h(z)=\dfrac{1}{z}\): \[\dfrac{\partial J}{\partial z} \rightarrow -\dfrac{1}{z^2}\]
- Después tomamos \(z=g(y)=1+e^{-y}\): \[\dfrac{\partial J}{\partial y} \rightarrow \dfrac{\partial J}{\partial z} \dfrac{\partial z}{\partial y}, \quad \dfrac{\partial z}{\partial y}=-e^{-y}\]
- Por último, para \(y=f(x_1,x_2)=a_1x_1+a_2x_2\):
- \(\dfrac{\partial J}{\partial x_1} \rightarrow \dfrac{\partial J}{\partial y} \dfrac{\partial y}{\partial x_1}, \quad \dfrac{\partial y}{\partial x_1}=a_{1}\)
- \(\dfrac{\partial J}{\partial x_2} \rightarrow \dfrac{\partial J}{\partial y} \dfrac{\partial y}{\partial x_2}, \quad \dfrac{\partial y}{\partial x_2}=a_{2}\)