소개: 신경망이 학습하는 방법
선형대수학과 언어 기계 학습, 미분 계산 및 그의 학습 엔진. 모델이 예측을 개선할 때마다 그렇게 합니다. 라는 프로세스 덕분에 경사하강법, 이는 파생 상품에 전적으로 기반을 두고 있으며 그라디언트. 계산이 없으면 신경망은 학습할 수 없습니다.
이 기사에서는 방법을 살펴 보겠습니다. 부분 파생 상품 그들은 우리에게 어느 방향인지 말해줍니다 가중치 등을 변경합니다. 연쇄 법칙 역전파를 가능하게 하고, 어떻게 모든 것은 기본적으로 NumPy로 구현됩니다.
무엇을 배울 것인가
- 파생상품: 변화율의 개념
- 부분 도함수 및 기울기 벡터
- 체인 규칙: 도함수를 구성하는 방법(역전파의 핵심)
- 계산 그래프: 정방향 및 역방향 전달
- 야코비안과 헤시안: 고차 정보
- NumPy에서 역전파 수동 구현
파생상품: 변화율
La 유도체 함수의 에프엑스(f(x)) 어느 순간 그는 우리에게 이렇게 말했습니다. 다음과 같은 경우 함수 값이 얼마나 빨리 변하는가? x 변화 극소량:
직관: 파생상품과 경사 한 지점에서 함수의 양수이면 기능이 올라가는 것입니다. 음수이면 하락하고 있습니다. 만약 0이면 우리는 고정점(최소, 최대 또는 안장점).
딥러닝의 일반적인 활성화 함수 파생:
왜냐하면 그것은 중요하기 때문이다: 시그모이드의 도함수는 최대값이 0.25입니다. 엑스 = 0). 이는 각 레이어에서 그래디언트가 곱해진다는 것을 의미합니다. 0.25의 최대 계수로 인해 다음과 같은 유명한 문제가 발생합니다. 사라지는 그라데이션 안으로 딥 네트워크. 이것이 ReLU(미분 = 1당 x > 0) 그리고 마음에 드는 것.
부분 도함수와 기울기
함수가 여러 변수에 의존하는 경우(예: 모든 가중치에 의존하는 손실 함수) 계산해 봅시다 부분 파생 상품: 각 변수에 대한 미분, 다른 것들은 고정시켜 두세요.
기능의 경우 f(x_1, x_2, \\ldots, x_n), il 구배 그리고 모든 부분 도함수의 벡터:
중요한 통찰력: 그라디언트 포인트 최대 성장 방향 기능의. 손실을 최소화하기 위해 다음 방향으로 이동합니다. 반대 그라데이션에:
어디 \\나이 그리고 학습률 e L(\\세타) 손실 함수. 이것이 의 기본 공식이다. 경사하강법.
import numpy as np
# Esempio: f(x, y) = x^2 + 3xy + y^2
# Gradiente: [2x + 3y, 3x + 2y]
def f(x, y):
return x**2 + 3*x*y + y**2
def gradient_f(x, y):
df_dx = 2*x + 3*y
df_dy = 3*x + 2*y
return np.array([df_dx, df_dy])
# Punto di partenza
x, y = 3.0, 2.0
print(f"f({x}, {y}) = {f(x, y)}")
print(f"Gradiente: {gradient_f(x, y)}")
# Gradient descent
lr = 0.1
for step in range(20):
grad = gradient_f(x, y)
x -= lr * grad[0]
y -= lr * grad[1]
if step % 5 == 0:
print(f"Step {step}: x={x:.4f}, y={y:.4f}, f={f(x, y):.6f}")
연쇄 법칙: 역전파의 핵심
La 연쇄 법칙 (연쇄법칙)과 이를 가능하게 하는 수학적 원리 심층 신경망 훈련. 복합 함수가 있는 경우 y = f(g(x)), 파생물은 다음과 같습니다.
여러 복합 기능 y = f_1(f_2(f_3(x))):
신경망은 정확히 기능의 구성입니다. 각 레이어는 변환을 적용합니다. 선형 다음에 비선형 활성화가 뒤따릅니다. 체인 규칙을 사용하면 손실이 어떻게 발생하는지 계산할 수 있습니다. 각 가중치에 따라 변경되며 모든 레이어를 역순으로 통과합니다.
예: 단일 뉴런의 역전파
MSE 손실이 있는 단일 뉴런을 고려해 보겠습니다.
에 대한 그라데이션 w 체인 규칙을 사용하면 다음과 같습니다.
어디 z = wx + b. 체인의 각 용어에는 의미가 있습니다. 정확함: 오류, 활성화 민감도 및 입력.
import numpy as np
def sigmoid(x):
return 1 / (1 + np.exp(-x))
def sigmoid_deriv(x):
s = sigmoid(x)
return s * (1 - s)
# Singolo neurone: forward e backward pass
x = 2.0 # input
y = 1.0 # target
w = 0.5 # peso
b = 0.1 # bias
lr = 0.1
for epoch in range(50):
# Forward pass
z = w * x + b
y_hat = sigmoid(z)
loss = (y - y_hat) ** 2
# Backward pass (chain rule)
dL_dyhat = 2 * (y_hat - y) # dL/d(y_hat)
dyhat_dz = sigmoid_deriv(z) # d(y_hat)/dz
dz_dw = x # dz/dw
dz_db = 1.0 # dz/db
dL_dw = dL_dyhat * dyhat_dz * dz_dw # Chain rule completa
dL_db = dL_dyhat * dyhat_dz * dz_db
# Aggiorna pesi
w -= lr * dL_dw
b -= lr * dL_db
if epoch % 10 == 0:
print(f"Epoch {epoch}: loss={loss:.6f}, w={w:.4f}, b={b:.4f}")
계산 그래프: 순방향 및 역방향 시각화
Un 계산 그래프 함수를 작업 트리로 표현 초등학교. 각 노드는 간단한 연산(합계, 곱, 활성화)을 수행하며, 역방향 전달은 체인 규칙 덕분에 그래디언트가 역순으로 그래프를 통해 흐릅니다.
고려해 봅시다 L = (\\sigma(w_1 x_1 + w_2 x_2 + b) - y)^2:
- 앞으로: z_1 = w_1 x_1, z_2 = w_2 x_2, s = z_1 + z_2 + b, a = \\시그마, L = (a - y)^2
- 뒤로: 계산해보자 \\frac{\\부분 L}{\\부분 a}, 그 다음에 \\frac{\\부분 L}{\\부분 s}, 그 다음에 \\frac{\\부분 L}{\\부분 w_1} e \\frac{\\부분 L}{\\부분 w_2}
이것이 바로 PyTorch와 TensorFlow가 자동으로 수행하는 작업입니다.자동 차별화.
야코비안과 헤세 행렬
Il 야코비안 그래디언트를 벡터 함수로 일반화합니다. 만약에 \\mathbf{f}: \\mathbb{R}^n \\to \\mathbb{R}^m, 야코비 행렬 및 행렬 m \\times n:
L'헤센 2차 도함수 행렬은 다음과 같은 정보를 제공합니다. 곡률 손실 함수:
헤세 행렬의 고유값은 임계점이 다음과 같은지 여부를 결정합니다. 최저한의 (모두 긍정적), 최고 (모두 부정) 또는 안장점 (혼합). 문제에서는 신경망 최적화에서는 안장점이 로컬 최소값보다 훨씬 더 일반적입니다.
완전한 역전파: 2계층 네트워크
import numpy as np
np.random.seed(42)
# Dataset XOR (non-linearmente separabile)
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
y = np.array([[0], [1], [1], [0]])
# Inizializzazione pesi
W1 = np.random.randn(2, 4) * 0.5 # (2 input, 4 hidden)
b1 = np.zeros((1, 4))
W2 = np.random.randn(4, 1) * 0.5 # (4 hidden, 1 output)
b2 = np.zeros((1, 1))
def sigmoid(x):
return 1 / (1 + np.exp(-np.clip(x, -500, 500)))
lr = 1.0
for epoch in range(10000):
# === FORWARD PASS ===
z1 = X @ W1 + b1 # (4, 2) @ (2, 4) = (4, 4)
a1 = sigmoid(z1) # Attivazione hidden
z2 = a1 @ W2 + b2 # (4, 4) @ (4, 1) = (4, 1)
a2 = sigmoid(z2) # Output
# Loss: MSE
loss = np.mean((y - a2) ** 2)
# === BACKWARD PASS (Chain Rule) ===
m = X.shape[0]
# Gradiente output layer
dL_da2 = 2 * (a2 - y) / m
da2_dz2 = a2 * (1 - a2) # Derivata sigmoid
dz2 = dL_da2 * da2_dz2 # (4, 1)
dW2 = a1.T @ dz2 # (4, 4).T @ (4, 1) = (4, 1)
db2 = np.sum(dz2, axis=0, keepdims=True)
# Gradiente hidden layer (chain rule continua!)
da1 = dz2 @ W2.T # (4, 1) @ (1, 4) = (4, 4)
dz1 = da1 * (a1 * (1 - a1)) # Derivata sigmoid
dW1 = X.T @ dz1 # (2, 4).T @ (4, 4) = (2, 4)
db1 = np.sum(dz1, axis=0, keepdims=True)
# === AGGIORNAMENTO PESI ===
W2 -= lr * dW2
b2 -= lr * db2
W1 -= lr * dW1
b1 -= lr * db1
if epoch % 2000 == 0:
print(f"Epoch {epoch}: Loss = {loss:.6f}")
# Risultato finale
predictions = np.round(a2, 2)
print(f"\nPredizioni finali:\n{predictions.flatten()}")
print(f"Target: {y.flatten()}")
그라데이션 확인: 그라데이션 확인
역전파가 올바르게 구현되었는지 확인하기 위해 다음을 비교할 수 있습니다. 분석적 그라디언트 숫자 유한 차분으로 계산:
~와 함께 \\엡실론 \\약 10^{-7}. 그래디언트의 상대적인 차이 분석적 및 수치적 수치는 다음보다 작아야 합니다. 10^{-5}.
import numpy as np
def numerical_gradient(f, params, idx, epsilon=1e-7):
"""Calcola gradiente numerico per verifica."""
original = params[idx].copy()
params[idx] = original + epsilon
loss_plus = f()
params[idx] = original - epsilon
loss_minus = f()
params[idx] = original
return (loss_plus - loss_minus) / (2 * epsilon)
# Esempio semplice: f = (w*x - y)^2
w = np.array([0.5])
x, y_true = 2.0, 3.0
def compute_loss():
return (w[0] * x - y_true) ** 2
# Gradiente analitico
grad_analytical = 2 * (w[0] * x - y_true) * x
# Gradiente numerico
grad_numerical = numerical_gradient(compute_loss, [w], 0)
print(f"Analitico: {grad_analytical:.8f}")
print(f"Numerico: {grad_numerical:.8f}")
print(f"Diff relativa: {abs(grad_analytical - grad_numerical) / max(abs(grad_analytical), 1e-8):.2e}")
ML과의 요약 및 연결
기억해야 할 핵심 사항
- 유도체: 변화율을 측정하고 함수의 기울기를 나타냅니다.
- 구배 \\nabla L: 최대 손실 증가 방향을 가리킨다.
- 경사하강법: \\theta \\왼쪽 화살표 \\theta - \\eta \\nabla L - 그래디언트와 반대 방향으로 이동합니다.
- 체인 규칙: 함수 합성을 통해 기울기를 계산할 수 있습니다.
- 역전파: 네트워크의 계산 그래프에 체인 규칙 적용
- 사라지는 그라데이션: 시그모이드의 최대 도함수는 0.25이고, ReLU는 도함수 1로 해결합니다.
다음 기사에서: 우리는 탐구할 것이다 확률과 통계 ML을 위해. Bayes의 정리, 분포, 최대 가능성 추정 및 방법을 살펴보겠습니다. 예측의 불확실성을 수량화합니다.







