前言
当目标函数确定后,深度学习的训练任务就是最小化目标函数,也就是这里所说的优化方法(优化器)。
其实,任何最大化问题都可以很容易地转化为最小化问题,只需令目标函数的相反数为新的目标函数即可。深度学习中绝大多数目标函数都很复杂。
因此,很多优化问题并不存在解析解,而需要使用基于数值方法的优化算法找到近似解,即数值解。为了求得最小化目标函数的数值解,我们将通过优化算法有限次迭代模型参数来尽可能降低损失函数的值。
1. 什么是梯度下降
为了获得复杂目标函数的数值解,我们一般采用梯度下降及其衍生优化算法来迭代计算。为了直观上理解梯度下降,可以将其形象为“下山问题”。如下图。目标函数就是这里的“山”,当我们初始化了网络参数后,我们会有一个目标函数值,也就是出现在“山”上某个点。
为了最小化目标函数,也就是“下山”,我们需要知道下山的每一步怎么走。
梯度(可以理解为导数),可以在几何意义上反映函数图像在某处的升降情况,当我们确保了梯度一直是最优下降方向,并根据当前梯度更新下一步的函数值,就可以快速下山,取得最优解。
下图是从数学意义上的分析:【截图自《动手学深度学习(Pytorch版)》】一个凸函数的最小值点在端点,极小值点。而一个函数有多个极小值点,如果我们任选一个极小值点最为函数的最小值,这时容易陷入局部最优,而不是全局最优。
也就是上面图中不同的起点可能会走不同的路线下山,而且会到达不同的地方。从而陷入局部最优,为什么说是陷入呢?因为达到局部最优解的时候梯度为0已经不会更新了。局部最优相当于山坳,全局最优相当于山脚。
我们需要考虑的是能尽量走到山脚(避免局部最优),而且要能尽快的下山(快速收敛),这就是一系列优化算法做的事情。
2. 梯度下降的三种衍生算法
2.1 批量梯度下降法(BGD)
规则:BGD是在更新参数时使用所有的样本来进行更新:由于是用有限次迭代来求目标函数的最小值数值解,所以事先指定好迭代轮数:epochs。
for i in range(epochs):
params_grad = evaluate_gradient(loss_function, data, params)
params = params - learning_rate * params_grad
缺点:由于BGD对整个数据集计算梯度,所以计算起来非常慢
2.2 随机梯度下降法(SGD)
规则:和 BGD 的一次用所有数据计算梯度相比,SGD 每次更新时随机采样一个样本进行梯度更新,对于很大的数据集来说,可能会有相似的样本,这样 BGD 在计算梯度时会出现冗余,而 SGD 一次只进行一次更新,就没有冗余,而且比较快,并且可以新增样本。
for i in range(epochs):
n