Retropropagación (backpropagation)

Nivel AvanzadoDificultad ★★★★★Aplicación⌖ Ver en el mapa

¿Qué es?

El algoritmo que calcula ∂L/∂W\partial L/\partial W y ∂L/∂b\partial L/\partial b para cada capa de una red: una pasada hacia delante guardando los valores intermedios y otra hacia atrás aplicando la regla de la cadena desde la pérdida hasta las entradas. Coste: unas dos veces la pasada hacia delante, sea cual sea el número de parámetros.

¿Por qué existe?

El descenso de gradiente necesita el gradiente respecto de cada peso. Calcular cada derivada parcial por separado (o con diferencias finitas) cuesta una evaluación completa de la red por peso: imposible con 10910^9 pesos. La retropropagación comparte el trabajo: la derivada de la pérdida respecto de la salida de una capa se calcula una vez y se reutiliza para todos los pesos que entran en ella.

Intuición

Repartir culpas. La pérdida dice «la salida se ha pasado tanto». Cada capa devuelve la culpa a sus entradas en proporción a cuánto influyeron (las derivadas locales), y cada peso recibe (culpa que llega a su neurona) × (la entrada que multiplicó). Ese producto es ∂L/∂w\partial L/\partial w.

¿De dónde sale? Sigue los prerrequisitos: retropropagación ← regla de la cadena ← derivadas; ← derivadas parciales ← gradiente ← funciones de varias variables; ← descenso de gradiente ← optimización; ← redes neuronales.

Definición formal

Para y^=f(z)\hat y = f(z), z=Wx+bz = Wx + b y pérdida L(y^,y)L(\hat y, y), con δ=∂L∂z=∂L∂y^⊙f′(z)\delta = \frac{\partial L}{\partial z} = \frac{\partial L}{\partial\hat y}\odot f'(z):

∂L∂W=δ x𝖳,∂L∂b=δ,∂L∂x=W𝖳δ.\frac{\partial L}{\partial W} = \delta\,x^{\mathsf T}, \qquad \frac{\partial L}{\partial b} = \delta, \qquad \frac{\partial L}{\partial x} = W^{\mathsf T}\delta.

En una red profunda la última fórmula pasa δ\delta a la capa anterior: δ(ℓ)=(W(ℓ+1)𝖳δ(ℓ+1))⊙σ′(z(ℓ))\delta^{(\ell)} = \big(W^{(\ell+1)\mathsf T}\delta^{(\ell+1)}\big)\odot\sigma'(z^{(\ell)}).

Fórmulas

∂L∂W=∂L∂y^⋅∂y^∂z⋅∂z∂W,y^=f(Wx+b)\frac{\partial L}{\partial W} = \frac{\partial L}{\partial\hat y}\cdot\frac{\partial\hat y}{\partial z}\cdot\frac{\partial z}{\partial W}, \qquad \hat y = f(Wx + b)
∂L∂W=δ x𝖳,∂L∂b=δ\frac{\partial L}{\partial W} = \delta\,x^{\mathsf T}, \qquad \frac{\partial L}{\partial b} = \delta
δ(ℓ)=(W(ℓ+1)𝖳 δ(ℓ+1))⊙σ′(z(ℓ))\delta^{(\ell)} = \Big(W^{(\ell+1)\mathsf T}\,\delta^{(\ell+1)}\Big)\odot\sigma'\big(z^{(\ell)}\big)

¿Cómo se calcula?

adelante: a0 = x;  para ℓ = 1..L:  zℓ = Wℓ aℓ₋₁ + bℓ;  aℓ = σ(zℓ)    # guardar cada zℓ, aℓ
pérdida:  L = ℓ(aL, y);  δ = ∂ℓ/∂aL ⊙ σ'(zL)
atrás:    para ℓ = L..1:
              ∂L/∂Wℓ = δ aℓ₋₁ᵀ ;  ∂L/∂bℓ = δ
              δ = (Wℓᵀ δ) ⊙ σ'(zℓ₋₁)
