优化器 #

什么是优化器? #

优化器决定如何根据梯度更新模型参数,以最小化损失函数。

text
┌─────────────────────────────────────────────────────────────┐
│                    优化过程                                  │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  1. 前向传播: 计算预测值                                    │
│  2. 计算损失: 衡量预测误差                                  │
│  3. 反向传播: 计算梯度                                      │
│  4. 参数更新: 优化器根据梯度更新参数                        │
│                                                             │
│  参数更新公式:                                              │
│  θ_new = θ_old - lr × gradient                              │
│                                                             │
│  不同优化器的区别在于如何计算更新方向和步长                 │
│                                                             │
└─────────────────────────────────────────────────────────────┘

SGD(随机梯度下降) #

原理 #

text
┌─────────────────────────────────────────────────────────────┐
│                    SGD 优化器                                │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  基本公式:                                                  │
│  θ = θ - lr × ∇L(θ)                                         │
│                                                             │
│  带动量:                                                    │
│  v = momentum × v - lr × ∇L(θ)                              │
│  θ = θ + v                                                  │
│                                                             │
│  Nesterov 动量:                                             │
│  v = momentum × v - lr × ∇L(θ + momentum × v)               │
│  θ = θ + v                                                  │
│                                                             │
│  特点:                                                      │
│  ├── 简单直观                                              │
│  ├── 动量加速收敛                                          │
│  ├── Nesterov 更稳定                                       │
│  └── 需要仔细调整学习率                                    │
│                                                             │
└─────────────────────────────────────────────────────────────┘

使用方法 #

python
import keras

model.compile(
    optimizer='sgd',
    loss='mse'
)

model.compile(
    optimizer=keras.optimizers.SGD(
        learning_rate=0.01,
        momentum=0.9,
        nesterov=True
    ),
    loss='mse'
)

学习率调度 #

python
import keras

initial_learning_rate = 0.1
lr_schedule = keras.optimizers.schedules.ExponentialDecay(
    initial_learning_rate,
    decay_steps=1000,
    decay_rate=0.96,
    staircase=True
)

optimizer = keras.optimizers.SGD(learning_rate=lr_schedule)

Adam #

原理 #

text
┌─────────────────────────────────────────────────────────────┐
│                    Adam 优化器                               │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  Adam = Adaptive Moment Estimation                          │
│                                                             │
│  公式:                                                      │
│  m_t = β₁ × m_{t-1} + (1-β₁) × g_t         (一阶矩估计)    │
│  v_t = β₂ × v_{t-1} + (1-β₂) × g_t²        (二阶矩估计)    │
│  m̂_t = m_t / (1-β₁^t)                      (偏差修正)      │
│  v̂_t = v_t / (1-β₂^t)                      (偏差修正)      │
│  θ_t = θ_{t-1} - lr × m̂_t / (√v̂_t + ε)                     │
│                                                             │
│  特点:                                                      │
│  ├── 自适应学习率                                          │
│  ├── 结合动量和 RMSprop                                    │
│  ├── 适合大多数任务                                        │
│  └── 默认参数通常效果很好                                  │
│                                                             │
└─────────────────────────────────────────────────────────────┘

使用方法 #

python
import keras

model.compile(
    optimizer='adam',
    loss='categorical_crossentropy'
)

model.compile(
    optimizer=keras.optimizers.Adam(
        learning_rate=0.001,
        beta_1=0.9,
        beta_2=0.999,
        epsilon=1e-07
    ),
    loss='categorical_crossentropy'
)

AdamW #

python
import keras

model.compile(
    optimizer=keras.optimizers.AdamW(
        learning_rate=0.001,
        weight_decay=0.01
    ),
    loss='categorical_crossentropy'
)

RMSprop #

原理 #

text
┌─────────────────────────────────────────────────────────────┐
│                    RMSprop 优化器                            │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  公式:                                                      │
│  v_t = ρ × v_{t-1} + (1-ρ) × g_t²                           │
│  θ_t = θ_{t-1} - lr × g_t / (√v_t + ε)                      │
│                                                             │
│  特点:                                                      │
│  ├── 自适应学习率                                          │
│  ├── 适合 RNN                                              │
│  └── 解决学习率衰减问题                                    │
│                                                             │
└─────────────────────────────────────────────────────────────┘

使用方法 #

python
import keras

model.compile(
    optimizer='rmsprop',
    loss='categorical_crossentropy'
)

model.compile(
    optimizer=keras.optimizers.RMSprop(
        learning_rate=0.001,
        rho=0.9,
        momentum=0.0,
        epsilon=1e-07
    ),
    loss='categorical_crossentropy'
)

Adagrad #

python
import keras

