这一节将学习如果向量化计算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=m1i=1∑mdz(i)=m1np.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)]
现在我们回顾之前所学,没有向量化效率非常低,通过向量化,将上图中的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=m1XdZT
d
b
=
1
m
n
p
.
s
u
m
(
d
Z
)
db=\frac{1}{m}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循环。