优化算法

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)

梯度截断

若梯度的绝对值超过阈值则进行截断。

# 在定义优化器时指定截断
optimizer = keras.optimizers.SGD(clipvalue=1.0)

学习率调度器

学习率调度器是一类回调函数(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那样在训练时指定,后面会讲。