model.compile(
    optimizer=keras.optimizers.Adagrad(
        learning_rate=0.01,
        initial_accumulator_value=0.1,
        epsilon=1e-07
    ),
    loss='categorical_crossentropy'
)

Adadelta #

python
import keras

model.compile(
    optimizer=keras.optimizers.Adadelta(
        learning_rate=0.001,
        rho=0.95,
        epsilon=1e-07
    ),
    loss='categorical_crossentropy'
)

Adamax #

python
import keras

model.compile(
    optimizer=keras.optimizers.Adamax(
        learning_rate=0.001,
        beta_1=0.9,
        beta_2=0.999,
        epsilon=1e-07
    ),
    loss='categorical_crossentropy'
)

Nadam #

python
import keras

model.compile(
    optimizer=keras.optimizers.Nadam(
        learning_rate=0.001,
        beta_1=0.9,
        beta_2=0.999,
        epsilon=1e-07
    ),
    loss='categorical_crossentropy'
)

Ftrl #

python
import keras

model.compile(
    optimizer=keras.optimizers.Ftrl(
        learning_rate=0.001,
        learning_rate_power=-0.5,
        initial_accumulator_value=0.1,
        l1_regularization_strength=0.0,
        l2_regularization_strength=0.0
    ),
    loss='binary_crossentropy'
)

学习率调度 #

ExponentialDecay #

python
import keras

lr_schedule = keras.optimizers.schedules.ExponentialDecay(
    initial_learning_rate=0.1,
    decay_steps=1000,
    decay_rate=0.9
)

optimizer = keras.optimizers.SGD(learning_rate=lr_schedule)

PiecewiseConstantDecay #

python
import keras

lr_schedule = keras.optimizers.schedules.PiecewiseConstantDecay(
    boundaries=[1000, 2000, 3000],
    values=[0.1, 0.05, 0.01, 0.001]
)

optimizer = keras.optimizers.SGD(learning_rate=lr_schedule)

PolynomialDecay #

python
import keras

lr_schedule = keras.optimizers.schedules.PolynomialDecay(
    initial_learning_rate=0.1,
    decay_steps=10000,
    end_learning_rate=0.0001,
    power=0.5
)

optimizer = keras.optimizers.SGD(learning_rate=lr_schedule)

CosineDecay #

python
import keras

lr_schedule = keras.optimizers.schedules.CosineDecay(
    initial_learning_rate=0.1,
    decay_steps=1000,
    alpha=0.0
)

optimizer = keras.optimizers.SGD(learning_rate=lr_schedule)

CosineDecayRestarts #

python
import keras

lr_schedule = keras.optimizers.schedules.CosineDecayRestarts(
    initial_learning_rate=0.1,
    first_decay_steps=1000,
    t_mul=2.0,
    m_mul=0.9,
    alpha=0.0
)

optimizer = keras.optimizers.SGD(learning_rate=lr_schedule)

优化器选择指南 #

text
┌─────────────────────────────────────────────────────────────┐
│                    优化器选择建议                            │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  一般情况:                                                  │
│  ├── 首选: Adam (默认参数通常有效)                         │
│  ├── 需要更好泛化: SGD + Momentum + Nesterov               │
│  └── 大模型训练: AdamW (带权重衰减)                        │
│                                                             │
│  特定场景:                                                  │
│  ├── RNN/LSTM: RMSprop                                     │
│  ├── NLP/Transformer: AdamW                                │
│  ├── 计算机视觉: SGD + Momentum                            │
│  └── 稀疏特征: Adagrad / Ftrl                              │
│                                                             │
│  学习率建议:                                                │
│  ├── Adam: 0.001 (默认)                                    │
│  ├── SGD: 0.01 - 0.1                                       │
│  └── 配合学习率调度使用                                    │
│                                                             │
└─────────────────────────────────────────────────────────────┘

完整示例 #

python
import keras

model = keras.Sequential([
    keras.layers.Dense(512, activation='relu', input_shape=(784,)),
    keras.layers.Dropout(0.2),
    keras.layers.Dense(256, activation='relu'),
    keras.layers.Dropout(0.2),
    keras.layers.Dense(10, activation='softmax')
])

initial_learning_rate = 0.001
lr_schedule = keras.optimizers.schedules.ExponentialDecay(
    initial_learning_rate,
    decay_steps=1000,
    decay_rate=0.9
)

optimizer = keras.optimizers.AdamW(
    learning_rate=lr_schedule,
    weight_decay=0.01
)

model.compile(
    optimizer=optimizer,
    loss='sparse_categorical_crossentropy',
    metrics=['accuracy']
)

下一步 #

现在你已经掌握了优化器,接下来学习 评估指标,了解如何评估模型性能!

最后更新:2026-04-04