2.14 向量化 Logistic 回归的梯度输出-深度学习-Stanford吴恩达教授


←上一篇↓↑下一篇→
2.13 向量化 Logistic 回归回到目录2.15 Python 中的广播

向量化 Logistic 回归的梯度输出 (Vectorizing Logistic Regression’s Gradient Computation)

注:本节中大写字母代表向量,小写字母代表元素

如何向量化计算的同时,对整个训练集预测结果 a a a ,这是我们之前已经讨论过的内容。在本次视频中我们将学习如何向量化地计算 m m m 个训练数据的梯度,本次视频的重点是如何同时计算 m m m 个数据的梯度,并且实现一个非常高效的逻辑回归算法(Logistic Regression)。

之前我们在讲梯度计算的时候,列举过几个例子, d z ( 1 ) = a ( 1 ) − y ( 1 ) dz^{(1)}=a^{(1)}-y^{(1)} dz(1)=a(1)y(1) d z ( 2 ) = a ( 2 ) − y ( 2 ) dz^{(2)}=a^{(2)}-y^{(2)} dz(2)=a(2)y(2) ……等等一系列类似公式。现在,对 m m m 个训练数据做同样的运算,我们可以定义一个新的变量 d Z = [ d z ( 1 ) , d z ( 2 ) , ⋯   , d z ( m ) ] dZ=[dz^{(1)},dz^{(2)},\cdots,dz^{(m)}] dZ=[dz(1),dz(2),,dz(m)] ,所有的 d z dz dz 变量横向排列,因此, d Z dZ dZ 是一个 1 ∗ m 1*m 1m 的矩阵,或者说,一个 m m m 维行向量。在之前的幻灯片中,我们已经知道如何计算 A A A ,即 [ a ( 1 ) , a ( 2 ) , ⋯   , a ( m ) ] [a^{(1)},a^{(2)},\cdots,a^{(m)}] [a(1),a(2),,a(m)],我们需要找到这样的一个行向量 Y = [ y ( 1 ) , y ( 2 ) , ⋯   , y ( m ) ] Y=[y^{(1)},y^{(2)},\cdots,y^{(m)}] Y=[y(1),y(2),,y(m)] ,由此,我们可以这样计算 d Z = A − Y = [ a ( 1 ) − y ( 1 ) , a ( 2 ) − y ( 2 ) , ⋯   , a ( m ) − y ( m ) ] dZ=A-Y=[a^{(1)}-y^{(1)},a^{(2)}-y^{(2)},\cdots,a^{(m)}-y^{(m)}] dZ=AY=[a(1)y(1),a(2)y(2),,a(m)y(m)] ,不难发现第一个元素就是 d z ( 1 ) dz^{(1)} dz(1) ,第二个元素就是 d z ( 2 ) dz^{(2)} dz(2) ……所以我们现在仅需一行代码,就可以同时完成这所有的计算。

在之前的实现中,我们已经去掉了一个for循环,但我们仍有一个遍历训练集的循环,如下所示:

d w = 0 dw=0 dw=0 d w + = x ( 1 ) ∗ d z ( 1 ) dw+=x^{(1)}*dz^{(1)} dw+=x(1)dz(1) d w + = x ( 2 ) ∗ d z ( 2 ) dw+=x^{(2)}*dz^{(2)} dw+=x(2)dz(2) ⋮ \vdots d w + = x ( m ) ∗ d z ( m ) dw+=x^{(m)}*dz^{(m)} dw+=x(m)dz(m) d w = d w m dw=\frac{dw}m dw=mdw d b = 0 db=0 db=0 d b + = d z ( 1 ) db+=dz^{(1)} db+=dz(1) d b + = d z ( 2 ) db+=dz^{(2)} db+=dz(2) ⋮ \vdots d b + = d z ( m ) db+=dz^{(m)} db+=dz(m) d b + = d b m db+=\frac{db}m db+=mdb

上述(伪)代码就是我们在之前实现中做的,我们已经去掉了一个for循环,但用上述方法计算 d w dw dw 仍然需要一个循环遍历训练集,我们现在要做的就是将其向量化!

首先我们来看 d b db db ,不难发现 d b = 1 m ∑ i = 1 m d z ( i ) db=\frac1m\sum_{i=1}^mdz^{(i)} db=m1i=1mdz(i) , 之前的讲解中,我们知道所有的 d z ( i ) dz^{(i)} dz(i) 已经组成一个行向量 d Z dZ dZ 了,所以在Python中,我们很容易地想到 d b = 1 m ∗ n p . s u m ( d Z ) db=\frac1m*np.sum(dZ) db=m1np.sum(dZ) ;接下来看 d w dw dw ,我们先写出它的公式 d w = 1 m ∗ X ∗ d z T dw=\frac1m*X*dz^T dw=m1XdzT 其中, X X X 是一个行向量。因此展开后 d w = 1 m ∗ ( x ( 1 ) d z ( 1 ) + x ( 2 ) d z ( 2 ) + ⋯ + x ( m ) d z ( m ) ) dw=\frac1m*(x^{(1)}dz^{(1)}+x^{(2)}dz^{(2)}+\cdots+x^{(m)}dz^{(m)}) dw=m1(x(1)dz(1)+x(2)dz(2)++x(m)dz(m)) 。因此我们可以仅用两行代码进行计算: d b = 1 m ∗ n p . s u m ( d Z ) db=\frac1m*np.sum(dZ) db=m1np.sum(dZ) d w = 1 m ∗ X ∗ d z T dw=\frac1m*X*dz^T dw=m1XdzT 。这样,我们就避免了在训练集上使用for循环。

现在,让我们回顾一下,看看我们之前怎么实现的逻辑回归,可以发现,没有向量化是非常低效的,如下图所示代码:

在这里插入图片描述

我们的目标是不使用for循环,而是向量,我们可以这么做:

Z = w T X + b = n p . d o t ( w . T , x ) + b Z=w^TX+b=np.dot(w.T,x)+b Z=wTX+b=np.dot(w.T,x)+b A = σ ( Z ) A=\sigma(Z) A=σ(Z) d Z = A − Y dZ=A-Y dZ=AY d w = 1 m ∗ X ∗ d z T dw=\frac1m*X*dz^T dw=m1XdzT d b = 1 m ∗ n p . s u m ( d Z ) db=\frac1m*np.sum(dZ) db=m1np.sum(dZ) w : = w − α ∗ d w w:=w-\alpha*dw w:=wαdw b : = b − α ∗ d b b:=b-\alpha*db b:=bαdb

现在我们利用前五个公式完成了前向和后向传播,也实现了对所有训练样本进行预测和求导,再利用后两个公式,梯度下降更新参数。我们的目的是不使用for循环,所以我们就通过一次迭代实现一次梯度下降,但如果你希望多次迭代进行梯度下降,那么仍然需要for循环,放在最外层。不过我们还是觉得一次迭代就进行一次梯度下降,避免使用任何循环比较舒服一些。

最后,我们得到了一个高度向量化的、非常高效的逻辑回归的梯度下降算法,我们将在下次视频中讨论Python中的Broadcasting技术。

课程PPT

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


←上一篇↓↑下一篇→
2.13 向量化 Logistic 回归回到目录2.15 Python 中的广播

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zhao-Jichao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值