吴恩达老师DeepLearning系列课程最详细学习笔记之20—向量化logistic回归的梯度输出

 教程是本人学习吴恩达老师DeepLearing系列课程中整理的最为详细的学习笔记。学习视频主要来自B站[双语字幕]吴恩达深度学习deeplearning.ai_哔哩哔哩_bilibili?,以及DeepLearning官方网站Deep Learning by deeplearning.ai | Coursera。该系列课程总共有180多个,我会将学习笔记陆续分享出来,为有兴趣深度学习的同仁提供便利。再次由衷感谢吴恩达老师的精彩讲解和无私奉献!

特别说明:图片来源于吴恩达老师视频截图。

 

 

 

 

 

 

附文本:

 
  在之前的视频,你知道了如何通过向量化同时计算整个训练集预测值a。在这个视频中,你将学会如何向量化计算m个训练数据的梯度。强调一下,是同时计算。在视频的结尾,我们会将之前讲的结合起来向你展示如何得到一个非常高效的logistic回归的实现。
  
  你可能记得讲梯度计算时,我们举了几个例子。〖dz^((1) )=a^((1) )-y〗^((1) ),〖dz^((2) )=a^((2) )-y〗^((2) )等等列举下去,对m个训练数据做同样的运算。我们现在可以定义一个新的变量,dZ=[dz^((1) )  dz^((2) )… dz^((m) ) ],所有dz变量横向排列。dZ将会是一个1×m的矩阵,或者说一个m维的行向量。回忆之前的内容,我们已经描述了如何计算A,即A=[a^((1) )  a^((2) )… a^((m) ) ],我们已经定义了大写字母Y=[y^((1) )  y^((2) )… y^((m) ) ]。基于这些定义,你或许会发现我们可以这样计算dZ=A-Y=[dz^((1) )  dz^((2) )… dz^((m) ) ]=[a^((1) ) 〖-y〗^((1) )  〖 a〗^((2) ) 〖-y〗^((2) )… a^((m) ) 〖-y〗^((m) ) ],第一个元素就是dz^((1) ) ,第二个元素就是dz^((2) ) 。所以仅需要一行代码,你就可以完成这所有的计算。
  在之前的实现中,我们已经去掉了一个for循环,但是我们仍然有一个遍历训练集的循环。我们使用dw=0将dw初始化为0向量,但是我们还有一个遍历训练集的循环,对于第一个样本有〖dw+=x〗^((1) )*dz^((1) ),第二个样本〖dw+=x〗^((2) )*dz^((2) ),我们重复m次,然后dw/=m 。b也类似,db被初始化为0向量,然后〖db+=dz〗^((1) ),〖db+=dz〗^((2) )这样重复到〖db+=dz〗^((m) ),接着db/=m。这就是我们在之前的实现中做的。我们去掉了第一个for循环,至少现在dw是个向量了,然后我们分别更新dw_1, dw_2等。我们去掉了一个for循环,但是还有个for循环遍历训练集,让我们继续下面的操作把它们向量化。
  我们可以这么做,向量化的实现db只需要对这些dz求和,然后除以m,〖db=1/m ∑_(i=1)^m?dz〗^((i) )  ,所有的dz组成了一个行向量,所以在python中你仅需要db=1/m*np.sum(dZ)。你只需要把这个变量dZ=[dz^((1) )  dz^((2) )… dz^((m) ) ]传给np.sum函数,就可以得到db。
  那么dw呢?先写出正确的公式,dw=1/m X〖dZ〗^T。让我们看看为什么是这样如果你明白这个矩阵乘以这个向量会得到什么,这等于  
dw=1/m [■(■(|@x^((1) )@|)&…&■(|@x^((m) )@|))][■(dz^((1) )@…@dz^((m) ) )]=1/m [■(■(■(■(x_1^((1) )@x_2^((1) ) )@■(?@x_(n_x)^((1) ) ))&■(■(x_1^((2) )@x_2^((2) ) )@■(?@x_(n_x)^((2) ) )))&■(…&■(■(x_1^((m) )@x_2^((m) ) )@■(?@x_(n_x)^((m) ) ))))][■(dz^((1) )@…@dz^((m) ) )]=1/m [■(■(x_1^((1) ) dz^((1) )+x_1^((2) ) dz^((2) )+…+x_1^((m) ) dz^((m) )@x_2^((1) ) dz^((1) )+x_2^((2) ) dz^((2) )+…+x_2^((m) ) dz^((m) ) )@■(…@x_(n_x)^((1) ) dz^((1) )+x_(n_x)^((2) ) dz^((2) )+…+x_(n_x)^((m) ) dz^((m) ) ))]=1/m [■(■(∑_(i=1)^m?〖x_1^((i) ) dz^((i)) 〗@∑_(i=1)^m?〖x_2^((i) ) dz^((i)) 〗)@■(…@∑_(i=1)^m?〖x_n^((i) ) dz^((i)) 〗))],也就是你最终得到的,因为dw中包括了这些X^((i) ) dz^((i) ),然后把它们加起来,就是这个矩阵和向量相乘做的,只要一行代码你就可以计算出dw。向量化计算导数的实现,就像下面这样,你用这行计算db,这行代码计算dw。注意我们没有在训练集上使用for循环,现在你可以计算参数的更新。

  现在我们回顾之前所学,看看应该如何实现一个logistic回归。这是我们之前的,没有向量化非常低效的版本。首先是在前一个视频中,我们去掉了〖dw_1+=x_1〗^((i) )*dz^((i) )  〖dw_2+=x_2〗^((i) )*dz^((i) )这一堆,不用循环遍历dw_1、dw_2等。我们已经用一个向量化的代码dw+=x^((i) ) 〖*dz〗^((i) )替换这些。x^((i) )是一个向量,给它乘以dz^((i) )。现在,我们不仅要取消那些循环,还要取消外层的i=1到m个样本的这个for循环。你可以这么做。用前面幻灯片我们得到的Z=w^T X+b,你的代码应该是z=np.dot(w.T,X)+b  ,然后A=sigmoid(Z)  。你已经对所有i完成了这些和这些计算。之前的幻灯片我们知道你还应该计算dZ=A-Y,就对所有i完成了这个计算。最后,dw=1/m X〖dZ〗^T,db=1/m np.sum(dZ),你完成了正向和反向传播,确确实实实现了对所有训练样本进行预测和求导,而且没有使用一个for循环。然后梯度下降更新参数,w=w-∝dw,b=b-∝db。有了这些,我们就实现了logistic回归的梯度下降一次迭代。我说过我们应该尽量不用显示for 循环,但如果希望多次迭代进行梯度下降,那么你仍然需要for循环。如果你要求1000次梯度下降,你或许仍旧需要一个for循环。这个最外面的for循环,我认为应该没有方式把它去掉。不过我觉得实现一次梯度下降迭代而不需要任何for循环还是很爽的。

  你得到了一个高度向量化的非常高效的logistic回归的梯度下降法。这里有一些细则,我想在下个视频中讨论,这里简单提一下,这种技术被称为“广播”。 “广播”也是一种能够使你的python和numpy部分代码更高效的技术。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值