소개: 모델이 최적의 가중치를 찾는 방법
기계 학습 모델을 훈련한다는 것은 최소화하는 매개변수 값을 찾는 것을 의미합니다. 하나 손실 함수. 이 과정을 최적화 이는 모든 딥 러닝의 핵심입니다. 가장 많이 사용되는 알고리즘은 경사하강법, 속도, 안정성 및 일반화의 균형을 맞추는 다양한 변형이 있습니다.
무엇을 배울 것인가
- Gradient Descent 바닐라와 그 한계
- SGD(확률적 경사하강법) 및 미니 배치
- 모멘텀 및 네스테로프 가속 경사도
- 적응형 알고리즘: RMSprop 및 Adam
- 학습률 스케줄링: 워밍업, 코사인 어닐링
- 수렴, 안장점 및 손실 환경
경사하강법: 기본 알고리즘
Il 경사하강법 (경사하강법)은 이동에 따라 매개변수를 업데이트합니다. 손실 기울기의 반대 방향으로:
어디 \\나이 그리고 학습률 (중요 하이퍼파라미터) 전자 \\nabla_{\\theta} L 그리고 계산된 기울기는 모든 사람 훈련 데이터(배치 경사하강법).
유추: 당신이 안개 속의 언덕에 있고 도달하고 싶다고 상상해보십시오. 아래쪽 계곡. 한걸음 한걸음마다 발밑의 경사(그라데이션)를 느끼며 아래쪽 방향이 더 가파르다. 학습률 및 단계 크기: 너무 큼 계곡을 뛰어넘으면 너무 작아서 시간이 오래 걸립니다.
학습률 문제
학습률 선택이 중요합니다.
- \\나이 너무 큼: 손실이 변동하거나 발산함
- \\나이 너무 작음: 매우 느린 수렴
- \\나이 오른쪽: 최소값을 향한 안정적인 수렴
import numpy as np
# Funzione obiettivo: f(x) = x^4 - 3x^2 + 2 (ha due minimi)
def f(x):
return x**4 - 3*x**2 + 2
def grad_f(x):
return 4*x**3 - 6*x
# Gradient descent con diversi learning rate
for lr in [0.01, 0.05, 0.1]:
x = 2.0 # punto di partenza
history = [x]
for _ in range(100):
x = x - lr * grad_f(x)
history.append(x)
print(f"lr={lr}: x_finale={x:.6f}, f(x)={f(x):.6f}")
확률적 경사하강법(SGD)
전체 데이터 세트에 대한 그래디언트를 계산하는 것은 비용이 많이 듭니다. SGD 단일 샘플을 사용합니다 (또는 미니배치) 기울기를 추정하려면 다음을 수행하십시오.
추정된 기울기는 노이즈가 많지만 평균적으로 올바른 방향을 가리킨다. 소음 놀라운 이점이 있습니다. 로컬 최소값을 피하는 데 도움이 되고 다음과 같은 역할을 합니다. 정규화 장치 암시적.
실제로 우리는 미니 배치 SGD 32-256개의 샘플 배치로 절충안 기울기 분산과 계산 효율성 사이:
추진력: 융합 가속화
Momentum은 업데이트에 "속도"를 추가하여 과거 그라데이션을 하나로 누적합니다. 지수 이동 평균:
어디 \\베타 \\약 0.9 "메모리" 추진력의 양을 제어합니다.
직관: 언덕 아래로 굴러가는 공을 생각해 보세요. 추진력 없이, 작은 불규칙성을 발견할 때마다 중지됩니다. 운동량으로 공은 속도를 축적합니다. 작은 움푹 들어간 곳을 극복하고 계곡을 향해 더 빠르게 수렴합니다. 운동량은 진동을 감소시킵니다 변화하는 기울기가 있는 방향으로 가속되고 일정한 기울기가 있는 방향으로 가속됩니다.
네스테로프 가속 경사도(NAG)
NAG는 "미래" 위치(미래 예측)의 기울기를 계산하여 추진력을 향상시킵니다.
"먼저 내가 어디로 가는지 살펴본 다음 방향을 바로잡습니다." NAG가 더 빠르게 수렴됨 표준 모멘텀을 가지며 최저점 이전에 속도가 느려집니다.
RMSprop: 적응형 학습률
RMSprop 각 매개변수에 대해 개별적으로 학습률을 조정하고 다음으로 나눕니다. 과거 기울기의 제곱 평균의 근:
기울기가 큰 매개변수의 경우 유효 학습률이 감소합니다. 매개변수의 경우 작은 기울기에서는 증가합니다. 이는 기능 간의 서로 다른 규모 문제를 해결합니다.
Adam: 최첨단 기술
아담 (Adaptive Moment Estimation)은 최고의 운동량과 RMSprop을 결합하여, 그라디언트의 이동 평균(첫 번째 순간)과 그라디언트의 이동 평균을 모두 유지합니다. 제곱(두 번째 순간):
와 함께 편향 보정 제로 초기화를 보상하려면:
최종 업데이트:
권장되는 기본 하이퍼파라미터: \\beta_1 = 0.9, \\beta_2 = 0.999, \\엡실론 = 10^{-8}.
import numpy as np
class Adam:
def __init__(self, lr=0.001, beta1=0.9, beta2=0.999, epsilon=1e-8):
self.lr = lr
self.beta1 = beta1
self.beta2 = beta2
self.epsilon = epsilon
self.m = None # Primo momento
self.v = None # Secondo momento
self.t = 0
def update(self, params, grads):
if self.m is None:
self.m = np.zeros_like(params)
self.v = np.zeros_like(params)
self.t += 1
self.m = self.beta1 * self.m + (1 - self.beta1) * grads
self.v = self.beta2 * self.v + (1 - self.beta2) * grads**2
# Bias correction
m_hat = self.m / (1 - self.beta1**self.t)
v_hat = self.v / (1 - self.beta2**self.t)
params -= self.lr * m_hat / (np.sqrt(v_hat) + self.epsilon)
return params
# Test: minimizzare f(x,y) = x^2 + 10*y^2 (landscape ellittico)
def f(params):
return params[0]**2 + 10 * params[1]**2
def grad_f(params):
return np.array([2*params[0], 20*params[1]])
# Confronto SGD vs Adam
params_sgd = np.array([5.0, 5.0])
params_adam = np.array([5.0, 5.0])
optimizer = Adam(lr=0.1)
print("Step | SGD f(x) | Adam f(x)")
for step in range(50):
# SGD
g = grad_f(params_sgd)
params_sgd -= 0.01 * g
# Adam
g = grad_f(params_adam)
params_adam = optimizer.update(params_adam, g)
if step % 10 == 0:
print(f"{step:4d} | {f(params_sgd):8.4f} | {f(params_adam):8.4f}")
학습률 스케줄링
고정된 학습률로 시작하는 것은 최적이 아닙니다. 일정 전략이 조정됩니다. \\나이 훈련 중:
단계적 감쇠
어디 \\감마 = 0.1 e s 그리고 숫자 각 감소 사이의 신기원.
코사인 어닐링
코사인 곡선을 따라 점차적으로 학습률을 감소시키며, 끝으로 갈수록 더욱 공격적입니다.
워밍업 + 부패
Transformers에서 사용: 선형적으로 증가하는 낮은 학습률로 시작합니다. T_w 단계(준비) 후 감소:
import numpy as np
def cosine_annealing(t, T, eta_min=1e-6, eta_max=1e-3):
return eta_min + 0.5 * (eta_max - eta_min) * (1 + np.cos(t * np.pi / T))
def warmup_cosine(t, warmup_steps, total_steps, eta_max=1e-3):
if t < warmup_steps:
return eta_max * t / warmup_steps
else:
progress = (t - warmup_steps) / (total_steps - warmup_steps)
return eta_max * 0.5 * (1 + np.cos(progress * np.pi))
# Visualizzazione (valori)
total_steps = 1000
warmup = 100
print("Step | Cosine LR | Warmup+Cosine LR")
for t in range(0, total_steps, 100):
cos_lr = cosine_annealing(t, total_steps)
warm_lr = warmup_cosine(t, warmup, total_steps)
print(f"{t:4d} | {cos_lr:.6f} | {warm_lr:.6f}")
안장점 및 손실 환경
고차원 공간(수백만 개의 매개변수)에서 i는 지역 최소값 그들은 드물다. 진짜 문제는 안장 포인트: 기울기가 0이지만 그렇지 않은 점 그것들은 최소도 최대도 아닙니다. 안장점의 확률은 기하급수적으로 증가합니다. 차원.
운 좋게도 추진력이 있는 SGD와 Adam은 소음 덕분에 안장 지점을 탈출했습니다. 확률적이고 축적된 모멘텀.
ML과의 요약 및 연결
기억해야 할 핵심 사항
- 경사하강법: \\theta \\왼쪽 화살표 \\theta - \\eta \\nabla L - 기본 알고리즘
- SGD: 효율성을 위해 미니 배치를 사용하고, 노이즈는 일반화에 도움이 됩니다.
- 기세: 속도 축적, 손실면의 불규칙성 극복
- 아담: DL의 기본값인 모멘텀 + 적응형 학습률을 결합합니다.
- 학습률 예약: 워밍업 + 코사인 붕괴는 트랜스포머의 표준입니다.
- 안장 포인트: 고차원에서 로컬 최소값보다 문제가 더 많음
다음 기사에서: 우리는 다음을 탐구할 것이다. 정보 이론. 엔트로피, 교차 엔트로피(분류에 가장 많이 사용되는 손실), KL 발산, 가능성이 가장 높은 깊은 연결입니다.







