Optimization Methods
1-梯度下降法在机器学习中的一个简单的优化方法是梯度下降(GD)。当你对每一步的所有mm例子采取梯度步骤时,它也被称为批量梯度下降。
- (Batch) Gradient Descent:
X = data_input
Y = labels
parameters = initialize_parameters(layers_dims)
for i in range(0, num_iterations):
# Forward propagation
a, caches = forward_propagation(X, parameters)
# Compute cost.
cost = compute_cost(a, Y)
# Backward propagation.
grads = backward_propagation(a, caches, parameters)
# Update parameters.
parameters = update_parameters(parameters, grads)
- Stochastic Gradient Descent:
X = data_input Y = labels parameters = initialize_parameters(layers_dims) for i in range(0, num_iterations): for j in range(0, m): # Forward propagation a, caches = forward_propagation(X[:,j], parameters) # Compute cost cost = compute_cost(a, Y[:,j]) # Backward propagation grads = backward_propagation(a, caches, parameters) # Update parameters. parameters = update_parameters(parameters, grads)
在随机梯度下降中,在更新梯度之前,只使用一个训练示例。当训练集很大时,SGD可以更快。但是这些参数会“振荡”到最小值,而不是平滑地收敛。这里有一个例子
您应该记住的是:梯度下降、小批量梯度下降和随机梯度下降之间的区别是您用来执行一个更新步骤的示例数量。你必须调整学习速率超参数。有了一个良好的小批量大小,通常它的性能优于梯度下降或随机梯度下降(特别是当训练集很大时)。
def random_mini_batches(X, Y, mini_batch_size = 64, seed = 0):
"""
Creates a list of random minibatches from (X, Y)
Arguments:
X -- input data, of shape (input size, number of examples)
Y -- true "label" vector (1 for blue dot / 0 for red dot), of shape (1, number of examples)
mini_batch_size -- size of the mini-batches, integer
Returns:
mini_batches -- list of synchronous (mini_batch_X, mini_batch_Y)
"""
np.random.seed(seed) # To make your "random" minibatches the same as ours
m = X.shape[1] # number of training examples
mini_batches = []
# Step 1: Shuffle (X, Y)
permutation = list(np.random.permutation(m))
shuffled_X = X[:, permutation]
shuffled_Y = Y[:, permutation].reshape((1,m))
# Step 2: Partition (shuffled_X, shuffled_Y). Minus the end case.
num_complete_minibatches = math.floor(m/mini_batch_size) # number of mini batches of size mini_batch_size in your partitionning
for k in range(0, num_complete_minibatches):
### START CODE HERE ### (approx. 2 lines)
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]
### END CODE HERE ###
mini_batch = (mini_batch_X, mini_batch_Y)
mini_batches.append(mini_batch)
# Handling the end case (last mini-batch < mini_batch_size)
if m % mini_batch_size != 0:
### START CODE HERE ### (approx. 2 lines)
mini_batch_X = shuffled_X[:, num_complete_minibatches * mini_batch_size : m]
mini_batch_Y = shuffled_Y[:, num_complete_minibatches * mini_batch_size : m]
### END CODE HERE ###
mini_batch = (mini_batch_X, mini_batch_Y)
mini_batches.append(mini_batch)
return mini_batches
您应该记住的是:移动(洗牌)和分区是构建小批量的两个步骤所需的两个步骤,通常被选择为小批量大小,例如,16、32、64,128。
3 - Momentum
因为小批量梯度下降在看到一个例子的一个子集后,会进行一个参数更新,更新的方向有一些差异,所以小批量梯度下降的路径将会“振荡”趋向收敛。使用动量可以减少这些振荡。动量考虑了过去的渐变,以平滑更新。我们将在变量vv中存储先前梯度的“方向”。形式上,这将是之前步骤的指数加权平均。你也可以把vv看作是一个滚下山的球的“速度”,根据山的坡度/坡度的方向建立速度(和动量)。
图3:红色箭头显示了一个带动量的小批量梯度下降的方向。蓝色的点显示了每个步骤的梯度(关于当前的小批)的方向。我们不只是遵循梯度,而是让梯度影响vv,然后在vv的方向上迈出一步。
Adam
动量通常是有帮助的,但是考虑到小的学习速率和简单的数据集,它的影响几乎是不可能的。另外,你在成本中看到的巨大振荡来自于这样一个事实,即一些小批量对于优化算法来说更加困难。另一方面,亚当明显优于小批量梯度下降和动量。如果您在这个简单的数据集上运行这个模型,那么这三种方法都将带来非常好的结果。然而,你已经看到亚当收敛得快得多。亚当的一些优点包括:相对较低的内存需求(尽管高于梯度下降和随动量的梯度下降)通常可以很好地工作,即使对超参数进行微调(除了)