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.

Demasiado pequeña: lr=0.01 Converge muy lentamente; después de 30 pasos solo ha avanzado un pequeño tramo.
Adecuada: lr=0.2 Converge rápida y suavemente a 0.
Demasiado grande: lr=1.05 Oscila y diverge, alejándose cada vez más.

Práctica con Python

Ejemplo

import numpy as np

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

EscenarioDescripción
Programación de la tasa de aprendizajeEn 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.
WarmupAl 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 adaptativoAjusta automáticamente la tasa de aprendizaje para cada parámetro; el caso «Comparación de optimizadores» lo mostrará en detalle.
Otras extensiones