欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 人工智能 > pytorch >内容正文

pytorch

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

发布时间:2025/4/5 pytorch 48 豆豆
生活随笔 收集整理的这篇文章主要介绍了 2.14 向量化 Logistic 回归的梯度输出-深度学习-Stanford吴恩达教授 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

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

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

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

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

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

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

dw=0dw=0dw=0dw+=x(1)∗dz(1)dw+=x^{(1)}*dz^{(1)}dw+=x(1)dz(1)dw+=x(2)∗dz(2)dw+=x^{(2)}*dz^{(2)}dw+=x(2)dz(2)⋮\vdotsdw+=x(m)∗dz(m)dw+=x^{(m)}*dz^{(m)}dw+=x(m)dz(m)dw=dwmdw=\frac{dw}mdw=mdwdb=0db=0db=0db+=dz(1)db+=dz^{(1)}db+=dz(1)db+=dz(2)db+=dz^{(2)}db+=dz(2)⋮\vdotsdb+=dz(m)db+=dz^{(m)}db+=dz(m)db+=dbmdb+=\frac{db}mdb+=mdb

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

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

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

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

Z=wTX+b=np.dot(w.T,x)+bZ=w^TX+b=np.dot(w.T,x)+bZ=wTX+b=np.dot(w.T,x)+bA=σ(Z)A=\sigma(Z)A=σ(Z)dZ=A−YdZ=A-YdZ=AYdw=1m∗X∗dzTdw=\frac1m*X*dz^Tdw=m1XdzTdb=1m∗np.sum(dZ)db=\frac1m*np.sum(dZ)db=m1np.sum(dZ)w:=w−α∗dww:=w-\alpha*dww:=wαdwb:=b−α∗dbb:=b-\alpha*dbb:=bαdb

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

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

课程PPT




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

总结

以上是生活随笔为你收集整理的2.14 向量化 Logistic 回归的梯度输出-深度学习-Stanford吴恩达教授的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。