梯度下降
没有任何优化的梯度下降(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梯度下降
包含动量的梯度下降