本文主要谈谈自己对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=1Kl(yt,ytetoile)。 我们会发现这里的loss function 是K组训练数据的平均误差,这里的K其实就是我们在训练模型时选择的batch_size,即将多个训练数据整合到一起,再通过最小化他们的平均误差来优化权重矩阵。那么经过每个batch_size的训练,我们计算梯度,更新权重的过程就称为一个step。
有了对于step的更深刻的认识,我们就可以轻松地根据step自行调整学习率了。