网易课程DeepLearning.ai 吴恩达深度学习课程笔记:第二周③:梯度下降法、导数

梯度下降法(Gradient Descent)

梯度下降法可以做什么?

在你测试集上,通过最小化代价函数(成本函数)J(w,b) 来训练的参数wb

如图,在第二行给出和之前一样的逻辑回归算法的代价函数(成本函数)

梯度下降法的形象化说明

在这个图中,横轴表示你的空间参数wb ,在实践中,w 可以是更高的维度,但是为了更好地绘图,我们定义wb ,都是单一实数,代价函数(成本函数)J(w,b) 是在水平轴wb 上的曲面,因此曲面的高度就是J(w,b) 在某一点的函数值。我们所做的就是找到使得代价函数(成本函数)J(w,b) 函数值是最小值,对应的参数wb

如图,代价函数(成本函数)J(w,b) 是一个凸函数(convex function),像一个大碗一样。

如图,这就与刚才的图有些相反,因为它是非凸的并且有很多不同的局部最小值。由于逻辑回归的代价函数(成本函数)J(w,b) 特性,我们必须定义代价函数(成本函数)J(w,b) 为凸函数。 初始化wb

可以用如图那个小红点来初始化参数wb ,也可以采用随机初始化的方法,对于逻辑回归几乎所有的初始化方法都有效,因为函数是凸函数,无论在哪里初始化,应该达到同一点或大致相同的点。

我们以如图的小红点的坐标来初始化参数wb

2. 朝最陡的下坡方向走一步,不断地迭代

我们朝最陡的下坡方向走一步,如图,走到了如图中第二个小红点处。

我们可能停在这里也有可能继续朝最陡的下坡方向再走一步,如图,经过两次迭代走到第三个小红点处。

3.直到走到全局最优解或者接近全局最优解的地方

通过以上的三个步骤我们可以找到全局最优解,也就是代价函数(成本函数)J(w,b) 这个凸函数的最小值点。

梯度下降法的细节化说明(仅有一个参数)

假定代价函数(成本函数)J(w)  只有一个参数w ,即用一维曲线代替多维曲线,这样可以更好画出图像。

ww-adJ(w)dw

迭代就是不断重复做如图的公式:

:= 表示更新参数

a  表示学习率(learning rate),用来控制步长(step),即向下走一步的长度dJ(w)/dw  就是函数J(w)w  求导(derivative),在代码中我们会使用dw 表示这个结果

对于导数更加形象化的理解就是斜率(slope),如图该点的导数就是这个点相切于 J(w) 的小三角形的高除宽。假设我们以如图点为初始化点,该点处的斜率的符号是正的,即dJ(w)/dw>0 ,所以接下来会向左走一步。

整个梯度下降法的迭代过程就是不断地向左走,直至逼近最小值点。

假设我们以如图点为初始化点,该点处的斜率的符号是负的,即dJ(w)/dw<0 ,所以接下来会向右走一步。

整个梯度下降法的迭代过程就是不断地向右走,即朝着最小值点方向走。

梯度下降法的细节化说明(两个参数)

逻辑回归的代价函数(成本函数)J(w,b) 是含有两个参数的。

w≔w-a∂J(w,b)/∂w       bb-a∂J(w,b)/∂b

 表示求偏导符号,可以读作round∂J(w,b)/∂w  就是函数J(w,b)  对w  求偏导,在代码中我们会使用dw  表示这个结果, ∂J(w,b)/∂b  就是函数J(w,b)b  求偏导,在代码中我们会使用db  表示这个结果, 小写字母d  用在求导数(derivative),即函数只有一个参数, 偏导数符号  用在求偏导(partial derivative),即函数含有两个以上的参数。

导数(Derivatives)

这个视频我主要是想帮你获得对微积分和导数直观的理解。或许你认为自从大学毕以后你再也没有接触微积分。这取决于你什么时候毕业,也许有一段时间了,如果你顾虑这点,请不要担心。为了高效应用神经网络和深度学习,你并不需要非常深入理解微积分。因此如果你观看这个视频或者以后的视频时心想:“哇哦,这些知识、这些运算对我来说很复杂。”我给你的建议是:坚持学习视频,最好下课后做作业,成功的完成编程作业,然后你就可以使用深度学习了。在第四周之后的学习中,你会看到定义的很多种类的函数,通过微积分他们能够帮助你把所有的知识结合起来,其中有的叫做前向函数和反向函数,因此你不需要了解所有你使用的那些微积分中的函数。所以你不用担心他们,除此之外在对深度学习的尝试中,这周我们要进一步深入了解微积分的细节。所有你只需要直观地认识微积分,用来构建和成功的应用这些算法。最后,如果你是精通微积分的那一小部分人群,你对微积分非常熟悉,你可以跳过这部分视频。其他同学让我们开始深入学习导数。

一个函数f(a)=3a ,它是一条直线。下面我们来简单理解下导数。让我们看看函数中几个点,假定a=2 ,那么f(a)a 的3倍等于6,也就是说如果a=2 ,那么函数f(a)=6 。假定稍微改变一点点a 的值,只增加一点,变为2.001,这时a 将向右做微小的移动。0.001的差别实在是太小了,不能在图中显示出来,我们把它右移一点,现在f(a) 等于a 的3倍是6.003,画在图里,比例不太符合。请看绿色高亮部分的这个小三角形,如果向右移动0.001,那么f(a) 增加0.003,f(a) 的值增加3倍于右移的a ,因此我们说函数f(a)a=2 ,.是这个导数的斜率,或者说,当a=2 时,斜率是3。导数这个概念意味着斜率,导数听起来是一个很可怕、很令人惊恐的词,但是斜率以一种很友好的方式来描述导数这个概念。所以提到导数,我们把它当作函数的斜率就好了。更正式的斜率定义为在上图这个绿色的小三角形中,高除以宽。即斜率等于0.003除以0.001,等于3。或者说导数等于3,这表示当你将a 右移0.001,f(a) 的值增加3倍水平方向的量。

