天天看点

吴恩达深度学习 —— 2.14 向量化逻辑回归的梯度输出

这一节将学习如果向量化计算m个训练数据的梯度,强调一下,是同时计算。

前面已经说过,在逻辑回归中,有 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),以此类推,一直有 d z ( m ) = a ( m ) − y ( m ) dz^{(m)}=a^{(m)}-y^{(m)} dz(m)=a(m)−y(m)。设 d z = [ d z ( 1 ) , d z ( 2 ) , . . . , d z ( m ) ] dz=[dz^{(1)},dz^{(2)},...,dz^{(m)}] dz=[dz(1),dz(2),...,dz(m)] A = [ a ( 1 ) , a ( 2 ) , . . . , a ( m ) ] A=[a^{(1)},a^{(2)},...,a^{(m)}] A=[a(1),a(2),...,a(m)] Y = [ y ( 1 ) , y ( 2 ) , . . . , y ( m ) ] Y=[y^{(1)},y^{(2)},...,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)},...,a^{(m)}-y^{(m)}] dz=A−Y=[a(1)−y(1),a(2)−y(2),...,a(m)−y(m)]所以仅需要一行代码,就可以同时完成这所有的计算。在之前的实现中,我们已经去掉了一个for循环,但是仍然有一个遍历训练集的循环,我们使用 d w = 0 dw=0 dw=0将 d w dw 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),重复m次,最后取均值得到 d w / = m dw/=m dw/=m。同理,b也类似。

d b db db被初始化为0向量,然后 d b + = d z ( 1 ) db+=dz^{(1)} db+=dz(1), d b + = d z ( 2 ) db+=dz^{(2)} db+=dz(2),一直重复到 d b + = d z ( m ) db+=dz^{(m)} db+=dz(m),最后取均值得到 d b / = m db/=m db/=m。

我们去掉了一个for循环,现在 d w dw dw是一个向量了。但还有一个for循环遍历训练集,我们继续下面的操作把它们向量化。

向量化的实现, d b db db只需要对 d z dz dz求和,然后除于m,有 d b = 1 m ∑ i = 1 m d z ( i ) = 1 m n p . s u m ( d Z ) db=\frac{1}{m}\sum_{i=1}^mdz^{(i)}=\frac{1}{m}np.sum(dZ) db=m1​i=1∑m​dz(i)=m1​np.sum(dZ)对于 d w dw dw,有 d w = 1 m ∗ X ∗ d Z T = 1 m [ x ( 1 ) d z ( 1 ) + x ( 2 ) d z ( 2 ) + . . . + x ( m ) d z ( m ) ] dw=\frac{1}{m}*X*dZ^T=\frac{1}{m}[x^{(1)}dz^{(1)}+x^{(2)}dz^{(2)}+...+x^{(m)}dz^{(m)}] dw=m1​∗X∗dZT=m1​[x(1)dz(1)+x(2)dz(2)+...+x(m)dz(m)]

吴恩达深度学习 —— 2.14 向量化逻辑回归的梯度输出

现在我们回顾之前所学,没有向量化效率非常低,通过向量化,将上图中的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(wT,=X)+b A = σ ( Z ) A=\sigma(Z) A=σ(Z) d Z = A − Y dZ=A-Y dZ=A−Y d w = 1 m X d Z T dw=\frac{1}{m}XdZ^T dw=m1​XdZT d b = 1 m n p . s u m ( d Z ) db=\frac{1}{m}np.sum(dZ) db=m1​np.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循环。

继续阅读