Manuelle Implementierung der Kettenregel

Konstruieren Sie eine zusammengesetzte Funktion, berechnen Sie manuell lokale Gradienten Schicht für Schicht und multiplizieren Sie sie, dann verifizieren Sie mit sympy.

Nach Abschluss dieses Falls verstehen Sie:Der Kern der Backpropagation ist die Kettenregel—jede Schicht berechnet nur ihren eigenen lokalen Gradienten, und der endgültige Gradient ist das Produkt der Gradienten jeder Schicht.


Einführung aus dem Alltag

Die Domino-Produktionslinie

Eine Fabrik hat drei Prozesse: Rohmaterial → Halbfertigprodukt A → Halbfertigprodukt B → Fertigprodukt. Sie möchten wissen: "Wenn das Rohmaterial um 1 kg erhöht wird, wie viele zusätzliche Fertigprodukte entstehen dann?"

Sie müssen die Formel für den gesamten Prozess nicht von Grund auf herleiten. Jeder Prozess berechnet nur sein eigenes "lokales Verhältnis": Wenn Halbfertigprodukt A um 1 zunimmt, wie viele zusätzliche Halbfertigprodukte B entstehen dann? Wenn Halbfertigprodukt B um 1 zunimmt, wie viele zusätzliche Fertigprodukte? Multiplizieren Sie die drei Verhältnisse, und Sie erhalten die Antwort.

Dies istdie Kettenregel—jede Schicht kümmert sich nur um sich selbst, und die endgültige Auswirkung = das Produkt der Auswirkungen jeder Schicht.


Intuitive Vorstellung

Konstruieren Sie eine dreischichtige zusammengesetzte Funktion:

x
u = g(x)
x^2+1
v = f(u)
3*sin(u)
y = h(v)
v^2
\[ \frac{dy}{dx} = \underbrace{\frac{dy}{dv}}_{h'(v)} \cdot \underbrace{\frac{dv}{du}}_{f'(u)} \cdot \underbrace{\frac{du}{dx}}_{g'(x)} \]

Praktische Python-Übung

Beispiel

import sympy as sp
import numpy as np

def g(x):    return x ** 2 + 1
def f(u):    return 3 * np.sin(u)
def g_prime(x): return 2 * x
def f_prime(u): return 3 * np.cos(u)

x0 = 1.5

# ---- Manuelle Kettenregel ----
u0 = g(x0)
dy_du = f_prime(u0)    # Lokaler Gradient von Schicht 2
du_dx = g_prime(x0)    # Lokaler Gradient von Schicht 1
manual_grad = dy_du * du_dx

print("=" * 55)
print("BEISPIEL Manuelle Kettenregel")
print(f"x0 = {x0}, u = g(x0) = {u0:.4f}")
print(f"dy/du = 3*cos(u) = {dy_du:.4f}")
print(f"du/dx = 2*x0 = {du_dx:.4f}")
print(f"Kettenmultiplikation: dy/dx = {manual_grad:.4f}")

# ---- sympy automatische Differentiation (Standardantwort) ----
x = sp.Symbol('x')
y_expr = 3 * sp.sin(x**2 + 1)
auto_grad = float(sp.diff(y_expr, x).subs(x, x0))
print(f"\n"BEISPIEL sympy automatische Differentiation = {auto_grad:.4f}")
print(f"Die beiden Methoden stimmen überein: {np.isclose(manual_grad, auto_grad)}")

# ---- Erweiterung: dreischichtige Komposition ----
def h(v):     return v ** 2
def h_prime(v): return 2 * v
v0 = f(u0)
dy_dv = h_prime(v0)
grad_3layer = dy_dv * dy_du * du_dx

print(f"\n"BEISPIEL dreischichtige Gradientenfortpflanzung: ")
print(f" Schicht 3: {dy_dv:.4f} x Schicht 2: {dy_du:.4f} x Schicht 1: {du_dx:.4f} = {grad_3layer:.4f}")
=======================================================
EXAMPLE 手动链式法则
x0 = 1.5, u = g(x0) = 3.2500
dy/du = 3*cos(u) = -2.9838
du/dx = 2*x0     = 3.0000
链式相乘: dy/dx = -8.9514

EXAMPLE sympy 自动求导 = -8.9514
两种方法一致: True

EXAMPLE 三层梯度传递:
  第3层: 6.5000 x 第2层: -2.9838 x 第1层: 3.0000 = -58.1841

Anwendungsszenarien in der KI

SzenarioBeziehung zur Kettenregel
BackpropagationJede Schicht eines neuronalen Netzes berechnet nur ihren eigenen lokalen Gradienten und gibt ihn dann an die vorherige Schicht weiter.
PyTorch-AutogradJede Operation automatisch verfolgen, um einen Rechengraphen aufzubauen, und während der Backpropagation automatisch die Kettenregel anwenden
GradientenprüfungNachdem Sie die Backpropagation manuell implementiert haben, überprüfen Sie sie mit numerischen Gradienten – das ist in diesem Fall Methode 1 vs. Methode 2
Weitere Erweiterungen