神经网络优化算法-mini-batch、Adam、momentum、随机梯度下降

2021-01-14 14:50:37 浏览数 (1)

梯度下降

没有任何优化的梯度下降(GD,Gradient Descent)

Mini-batch

神经网络训练过程是对所有m个样本,称为batch,如果m很大,例如达到百万数量级,训练速度往往会很慢。

我们可以把m个训练样本分成若干个子集,称为mini-batches,这样每个子集包含的数据量就小了。这种梯度下降算法叫做Mini-batch Gradient Descent。

先将总的训练样本分成T个子集(mini-batches),然后对每个mini-batch进行神经网络训练,包括Forward Propagation,Compute Cost Function,Backward Propagation,循环至T个mini-batch都训练完毕。

左图随机梯度下降,右图Mini-batch

实现思路:

1. 把训练集打乱,但是X和Y依旧是一一对应的,之后,X的第i列是与Y中的第i个标签对应的样本。乱序步骤确保将样本被随机分成不同的小批次

代码语言:javascript复制
    # 第一步:打乱顺序
    permutation = list(np.random.permutation(m))  # 它会返回一个长度为m的随机数组,且里面的数是0到m-1,例如[7, 2, 1, 4, 8, 6, 3, 0, 5]
    shuffled_X = X[:, permutation]  # 将每一列的数据按permutation的顺序来重新排列。
    shuffled_Y = Y[:, permutation].reshape((1, m))

2. 切分,我们把训练集打乱之后,我们就可以对它进行切分了。

代码语言:javascript复制
    # 第二步,分割
    num_complete_minibatches = math.floor(m / mini_batch_size)  # 把你的训练集分割成多少份,请注意,如果值是99.99,那么返回值是99,剩下的0.99会被舍弃
    for k in range(0, num_complete_minibatches):
        # 截取列
        mini_batch_X = shuffled_X[:, k * mini_batch_size:(k   1) * mini_batch_size]
        mini_batch_Y = shuffled_Y[:, k * mini_batch_size:(k   1) * mini_batch_size]
        mini_batch = (mini_batch_X, mini_batch_Y)
        mini_batches.append(mini_batch)

    # 如果训练集的大小刚好是mini_batch_size的整数倍,那么这里已经处理完了
    # 如果训练集的大小不是mini_batch_size的整数倍,那么最后肯定会剩下一些,我们要把它处理了
    if m % mini_batch_size != 0:
        # 获取最后剩余的部分
        mini_batch_X = shuffled_X[:, mini_batch_size * num_complete_minibatches:]
        mini_batch_Y = shuffled_Y[:, mini_batch_size * num_complete_minibatches:]

        mini_batch = (mini_batch_X, mini_batch_Y)
        mini_batches.append(mini_batch)

随机梯度下降

随机梯度下降(SGD),与mini-batch不同的是其中每个小批量仅有1个样本

随机梯度下降每次下降速度很快,但是路线曲折,有较大的振荡,最终会在最小值附近来回波动,难以真正达到最小值处。而且在数值处理上就不能使用向量化的方法来提高运算速度。

左图随机梯度下降,右图梯度下降

momentum梯度下降

包含动量的梯度下降

0 人点赞