什么是向量化,为什么引入向量化。
以logistic线性回归为例,
z=wTx+b
z
=
w
T
x
+
b
w=[w1、w2,,,wn]
w
=
[
w
1
、
w
2
,
,
,
w
n
]
x=[x1、x2,,,xn]
x
=
[
x
1
、
x
2
,
,
,
x
n
]
非向量化实现:
z=0
z
=
0
for i in range(n):
z+=w[i]∗x[i]
z
+
=
w
[
i
]
∗
x
[
i
]
z+=b
z
+
=
b
向量化实现:
z=np.dot(w,x)+b
z
=
n
p
.
d
o
t
(
w
,
x
)
+
b
以上两个程序分别对
z=wTx+b
z
=
w
T
x
+
b
进行实现,非向量化采用for循环,而向量化则完全的隐藏了for循环,因为,在深度学习中,要去训练大量的数据,要是采用for循环,将会把训练时间拉伸的很长,这对于深度学习来说并不是那么理想。
因此,采用向量化的原因就是避免for循环的使用,在以后的日常编程当中,要尽可能做到以内函数来替代for循环,这样,我们的程序将会快很多。
那如何使用内函数避免for循环的使用,这里将会用到一个python的内置库-numpy,这个库十分强大,几乎就是为了数学计算而产生的,我们几乎能用到的数学公式都可以从numpy中找到并使用,避免了for循环,极大的缩短程序运行时间。
# -*- coding: utf-8 -*-
import numpy as np
import time
a = np.random.rand(1000000)
b = np.random.rand(1000000)
tic = time.time()
c = np.dot(a,b)
toc = time.time()
print(c)
print('vectorized version:'+str(1000*(toc-tic))+'ms')
c = 0
tic = time.time()
for i in range(1000000):
c += a[i]*b[i]
toc = time.time()
print(c)
print('vectorized version:'+str(1000*(toc-tic))+'ms')
可以看出来,向量化比for循环的时间要缩短将近100倍的时间,这在深度学习中将是非常重要的,可以大幅度缩短训练时间。
看下面的例子:
J=0,dw1=0,dw2=0,db=0
J
=
0
,
d
w
1
=
0
,
d
w
2
=
0
,
d
b
=
0
for i = 1 to n:
z(i)=wTx(i)+b
z
(
i
)
=
w
T
x
(
i
)
+
b
a(i)=σ(z(i))
a
(
i
)
=
σ
(
z
(
i
)
)
J+=−[y(i)logy^(i)+(1−y(i))log(1−y^(i))]
J
+
=
−
[
y
(
i
)
l
o
g
y
^
(
i
)
+
(
1
−
y
(
i
)
)
l
o
g
(
1
−
y
^
(
i
)
)
]
dz(i)=a(i)(1−a(i))
d
z
(
i
)
=
a
(
i
)
(
1
−
a
(
i
)
)
dw1+=x(i)1dz(i)
d
w
1
+
=
x
1
(
i
)
d
z
(
i
)
dw2+=x(i)2dz(i)
d
w
2
+
=
x
2
(
i
)
d
z
(
i
)
db+=dz(i)
d
b
+
=
d
z
(
i
)
J=J/m,dw1=dw1/m,dw2=dw2/m,db=db/m
J
=
J
/
m
,
d
w
1
=
d
w
1
/
m
,
d
w
2
=
d
w
2
/
m
,
d
b
=
d
b
/
m
向量化之后的式子为:
J=0,dw=np.zeros((nx,1)),db=0
J
=
0
,
d
w
=
n
p
.
z
e
r
o
s
(
(
n
x
,
1
)
)
,
d
b
=
0
for i = 1 to n:
z(i)=wTx(i)+b
z
(
i
)
=
w
T
x
(
i
)
+
b
a(i)=σ(z(i))
a
(
i
)
=
σ
(
z
(
i
)
)
J+=−[y(i)logy^(i)+(1−y(i))log(1−y^(i))]
J
+
=
−
[
y
(
i
)
l
o
g
y
^
(
i
)
+
(
1
−
y
(
i
)
)
l
o
g
(
1
−
y
^
(
i
)
)
]
dz(i)=a(i)(1−a(i))
d
z
(
i
)
=
a
(
i
)
(
1
−
a
(
i
)
)
dw+=x(i)dz(i)
d
w
+
=
x
(
i
)
d
z
(
i
)
db+=dz(i)
d
b
+
=
d
z
(
i
)
J=J/m,dw=dw/m,db=db/m
J
=
J
/
m
,
d
w
=
d
w
/
m
,
d
b
=
d
b
/
m
numpy中有许多可以用作数学计算公式的方法,譬如:
np.exp(v)求每一个值的指数
np.log(v)求每一个值得log值等等