本文主要談談自己對step,epoch,batch_size這幾個常見參數的理解。
最近在調試模型的時候,發現在使用keras.optimizer.adam時,模型在添加了新的一層2D卷積層后難以收斂,在不調整初始權重矩陣的情況下,想通過衰減學習率來使loss function的收斂性更好。
tf.keras.optimizers.Adam(learning_rate=0.001,beta_1=0.9,beta_2=0.999,epsilon=1e-07,amsgrad=False,name="Adam",**kwargs
)
可以看到,adam這個optimizer在沒有其他參數條件的情況下,默認學習率為固定0.001。
為了調整學習率,在keras的文檔中找到了下述示例代碼,代碼的意思很簡單,初始學習率為0.01,衰減需要的step為10000,衰減率為0.9,即每次經過10000 steps,學習率就衰減為原來的0.9。
lr_schedule = keras.optimizers.schedules.ExponentialDecay(initial_learning_rate=1e-2,decay_steps=10000,decay_rate=0.9)
optimizer = keras.optimizers.SGD(learning_rate=lr_schedule)
那么這里的step和我們在編譯模型時選的epoch與batch_size有什么關系呢。
需要理解的是,在訓練模型的過程中,一個step其實指的就是一次梯度更新的過程。例如在每個epoch中有2000個用于訓練的圖片,我們選取了batch_size=100,那么我們就需要2000 images / 100 (images/step) = 20 steps來完成這個epoch。
換個角度,從神經網絡的角度來說,我們都知道機器學習的最終目的,就是最小化Loss function損失函數。L(W)=1K∑t=1Kl(yt,ytetoile)L(W) = \frac{1} {K}\sum_{t=1}^{K}l(y_t,y_{t_{etoile}})L(W)=K1?∑t=1K?l(yt?,ytetoile??)。 我們會發現這里的loss function 是K組訓練數據的平均誤差,這里的K其實就是我們在訓練模型時選擇的batch_size,即將多個訓練數據整合到一起,再通過最小化他們的平均誤差來優化權重矩陣。那么經過每個batch_size的訓練,我們計算梯度,更新權重的過程就稱為一個step。
有了對于step的更深刻的認識,我們就可以輕松地根據step自行調整學習率了。