【時間】2019.12.04
【題目】keras中的學習率控制以及代碼實現
一、keras中的學習率控制
使用兩個回調函數進行lr控制:
keras.callbacks.LearningRateScheduler(schedule)
以及
keras.callbacks.ReduceLROnPlateau(monitor='val_loss', factor=0.1, patience=10, verbose=0, mode='auto', epsilon=0.0001, cooldown=0, min_lr=0)
具體見:
二、常見的學習率衰減方式
詳見:Tensorflow 中 learning rate decay 的奇技淫巧
Tensorflow 中 learning rate decay 的奇技淫巧(代碼)
learning rate衰減策略文件在tensorflow/tensorflow/python/training/learning_rate_decay.py中,函數中調用方法類似tf.train.exponential_decay就可以了。
keras 中也可以調用tf.train.exponential_decay進行設置。具體如下(以cosine decay爲例):
import keras.backend as K
from keras.callbacks import LearningRateScheduler
def scheduler_cosine_decay(epoch,learning_rate=0.01, decay_steps=250, alpha=0.0001):
if epoch==0:
global global_step
global new_lr
global sess
global_step = tf.Variable(tf.constant(0))
new_lr = tf.train.cosine_decay(learning_rate,global_step, decay_steps, alpha)
sess = tf.Session()
lr = sess.run(new_lr,feed_dict={global_step: epoch})
return lr
reduce_lr = LearningRateScheduler(scheduler_cosine_decay)
model.fit(train_x, train_y, batch_size=32, epochs=300, callbacks=[reduce_lr])
下面介紹各種學習率衰減
2.1、exponential_decay 指數衰減
tf.train.exponential_decay(
learning_rate,初始學習率
global_step,當前迭代次數
decay_steps,衰減速度(在迭代到該次數時學習率衰減爲earning_rate * decay_rate)
decay_rate,學習率衰減係數,通常介於0-1之間。
staircase=False,(默認值爲False,當爲True時,(global_step/decay_steps)則被轉化爲整數) ,選擇不同的衰減方式。
name=None
)
圖1. exponential_decay示例,其中紅色線條是staircase=False,即指數型下降曲線,藍色線條是staircase=True,即階梯式下降曲線
計算公式爲:
decayed_learning_rate = learning_rate * decay_rate ^ (global_step / decay_steps)
2.2 piecewise_constant 分段常數衰減
piecewise_constant(x, boundaries, values, name=None)
分段常數下降法類似於exponential_decay中的階梯式下降法,不過各階段的值是自己設定的。
其中,x即爲global step,boundaries=[step_1, step_2, ..., step_n]定義了在第幾步進行lr衰減,values=[val_0, val_1, val_2, ..., val_n]定義了lr的初始值和後續衰減時的具體取值。需要注意的是,values應該比boundaries長一個維度。
2.3 polynomial_decay 多項式衰減
polynomial_decay(learning_rate, global_step, decay_steps,
end_learning_rate=0.0001, power=1.0,
cycle=False, name=None)
計算公式:
global_step = min(global_step, decay_steps)
decayed_learning_rate = (learning_rate - end_learning_rate) *
(1 - global_step / decay_steps) ^ (power) + end_learning_rate
cycle參數是決定lr是否在下降後重新上升的過程。cycle參數的初衷是爲了防止網絡後期lr十分小導致一直在某個局部最小值中振盪,突然調大lr可以跳出註定不會繼續增長的區域探索其他區域。
2.4、自然指數衰減
natural_exp_decay(learning_rate, global_step, decay_steps, decay_rate,
staircase=False, name=None)
計算公式:
natural_exp_decay:
decayed_learning_rate = learning_rate * exp(-decay_rate * global_step / decay_steps)
natural_exp_decay和exponential_decay形式差不多,只不過自然指數下降的底數是 1/e。
由圖可知,自然數指數下降比exponential_decay要快許多,適用於較快收斂,容易訓練的網絡。
2.5、inverse_time_decay 倒數衰減
inverse_time_decay(learning_rate, global_step, decay_steps, decay_rate,
staircase=False, name=None)
公式:
decayed_learning_rate = learning_rate / (1 + decay_rate * global_step / decay_step)
2.1-2.5幾種衰減方式相差不大,主要都是基於指數型的衰減。個人理解其問題在於一開始lr就快速下降,在複雜問題中可能會導致快速收斂於局部最小值而沒有較好地探索一定範圍內的參數空間。
2.6、cosine_decay 餘弦衰減
cosine_decay(learning_rate, global_step, decay_steps, alpha=0.0,
name=None)
公式:
global_step = min(global_step, decay_steps)
cosine_decay = 0.5 * (1 + cos(pi * global_step / decay_steps))
decayed = (1 - alpha) * cosine_decay + alpha
decayed_learning_rate = learning_rate * decayed
alpha的作用可以看作是baseline,保證lr不會低於某個值,即不會低於lr*alpha這個值。
2.7 cosine_decay_restarts 重新開始餘弦函數
cosine_decay_restarts(learning_rate, global_step, first_decay_steps,
t_mul=2.0, m_mul=1.0, alpha=0.0, name=None)
cosine_decay_restarts是cosine_decay的cycle版本。first_decay_steps是指第一次完全下降的step數,t_mul是指每一次循環的步數都將乘以t_mul倍,m_mul指每一次循環重新開始時的初始lr是上一次循環初始值的m_mul倍。
餘弦函數式的下降模擬了大lr找潛力區域然後小lr快速收斂的過程,加之restart帶來的cycle效果,有漲1-2個點的可能。
圖、cosine_decay_restarts示例,紅色線條t_mul=2.0,m_mul=0.5,藍色線條t_mul=2.0,m_mul=1.0
2.8、linear_cosine_decay 線性預先衰減,主要用在RL增強學習領域。
linear_cosine_decay(learning_rate, global_step, decay_steps,
num_periods=0.5, alpha=0.0, beta=0.001,
name=None)
2.9.noisy_linear_cosine_decay 噪聲線性餘弦衰減
noisy_linear_cosine_decay(learning_rate, global_step, decay_steps,
initial_variance=1.0, variance_decay=0.55,
num_periods=0.5, alpha=0.0, beta=0.001,
name=None)
該方法在衰減過程中加入了噪聲,某種程度上增加了lr尋找最優值的隨機性和可能性。
題外話:
Google在2018年的 ICLR2018 上的論文《DON’T DECAY THE LEARNING RATE, INCREASE THE BATCH SIZE》提出:
不用衰減學習率啦,只要增大 Batch Size 就可以啦!