actualizar: Wℓ ← Wℓ − η ∂L/∂Wℓ ;  bℓ ← bℓ − η ∂L/∂bℓ

Ejemplo

Una neurona, y^=σ(wx+b)\hat y = \sigma(wx + b), pérdida cuadrática L=12(y^−y)2L = \frac12(\hat y - y)^2, con x=1,5x = 1{,}5, y=1y = 1, w=0,8w = 0{,}8, b=−0,2b = -0{,}2. Hacia delante: z=1,0z = 1{,}0, y^=σ(1)≈0,731\hat y = \sigma(1) \approx 0{,}731, L≈0,036L \approx 0{,}036. Hacia atrás: ∂L/∂y^=−0,269\partial L/\partial\hat y = -0{,}269, σ′(z)=0,197\sigma'(z) = 0{,}197, δ≈−0,053\delta \approx -0{,}053, así que ∂L/∂w=δx≈−0,080\partial L/\partial w = \delta x \approx -0{,}080 y ∂L/∂b≈−0,053\partial L/\partial b \approx -0{,}053. Ambas negativas: hay que aumentar ww y bb. Reprodúcelo paso a paso en la demo.

Visualización interactiva

x
w
b
→
z = wx + b
→
ŷ = f(z)
→
L = ½(ŷ − y)²∂L/∂L = 1

valor hacia delante ·gradiente ∂L/∂· que fluye hacia atrás

La regla de la cadena, evaluada hacia atrás: ∂L/∂w = (∂L/∂ŷ)·(∂ŷ/∂z)·(∂z/∂w). Para una capa ŷ = f(Wx + b) el mismo cálculo da ∂L/∂W = δ xᵀ y ∂L/∂b = δ con δ = (ŷ − y) ⊙ f′(z). Prueba ReLU con z negativo: el gradiente es cero y la neurona no puede aprender («ReLU muerta»).

¿Por qué importa?

La popularizaron Rumelhart, Hinton y Williams (1986), con raíces en la diferenciación automática en modo inverso de Linnainmaa (1970) y en la teoría de control. Hizo entrenables las redes multicapa y, escalada en GPU, hizo posible el deep learning. Cada llamada a loss.backward() la ejecuta.

Las matemáticas que hay detrás

  • Regla de la cadena★★★★★fundamental

    La retropropagación es la regla de la cadena evaluada desde la pérdida hacia atrás, reutilizando cada producto intermedio.

  • Derivadas parciales★★★★★fundamental

    La retropropagación calcula ∂L/∂w\partial L/\partial w para cada peso ww de la red.

  • Regla de la cadena multivariable★★★★★fundamental

    Retropropagación = la regla de la cadena multivariable evaluada en orden inverso sobre el grafo de la red.

¿Dónde se utiliza?

Temas de informática a los que se llega desde aquí, con la cadena de ideas que lleva a ellos:

Qué depende de él

Ejercicios

1IA

Para y^=σ(wx+b)\hat y = \sigma(wx + b) y L=12(y^−y)2L = \frac12(\hat y - y)^2, deduce ∂L/∂w\partial L/\partial w y ∂L/∂b\partial L/\partial b.

Solución

∂L/∂w=(y^−y) y^(1−y^) x\partial L/\partial w = (\hat y - y)\,\hat y(1 - \hat y)\,x y ∂L/∂b=(y^−y) y^(1−y^)\partial L/\partial b = (\hat y - y)\,\hat y(1 - \hat y).

2Informática

¿Por qué la retropropagación necesita guardar las activaciones de la pasada hacia delante, y cómo intercambia el checkpointing memoria por cómputo?

Solución

Las derivadas locales (σ′(z(ℓ))\sigma'(z^{(\ell)}), a(ℓ−1)a^{(\ell-1)}) dependen de valores de la pasada hacia delante. El checkpointing guarda solo las activaciones de algunas capas y recalcula las demás en la pasada hacia atrás: la memoria baja (a O(L)O(\sqrt L) con una colocación óptima) a cambio de más o menos una pasada hacia delante extra.

↑ ↓ para navegar · ↵ · Esc