Visualización del efecto de diferentes tasas de aprendizaje
Para la misma función, ejecuta el descenso de gradiente con tasas de aprendizaje demasiado pequeña, adecuada y demasiado grande, y observa intuitivamente la comparación de tres curvas típicas.
Al finalizar este caso, entenderás:La tasa de aprendizaje es el hiperparámetro más importante en el descenso de gradiente: si se elige demasiado pequeña, es demasiado lento; si se elige demasiado grande, diverge.
Introducción de la vida cotidiana
Conducir a casa: ¿cuánto pisar el acelerador?
A 10 km de casa. Si pisas el acelerador demasiado suavemente (tasa de aprendizaje demasiado pequeña), conduces durante una hora y todavía no llegas. Si pisas demasiado fuerte (tasa demasiado grande), pasas de largo, das la vuelta y vuelves a pasarte, oscilando de un lado a otro. La fuerza justa (tasa de aprendizaje adecuada) llega sin problemas.
La elección de la tasa de aprendizaje en el descenso de gradiente y el control del acelerador al conducir enfrentan exactamente el mismo problema.
Comprensión intuitiva
Función objetivo \(f(x) = x^2\), el mínimo está en \(x=0\). El gradiente es \(f'(x) = 2x\).
Regla de actualización: \(x_{t+1} = x_t - \eta \cdot 2x_t = x_t \cdot (1 - 2\eta)\). Si \(\eta < 0.5\), converge; si \(\eta > 1.0\), diverge.
Práctica con Python
Ejemplo
def f(x): return x ** 2
def grad(x): return 2 * x
def run_gd(lr, steps=30, x0=8.0):
x = x0
history = [x]
for _ in range(steps):
x = x - lr * grad(x)
history.append(x)
if abs(x) > 1e6: break
return history
settings = {
"Demasiado pequeña (lr=0.01)": 0.01,
"Adecuada (lr=0.2)": 0.2,
"Demasiado grande (lr=1.05)": 1.05,
}
results = {name: run_gd(lr) for name, lr in settings.items()}
print(EJEMPLO: comparación de las tres tasas de aprendizaje después de 30 pasos:\n")
print(f"{'Configuración de tasa de aprendizaje':<20} {'x final':<12} {'f(x)':<14} {'Juicio'}")
print("-" * 56)
for name, hist in results.items():
x_final = hist[-1]
judgement = ("Convergido" if abs(x_final) < 0.01
else "Convergiendo" if abs(x_final) < 3
else "Diverge")
print(f"{name:<20} {x_final:<12.4f} {f(x_final):<14.6f} {judgement}")
# Análisis: ¿cuántos pasos se necesitan para que |x| < 0.01?
print("\n¿Cuántos pasos necesita EJEMPLO para converger a |x| < 0.01?)
for name, lr in settings.items():
x = 8.0
for step in range(1, 1001):
x = x - lr * grad(x)
if abs(x) < 0.01:
print(f" {name}: se necesitan {step} pasos")
break
else:
print(f" {name}: no converge en 1000 pasos")
EJEMPLO 三种学习率 30 步后对比: 学习率设置 最终 x f(x) 判断 -------------------------------------------------------- 过小 (lr=0.01) 4.3219 18.678861 收敛中 合适 (lr=0.2) 0.0000 0.000000 已收敛 过大 (lr=1.05) -34.5929 1196.668701 发散 EJEMPLO 需要多少步收敛到 |x| < 0.01? 过小 (lr=0.01): 需要 377 步 合适 (lr=0.2): 需要 20 步 过大 (lr=1.05): 1000 步内无法收敛
Escenarios de aplicación en IA
| Escenario | Descripción |
|---|---|
| Programación de la tasa de aprendizaje | En el entrenamiento real se suele usar la «disminución de la tasa de aprendizaje»: primero grande y luego pequeña, convergencia rápida al principio y ajuste fino después. |
| Warmup | Al entrenar Transformer, primero se usa una tasa de aprendizaje muy pequeña para calentar y luego se aumenta gradualmente, evitando la oscilación inicial. |
| Adam adaptativo | Ajusta automáticamente la tasa de aprendizaje para cada parámetro; el caso «Comparación de optimizadores» lo mostrará en detalle. |