优化算法¶
Note
本节介绍tensorflow中各种常见的优化算法。
激活函数和初始化¶
选择合适的激活函数和初始化可以降低梯度消失和梯度爆炸的风险,从而让模型更好地训练。
from tensorflow import keras
# 在层中定义激活函数和初始化
layer = keras.layers.Dense(10,
activation="relu",
kernel_initializer="he_normal")
优化算法¶
# momentum
optimizer = keras.optimizers.SGD(learning_rate=0.001, momentum=0.9)
momentum 的速度,使用当前的梯度:
\[
\mathbf{v} \gets \beta\mathbf{v} + \nabla_{\boldsymbol{\theta}}J(\boldsymbol{\theta})
\]
Nesterov momentum 的速度,使用预估的下一步的梯度:
\[
\mathbf{v} \gets \beta\mathbf{v} + \nabla_{\boldsymbol{\theta}}J(\boldsymbol{\theta} - \eta\mathbf{v})
\]
# nesterov momentum
optimizer = keras.optimizers.SGD(learning_rate=0.001, momentum=0.9, nesterov=True)
# RMSprop,梯度大时步幅小,梯度小时步幅大
optimizer = keras.optimizers.RMSprop(learning_rate=0.001, rho=0.9)
# Adam: momentum + RMSprop
optimizer = keras.optimizers.Adam(learning_rate=0.001, beta_1=0.9, beta_2=0.999)
# Nadam: nesterov momentum + RMSprop
optimizer = keras.optimizers.Nadam(learning_rate=5e-4)
学习率调度器¶
学习率调度器是一类回调函数(callback)。
# 100个batch没有improve就将学习率乘以0.5
lr_scheduler = keras.callbacks.ReduceLROnPlateau(factor=0.5, patience=100)
# 在优化器中定义
optimizer = keras.optimizers.SGD(learning_rate=lr_scheduler)
Warning
注意这里是每个batch不是每个epoch。
若需epoch-wise操作,可以像一般callback那样在训练时指定,后面会讲。