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

梯度下降

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

W^{[l]} = W^{[l]} - \alpha \text{ } dW^{[l]} \tag{1}

b^{[l]} = b^{[l]} - \alpha \text{ } db^{[l]} \tag{2}

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个标签对应的样本。乱序步骤确保将样本被随机分成不同的小批次

    # 第一步:打乱顺序
    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. 切分,我们把训练集打乱之后,我们就可以对它进行切分了。

    # 第二步,分割
    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梯度下降

包含动量的梯度下降

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程小泓哥

你的鼓励是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值