优化器 #
什么是优化器? #
优化器决定如何根据梯度更新模型参数,以最小化损失函数。
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