机器学习模型中step与epoch,batch_size之间的关系

本文主要谈谈自己对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 ) = 1 K ∑ t = 1 K l ( y t , y t e t o i l e ) L(W) = \frac{1} {K}\sum_{t=1}^{K}l(y_t,y_{t_{etoile}}) L(W)=K1t=1Kl(yt,ytetoile)。 我们会发现这里的loss function 是K组训练数据的平均误差,这里的K其实就是我们在训练模型时选择的batch_size,即将多个训练数据整合到一起,再通过最小化他们的平均误差来优化权重矩阵。那么经过每个batch_size的训练,我们计算梯度,更新权重的过程就称为一个step。

有了对于step的更深刻的认识,我们就可以轻松地根据step自行调整学习率了。

你可能感兴趣的:(tensorflow,机器学习,深度学习,神经网络,深度学习,机器学习,人工智能,tensorflow)