【上节回顾】在上一讲里,我们学习了logistic回归模型,也知道了损失函数。损失函数,是衡量单一训练样例的效果。你还知道了成本函数,成本函数用于衡量参数w和b的效果,在全部训练集上来衡量。

下面我们讨论如何使用梯度下降法,来训练或学习训练集上的参数w和b。

2.4 吴恩达《神经网络与深度学习》——梯度下降法回顾一下,这里是熟悉的logistic回归算法。第二行是成本函数J,成本函数J是参数w和b的函数,它被定义为平均值,即1/m的损失函数之和。损失函数可以衡量你的算法的效果。每一个训练样例,都输出y^(i),把它和与基本真值标签y^(i)进行比较,等号右边展开完整的公式。成本函数衡量了,参数w和b在训练集上的效果。

要习得合适的参数w和b,很自然地就想到,我们想找到使得成本函数J(w,b)尽可能小的w和b。

下面来看看梯度下降法:

2.4 吴恩达《神经网络与深度学习》——梯度下降法

这个图中的横轴,表示空间参数w和b。在实践中,w可以是更高维的。

但为了方便绘图,我们让w是一个实数,b也是一个实数,成本函数J(w,b)是在水平轴w和b上的曲面,曲面的高度表示了,J(w,b)在某一点的值。

我们所想要做的就是,找到这样的w和b,使其对应的成本函数J值,是最小值。

可以看到,成本函数J是一个凸函数,像一个大碗。因此,这是一个凸函数。

2.4 吴恩达《神经网络与深度学习》——梯度下降法

看起来和这样的函数不一样,它是非凸的,有很多不同的局部最优。

因此,我们的成本函数J(w,b),之所以是凸函数,凸函数这性质是我们使用,logistic回归的这个特定成本函数J的重要原因之一。

为了找到更好地参数值,我们要做的就是用某初始值,初始化w和b,用小红点表示。

对于logistic回归而言,几乎是任意的初始化方法都行之有效。对于用0来进行初始化。

但是对于logistic回归,我们通常不这么做。

但因为函数是凸的,无论在哪里初始化,都应该达到同一点或大致相同的点。

梯度下降法所做的就是,从初始点开始,朝最陡的下坡方向走一步。在梯度下降一步后,或许在那里停下。因为它正试图沿着最快下降的方法往下走。或者说,尽可能快地往下走。这是梯度下降的一次迭代。两次迭代或许会到达那里,或者三次……等等,隐藏在图上的曲线,很希望收敛到这个全局最优解或接近全局最优解。

这张图片阐述了,梯度下降法,我们多些一点细节。

2.4 吴恩达《神经网络与深度学习》——梯度下降法为了更好地说明,让我们来看一些函数。你希望得到最小化J(w)。

函数可能会看起来像这样。为了方便画,我先忽略b,仅仅是用一维曲线,来代替多维曲线。梯度下降法是这样做的。

我们将重复执行以下的更新操作。我们更新w的值,使用:=表示更新w,让w为w-adJ(w)/dw

在算法收敛之前,我会重复这样去做。

我要说明,公式中的两点,这里的α表示学习率,学习率可以控制每一次迭代或者梯度下降法中的步长。

我们之后会讨论,如何选择学习率α。其实在这里,这个数是导数。这就是对参数w的更新或者变化量,当我们开始编写代码,来实现梯度下降,我们会使用代码中变量名的约定,dw表示导数。像这样编写代码,即w:=w-αdw。我们用dw作为倒数的变量名。

现在我们确保梯度下法更新是有用的。w在这,成本对应的成本函数J(w)在函数上的这一点、

记住导数的定义,是函数在这一点的斜率。而函数的斜率,是高除以宽。在这一点相切于J(w)的一个小三角形。

在这里,导数是正的。新的w值等于w自身减去学习率乘导数。导数是正的从w中减去这个乘积,接着向右边走一步。

像这样,梯度下降法让你的算法渐渐地减小这个参数w,对于一开始就很大的参数w来说。

另一个例子,如果w的位置是在这里,这个点的斜率将会是负的。

用梯度下降法去更新,w将会减去α乘上一个负数。慢慢地,使得参数w增加,不断地用梯度下降法来迭代,w会变得越来越大。无论你初始化的位置,是在左边还是右边。梯度下降法会朝着全局最小值方向移动。

如果你不熟悉导数或者微积分,也不熟悉dJ(w)/dw的含义,不用着急,在下一讲,我们会讨论更多关于导数的知识。

如果你很了解微积分,你应该对神经网络是如何工作的,有更深刻的直观认识。但即使你并不熟悉微积分。通过下面的几讲,我们也会对导数和微积分有足够的直观认识。

你将能够有效地使用神经网络。但现在所有的直观认识,即用这个术语表示的是函数的斜率。

我们知道,用目前参数的情况下,函数斜率,据此朝下降速度最快的方向走。

我们知道,为了让成本函数J走下坡路,下一步更新的方向在哪,当前J(w)的梯度下降法,只有参数w。

2.4 吴恩达《神经网络与深度学习》——梯度下降法在logistic回归中,你的成本函数,是一个含有w和b的函数。

在这种情况下,梯度下降的内循环,就必须一直重复计算。通过w:=w-adJ(w)/dw更新w,通过b:=b-adJ(w,b)/db更新b。这两个等式是实际更新参数时进行的操作

另外,我想提到的是,在微积分的符号约定中,对一些人来说,是有点困惑的,目前我并不认为,理解微积分是非常重要的。如果你看到了这些,希望你不要想太多。在微积分中在这里的术语,是一个有趣的花体符号。这个符号其实是,一个小写d,用一个花哨字体来写的,当你看到这种表示方式时,意思是J(w,b)的导数或则函数J(w,b)的斜率,就是函数在w方向的斜率是多少。

在微积分中这个符号的规则,我认为并不是完全符合逻辑的,微积分中用这个符号规则,我认为这样会导致更加复杂。当导数J有两个以上的变量,不要使用小写字母d而使用花哨的符号,这样就被称为偏导数符号。但别担心,如果J只有一个变量,就是用小写字母d。唯一区别就是,你是用偏导数符号,还是小写字母d,是取决于你的函数J是否含有两个以上的变量,变量超过两个,就用偏导数符号。如果函数只有一个变量,就用小写字母d。

这是在微积分里一个有趣的符号规则,我认为,它使事情变得更加复杂了,但如果你看到了偏导数符号,其含义就是计算函数关于其中一个变量,在对应点多对应的斜率,类似在这里,形式上应该用微积分中正确符号。

因为在这里J有两个输入,而不是一个附图底部的这个,应该用这个偏导数来写,但其实表达的是,和小写字母d表达的是一样的。最后当你编写代码,想要实现屏幕写出的这个式子时,通常在更新w的值时,我们会用到dw这个变量,来替代这个式子。当你想去更新b的数值,代码中就用db来表示。

综上,这就是梯度下降法的实现方法。如果你有好几年没碰微积分了,我知道,微积分中有很多的导数,你可能会更适应。如果你有这种感觉,也不要担心。

在下一讲中,更直观地来给你讲解导数。不需要很深入理解微积分,而只是直观地理解微积分,你也可以让神经网络变得更有效。


相关文章:

  • 2021-10-09
  • 2021-08-01
  • 2021-07-26
  • 2022-01-17
  • 2021-10-10
  • 2021-11-15
  • 2021-05-05
  • 2021-11-05
猜你喜欢
  • 2021-12-11
  • 2021-04-12
  • 2021-10-21
  • 2021-07-30
  • 2021-10-27
  • 2021-10-14
  • 2021-04-18
相关资源
相似解决方案