优化算法
到目前为止,你一直使用梯度下降来更新参数并使损失降至最低。 在本笔记本中,你将学习更多高级的优化方法,以加快学习速度,甚至可以使你的损失函数的获得更低的最终值。 一个好的优化算法可以使需要训练几天的网络,训练仅仅几个小时就能获得良好的结果。
梯度下降好比在损失函数J上“下坡”。就像下图:
图1 :损失最小化好比在丘陵景观中寻找最低点
在训练的每个步骤中,你都按照一定的方向更新参数,以尝试到达最低点。
符号:与往常一样,=
da
适用于任何变量a
。
首先,请运行以下代码以导入所需的库。
import numpy as np
import matplotlib.pyplot as plt
import scipy.io
import math
import sklearn
import sklearn.datasets
from opt_utils import load_params_and_grads, initialize_parameters, forward_propagation, backward_propagation
from opt_utils import compute_cost, predict, predict_dec, plot_decision_boundary, load_dataset
from testCases import *
%matplotlib inline
plt.rcParams['figure.figsize'] = (7.0, 4.0) # set default size of plots
plt.rcParams['image.interpolation'] = 'nearest'
plt.rcParams['image.cmap'] = 'gray'
1 梯度下降
机器学习中一种简单的优化方法是梯度下降(gradient descent,GD)。当你对每个step中的所有m示例执行梯度计算步骤时,它也叫做“批量梯度下降”。
热身练习:实现梯度下降更新方法。 对于l=1,...,L,梯度下降规则为:
其中L是层数,α是学习率。所有参数都应存储在 parameters
字典中。请注意,迭代器l
在for
循环中从0开始,而第一个参数是和
。编码时需要将
l
转换为l+1
。
# GRADED FUNCTION: update_parameters_with_gd
def update_parameters_with_gd(parameters, grads, learning_rate):
"""
Update parameters using one step of gradient descent
Arguments:
parameters -- python dictionary containing your parameters to be updated:
parameters['W' + str(l)] = Wl
parameters['b' + str(l)] = bl
grads -- python dictionary containing your gradients to update each parameters:
grads['dW' + str(l)] = dWl
grads['db' + str(l)] = dbl
learning_rate -- the learning rate, scalar.
Returns:
parameters -- python dictionary containing your updated parameters
"""
L = len(parameters) // 2 # number of layers in the neural networks
# Update rule for each parameter
for l in range(L):
### START CODE HERE ### (approx. 2 lines)
parameters['W'+str(l+1)]=parameters['W'+str(l+1)]-learning_rate*grads['dW'+str(l+1)]
parameters['b'+str(l+1)]=parameters['b'+str(l+1)]-learning_rate*grads['db'+str(l+1)]
##不要忘记是l+1{:
### END CODE HERE ###
return parameters
parameters, grads, learning_rate = update_parameters_with_gd_test_case()
parameters = update_parameters_with_gd(parameters, grads, learning_rate)
print("W1 = " + str(parameters["W1"]))
print("b1 = " + str(parameters["b1"]))
print("W2 = " + str(parameters["W2"]))
print("b2 = " + str(parameters["b2"]))
它的一种变体是随机梯度下降(SGD),它相当于mini版的批次梯度下降,其中每个mini-batch只有一个数据示例。刚刚实现的更新规则不会更改。不同的是,SGD一次仅在一个训练数据上计算梯度,而不是在整个训练集合上计算梯度。下面的代码示例说明了随机梯度下降和(批量)梯度下降之间的区别。
- (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)
对于随机梯度下降,在更新梯度之前,只使用1个训练样例。当训练集大时,SGD可以更新的更快。但是这些参数会向最小值“摆动”而不是平稳地收敛。
这两种梯度下降的方式分别是批量梯度下降(Batch Gradient Descent)和随机梯度下降(Stochastic Gradient Descent),它们在更新参数的时候有所不同:
-
批量梯度下降(Batch Gradient Descent):
- 在每次迭代中,使用整个训练集进行前向传播和反向传播。
- 每个参数的更新是基于整个训练集的梯度的平均值。
- 因为要在整个训练集上计算梯度,因此在大型数据集上可能会很慢,尤其是当训练集很大时。
-
随机梯度下降(Stochastic Gradient Descent):
- 在每次迭代中,对于训练集中的每个样本,执行前向传播和反向传播。
- 每个参数的更新是基于一个样本的梯度。
- 因为只使用一个样本,更新更频繁,可以更快地收敛,但由于随机性,也可能更不稳定。
- 由于使用单个样本,随机梯度下降通常对噪声更敏感。
选择使用哪种梯度下降方法取决于许多因素:
- 批量梯度下降:
- 当训练集较小时,计算整个训练集的梯度通常比较快。
- 内存允许的情况下,可以并行化处理。
- 随机梯度下降:
- 当训练集很大时,更新更频繁,可以更快地进行迭代。
- 在在线学习(online learning)的情况下,可以逐步从新的样本中学习。
下图是一个演示例子:
图 1: SGD vs GD
“+”表示损失的最小值。 SGD造成许多振荡以达到收敛。但是每个step中,计算SGD比使用GD更快,因为它仅使用一个训练示例(相对于GD的整个批次)。
注意:实现SGD总共需要3个for循环:
1.迭代次数
2.m个训练数据
3.各层上(要更新所有参数,从()到(
))
实际上,如果你既不使用整个训练集也不使用一个训练示例来执行每次更新,则通常会得到更快的结果。小批量梯度下降法在每个步骤中使用中间数量的示例。通过小批量梯度下降,你可以遍历小批量,而不是遍历各个训练示例。
图 2:SGD vs Mini-Batch GD
“+”表示损失的最小值。在优化算法中使用mini-batch批处理通常可以加快优化速度。
你应该记住:
- 梯度下降,小批量梯度下降和随机梯度下降之间的差异是用于执行一个更新步骤的数据数量。
- 必须调整超参数学习