梯度下降是所有深度学习的核心。本文简要介绍了该方法的技术细节。
考虑一个机器学习模型,在该机器学习模型中,它接受输入,然后根据给定的参数应用一些计算,然后输出结果。
然后将输出与一些预期结果进行比较,我们希望看到的是输出尽可能接近这些预期结果。
输出和预期的结果之间的差异是由一个函数描述,我们称之为损失函数.
为简便起见,我们假设系统的损失函数为抛物线形式:
其中θ是微调参数,a和b是一些值。
此损失函数如下图所示:
上图根据参数θ给出了输出中的误差量。
目的是最小化误差,从图中判断很容易发现最小误差位于曲线的底部(点:θ= 0,L= 1)。
通常情况下,解析解是一种可能,但当损失函数变得复杂时,它并不总是容易的,因此我们回到迭代解。
我们进行的方式相当直观,我们改变θ,我们看看是否L减少。
我们一直这样做,直到我们发现θ的值为L最小值。
正如我们所看到的,当θ从-2移动到-1.4时,L会下降,这意味着θ正朝着正确的方向移动。另一方面,当θ从+1.5移动到+2时,L增加,这意味着θ向错误的方向移动,它必须沿箭头所示的相反方向移动。
显然我们需要改变θ,但需要改变多少和朝哪个方向?
正如我们在上面所看到的那样,当我们将θ从最低值变为最高值(例如:-∞到+∞)时,我们跟踪L的变化。如果L继续减小,我们继续增加θ,否则如果L开始增加,我们开始减小θ直到我们找到正确的值。
这解决了方向,但θ应该变化的量是多少?
一个简单的解决方案是采用L变量的一小部分,我们称之为α。
将所有这些特性混合在一起,我们得到以下公式:
这个公式清楚地表明θ的下一个值是基于前一个值减去L.的变化的一小部分
当然,最直接的方法是ΔL=L(结束) - L(开始)。更好的方法是计算导数。
例如,L=aθ²+ b的导数变为dL/dθ=2aθ,因此通过plugging θ值得到dL。
L的最小值是当dL对于某个θ变为零时。
目标现在变为找到给出dL= 0的θ
α通常取决于经验,应尝试使用几个值来找到使转换速度更快的值,但这里仍然存在一个问题,即参数的常数(稍后会详细介绍)。
例
考虑α= .9,L=θ²,并且值ɛ= .00001,它表示∆L应该多小就认为是0,
在迭代下降公式(θ₊1=θ-α.ΔL)之后,我们得到下表。
我们可以看到,为了使ΔL小于.00001,需要77次迭代,并且能够找到可接受的θ值。
它有点长,这是因为我们有一个常数α!
原因是即使我们接近最小值,我们也会采取相同的step,而实际上我们应该做的是使用较小的steps来重新调整下降。
示意性地,梯度下降正在执行类似下面的图形(PS。这不是准确的表示,但它给出了直觉)
然而,真正需要的是,当我们接近最小值时,我们必须调整我们的步长,以便确定最小值并避免绕过它。所以我们需要以下内容:
实现这一目标的一种方法是减少α,例如,每次迭代i计算一个因子f = 1 + (i/10),然后在梯度下降公式中将α除以f:
这种修改将给出一个大大改进的结果,我们达到一个解决方案只需8次迭代,如下表所示:
最后是一个python代码,它将计算任何损失函数的梯度下降,前提是函数dF(x)的导数是正确的
梯度下降是找到最小损失函数的便捷工具,它在深度学习领域非常有用。
联系客服