【深度学习】 BGD、SGD、mini-batch GD
论文链接
An overview of gradient descent optimization algorithms
提取码:c38u
BGD(Batch gradient descent)
每次使用全部训练集样本来更新模型参数
批量梯度下降每次学习都使用整个训练集,因此其优点在于每次更新都会朝着正确的方向进行,最后能够保证收敛于极值点(凸函数收敛于全局极值点,非凸函数可能会收敛于局部极值点),但是其缺点在于每次学习时间过长,并且如果训练集很大以至于需要消耗大量的内存,并且全量梯度下降不能进行在线模型参数更新
for i in range(number of epochs):
params_grad = evaluate_gradient(loss_function, data, params)
params = params - learning_rate * params_grad
SGD(Stochastic gradient descent)
随机梯度下降算法每次从训练集中随机选择一个样本来进行学习
随机梯度下降算法每次只随机选择一个样本来更新模型参数,因此每次的学习是非常快速的,并且可以进行在线更新,随机梯度下降最大的缺点在于每次更新可能并不会按照正确的方向进行,因此会带来优化波动(扰动)
for i in range(number of epochs):
np.random.shuffle(data)
for each in data:
params_grad = evaluate_gradient(loss_function, each, params)
params = params - learning_rate * params_grad
mini-batch GD
mini-batch 梯度下降综合了 batch 梯度下降与 stochastic 梯度下降,在每次更新速度与更新次数中间取得一个平衡,其每次更新从训练集中随机选择 m,m<n 个样本进行学习
for i in range(number of epochs):
np.random.shuffle(data)
for batch in get_batches(data, batch_size = batch_size):
params_grad = evaluate_gradient(loss_function, batch, params)
params = params - learning_rate * params_grad
TensorFlow实现:
batch_size = 8
# 设置batch_size
x = tf.placeholder(tf.float32, shape=(batch_size, 2), name="x-input")
# 设置特征x的占位 batch_size x 2
y_ = tf.placeholder(tf.float32, shape=(batch_size, 1), name="y-input")
# 设置标签y_的占位 batch_size x 1
loss = ...
train_step = tf.train.AdamOptimizer(0.001).minimize(loss)
with tf.Session() as sess:
...
for i in range(STEPS):
current_X, current_Y = ...
sess.run(train_step, feed_dict={x: current_X, y_: current_Y})
# current_X和current_Y是batch_size个(特征,标签)对
结语
如果您有修改意见或问题,欢迎留言或者通过邮箱和我联系。
手打很辛苦,如果我的文章对您有帮助,转载请注明出处。