1. 程式人生 > 程式設計 >Keras SGD 隨機梯度下降優化器引數設定方式

Keras SGD 隨機梯度下降優化器引數設定方式

SGD 隨機梯度下降

Keras 中包含了各式優化器供我們使用,但通常我會傾向於使用 SGD 驗證模型能否快速收斂,然後調整不同的學習速率看看模型最後的效能,然後再嘗試使用其他優化器。

Keras 中文文件中對 SGD 的描述如下:

keras.optimizers.SGD(lr=0.01,momentum=0.0,decay=0.0,nesterov=False)

隨機梯度下降法,支援動量引數,支援學習衰減率,支援Nesterov動量

引數:

lr:大或等於0的浮點數,學習率

momentum:大或等於0的浮點數,動量引數

decay:大或等於0的浮點數,每次更新後的學習率衰減值

nesterov:布林值,確定是否使用Nesterov動量

引數設定

Time-Based Learning Rate Schedule

Keras 已經內建了一個基於時間的學習速率調整表,並通過上述引數中的 decay 來實現,學習速率的調整公式如下:

LearningRate = LearningRate * 1/(1 + decay * epoch)

當我們初始化引數為:

LearningRate = 0.1
decay = 0.001

大致變化曲線如下(非實際曲線,僅示意):

Keras SGD 隨機梯度下降優化器引數設定方式

當然,方便起見,我們可以將優化器設定如下,使其學習速率隨著訓練輪次變化:

sgd = SGD(lr=learning_rate,decay=learning_rate/nb_epoch,momentum=0.9,nesterov=True)

Drop-Based Learning Rate Schedule

另外一種學習速率的調整方法思路是保持一個恆定學習速率一段時間後立即降低,是一種突變的方式。通常整個變化趨勢為指數形式。

Keras SGD 隨機梯度下降優化器引數設定方式

對應的學習速率變化公式如下:

LearningRate = InitialLearningRate * DropRate^floor(Epoch / EpochDrop)

實現需要使用 Keras 中的 LearningRateScheduler 模組:

from keras.callbacks import LearningRateScheduler
# learning rate schedule
def step_decay(epoch):
 initial_lrate = 0.1
 drop = 0.5
 epochs_drop = 10.0
 lrate = initial_lrate * math.pow(drop,math.floor((1+epoch)/epochs_drop))
 return lrate

lrate = LearningRateScheduler(step_decay)

# Compile model
sgd = SGD(lr=0.0,nesterov=False)
model.compile(loss=...,optimizer=sgd,metrics=['accuracy'])

# Fit the model
model.fit(X,Y,...,callbacks=[lrate])

補充知識:keras中的BGD和SGD

關於BGD和SGD

首先BGD為批梯度下降,即所有樣本計算完畢後才進行梯度更新;而SGD為隨機梯度下降,隨機計算一次樣本就進行梯度下降,所以速度快很多但容易陷入區域性最優值。

折中的辦法是採用小批的梯度下降,即把資料分成若干個批次,一批來進行一次梯度下降,減少隨機性,計算量也不是很大。 mini-batch

keras中的batch_size就是小批梯度下降。

以上這篇Keras SGD 隨機梯度下降優化器引數設定方式就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。