现在让我们从不同的角度理解这个函数。

假设a=5  ,此时f(a)=3a=15

a 右移一个很小的幅度,增加到5.001,f(a)=15.003 。 即在a=5  时,斜率是3,这就是表示,当微小改变变量a 的值,df(a)da=3  。一个等价的导数表达式可以这样写ddaf(a)  ,不管你是否将f(a) 放在上面或者放在右边都没有关系。

在这个视频中,我讲解导数讨论的情况是我们将a 偏移0.001,如果你想知道导数的数学定义,导数是你右移很小的a 值(不是0.001,而是一个非常非常小的值)。通常导数的定义是你右移a (可度量的值)一个无限小的值,f(a) 增加3倍(增加了一个非常非常小的值)。也就是这个三角形右边的高度。

那就是导数的正式定义。但是为了直观的认识,我们将探讨右移a=0.001  这个值,即使0.001并不是无穷小的可测数据。导数的一个特性是:这个函数任何地方的斜率总是等于3,不管a=2a=5 ,这个函数的斜率总等于3,也就是说不管a 的值如何变化,如果你增加0.001,f(a) 的值就增加3倍。这个函数在所有地方的斜率都相等。一种证明方式是无论你将小三角形画在哪里,它的高除以宽总是3。

我希望带给你一种感觉:什么是斜率?什么是导函数?对于一条直线,在例子中函数的斜率,在任何地方都是3。在下一个视频让我们看一个更复杂的例子,这个例子中函数在不同点的斜率是可变的。

2.6 更多的导数例子(More Derivative Examples)

在这个视频中我将给出一个更加复杂的例子,在这个例子中,函数在不同点处的斜率是不一样的,先来举个例子:

我在这里画一个函数,f(a)=a2 ,如果a=2  的话,那么f(a)=4 。让我们稍稍往右推进一点点,现在a=2.001  ,则f(a)≈4.004  (如果你用计算器算的话,这个准确的值应该为4.004。0.001 我只是为了简便起见,省略了后面的部分),如果你在这儿画,一个小三角形 你就会发现,如果把a 往右移动0.001,那么f(a) 将增大四倍,即增大0.004。在微积分中我们把这个三角形斜边的斜率,称为f(a) 在点a=2  处的导数(即为4),或者写成微积分的形式,当a=2  的时候, ddaf(a)=4  由此可知,函数f(a)=a2 ,在a 取不同值的时候,它的斜率是不同的,这和上个视频中的例子是不同的。

这里有种直观的方法可以解释,为什么一个点的斜率,在不同位置会不同如果你在曲线上,的不同位置画一些小小的三角形你就会发现,三角形高和宽的比值,在曲线上不同的地方,它们是不同的。所以当a=2  时,斜率为4;而当a=5 时,斜率为10 。如果你翻看微积分的课本,课本会告诉你,函数f(a)=a2 的斜率(即导数)为2a 。这意味着任意给定一点a ,如果你稍微将a ,增大0.001,那么你会看到f(a) 将增大2a ,即增大的值为点在a 处斜率或导数,乘以你向右移动的距离。

现在有个小细节需要注意,导数增大的值,不是刚好等于导数公式算出来的值,而只是根据导数算出来的一个估计值。

为了总结这堂课所学的知识,我们再来看看几个例子:

假设f(a)=a^{3} 如果你翻看导数公式表,你会发现这个函数的导数,等于3a^{2} 。所以这是什么意思呢,同样地举一个例子:我们再次令a=2 ,所以a^{3}=8  ,如果我们又将a 增大一点点,你会发现f(a)≈8.012 , 你可以自己检查一遍,如果我们取8.012,你会发现2.0013  ,和8.012很接近,事实上当a=2 时,导数值为2^{2} ,即3×4=12 。所以导数公式,表明如果你将a 向右移动0.001时,f(a)  将会向右移动12倍,即0.012。

来看最后一个例子,假设f(a)=\log_{e}a ,有些可能会写作lna ,函数\log_{e}a  的斜率应该为1/a ,所以我们可以解释如下:如果a 取任何值,比如又取a=2 ,然后又把a 向右边移动0.001 那么f(a) 将增大1/a×0.001 ,如果你借助计算器的话,你会发现当a=2f(a)≈0.69315  ;而a=2.001 时,f(a)≈0.69365 。所以f(a) 增大了0.0005,如果你查看导数公式,当a=2 的时候,导数值ddaf(a)=12 。这表明如果你把 增大0.001,f(a) 将只会增大0.001的二分之一,即0.0005。如果你画个小三角形你就会发现,如果x  轴增加了0.001,那么y  轴上的函数\log_{e}a,将增大0.001的一半 即0.0005。所以 1a  ,当a=2 时这里是 ,就是当a=2 时这条线的斜率。这些就是有关,导数的一些知识。

总之只需要记住两点:

第一点,导数就是斜率,而函数的斜率,在不同的点是不同的。在第一个例子中f(a)=3a  ,这是一条直线,在任何点它的斜率都是相同的,均为3。但是对于函数f(a)=3a^{2}  ,或者f(a)=\log_{e}a,它们的斜率是变化的,所以它们的导数或者斜率,在曲线上不同的点处是不同的。

第二点,如果你想知道一个函数的导数,你可参考你的微积分课本或者维基百科,然后你应该就能找到这些函数的导数公式。

猜你喜欢

转载自blog.csdn.net/qq_36552489/article/details/93314278