吴恩达视频-第一门课第2周2.14节-向量化 logistic 回归的梯度输出(Vectorizing Logistic Regression‘s Gradient)

2.14 向量化 logistic 回归的梯度输出(Vectorizing Logistic Regression’s Gradient)
  如何向量化计算的同时,对整个训练集预测结果𝑎,这是我们之前已经讨论过的内容。在本次视频中我们将学习如何向量化地计算𝑚个训练数据的梯度,本次视频的重点是如何同时计算 𝑚 个数据的梯度,并且实现一个非常高效的逻辑回归算法(Logistic Regression)。
  之前我们在讲梯度计算的时候,列举过几个例子, d z ( 1 ) d{{z}^{(1)}} dz(1) = a ( 1 ) {{a}^{(1)}} a(1) y ( 1 ) {{y}^{(1)}} y(1) d z ( 2 ) d{{z}^{(2)}} dz(2)= a ( 2 ) {{a}^{(2)}} a(2) y ( 2 ) {{y}^{(2)}} y(2) ……等等一系列类似公式。现在,对 𝑚个训练数据做同样的运算,我们可以定义一个新的变量 𝑑𝑍 = [ d z ( 1 ) d{{z}^{(1)}} dz(1), d z ( 2 ) d{{z}^{(2)}} dz(2). . . d z ( m ) d{{z}^{(m)}} dz(m)] ,所有的 𝑑𝑧 变量横向排列,因此,𝑑𝑍 是一个 1 × 𝑚的矩阵,或者说,一个 𝑚 维行向量。在之前的幻灯片中,我们已经知道如何计算𝐴,即[ a ( 1 ) {{a}^{(1)}} a(1), a ( 2 ) {{a}^{(2)}} a(2). . . a ( m ) {{a}^{(m)}} a(m)],我们需要找到这样的一个行向量 𝑌 = [ y ( 1 ) y ( 2 ) . . . y ( m ) {{y}^{(1)}}{{y}^{(2)}}...{{y}^{(m)}} y(1)y(2)...y(m)] ,由此,我们可以这样计算𝑑𝑍 = 𝐴 − 𝑌 = [ a ( 1 ) − y ( 1 ) a ( 2 ) − y ( 2 ) . . . a ( m ) − y ( m ) {{a}^{(1)}}-{{y}^{(1)}}{{a}^{(2)}}-{{y}^{(2)}}...{{a}^{(m)}}-{{y}^{(m)}} a(1)y(1)a(2)y(2)...a(m)y(m)],不难发现第一个元素就是 d z ( 1 ) d{{z}^{(1)}} dz(1),第二个元素就是 d z ( 2 ) d{{z}^{(2)}} dz(2) ……所以我们现在仅需一行代码,就可以同时完成这所有的计算。
  在之前的实现中,我们已经去掉了一个 for 循环,但我们仍有一个遍历训练集的循环,如下所示:
在这里插入图片描述
  上述(伪)代码就是我们在之前实现中做的,我们已经去掉了一个 for 循环,但用上述方法计算 𝑑𝑤 仍然需要一个循环遍历训练集,我们现在要做的就是将其向量化!
  首先我们来看 𝑑𝑏,不难发现 𝑑𝑏 = 1 m ∑ i = 1 m d z ( i ) \frac{1}{m}\sum\nolimits_{i=1}^{m}{d{{z}^{(i)}}} m1i=1mdz(i), 之前的讲解中,我们知道所有的 d z ( i ) d{{z}^{(i)}} dz(i)已经组成一个行向量 𝑑𝑍了,所以在 Python 中,我们很容易地想到𝑑𝑏 = 1 m \frac{1}{m} m1∗ 𝑛𝑝. 𝑠𝑢𝑚(𝑑𝑍);接下来看𝑑𝑤,我们先写出它的公式 𝑑𝑤 = 1 m \frac{1}{m} m1∗ 𝑋 ∗ d z T d{{z}^{T}} dzT 其中,𝑋 是一个行向量。因此展开后𝑑𝑤 = 1 m \frac{1}{m} m1∗ ( x ( 1 ) d z ( 1 ) {{x}^{(1)}}d{{z}^{(1)}} x(1)dz(1) x ( 2 ) d z ( 2 ) {{x}^{(2)}}d{{z}^{(2)}} x()dz()+...+ x m d z m {{x}^{m}}d{{z}^{m}} xmdzm)。因此我们可以仅用两行代码进行计算:𝑑𝑏 = 1 m \frac{1}{m} m1∗ 𝑛𝑝. 𝑠𝑢𝑚(𝑑𝑍), 𝑑𝑤 = 1 m \frac{1}{m} m1∗ 𝑋 ∗ d z T d{{z}^{T}} dzT。这样,我们就避免了在训练集上使用 for 循环。
  现在,让我们回顾一下,看看我们之前怎么实现的逻辑回归,可以发现,没有向量化是非常低效的,如下图所示代码:
在这里插入图片描述
  我们的目标是不使用 for 循环,而是向量,我们可以这么做:
在这里插入图片描述
  现在我们利用前五个公式完成了前向和后向传播,也实现了对所有训练样本进行预测和求导,再利用后两个公式,梯度下降更新参数。我们的目的是不使用 for 循环,所以我们就通过一次迭代实现一次梯度下降,但如果你希望多次迭代进行梯度下降,那么仍然需要 for循环,放在最外层。不过我们还是觉得一次迭代就进行一次梯度下降,避免使用任何循环比较舒服一些。
  最后,我们得到了一个高度向量化的、非常高效的逻辑回归的梯度下降算法,我们将在下次视频中讨论 Python 中的 Broadcasting 技术。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

越努力越幸运@

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

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

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

打赏作者

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

抵扣说明:

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

余额充值