向量化

有这么一件事情,比如说在梯度下降过程中我们需要不断地调整θ的值来完成梯度下降,可是使用循环会很慢,因为我们现在的计算机大部分都是SIMD也就是单指令流多数据流。如果使用for循环的话,那么之一条指令的数据流就是for循环里所规定的,并没有进行并行运算,没有充分运用计算机资源。然而,在深度学习(deeplearning)里,我们常常需要进行很多的梯度下降,等等之类需要循环的,使用显式的循环会让运算速度十分的缓慢。

想要充分的利用计算机的并行性,我们要学会使用向量化。在Python的numpy模块,向量化得到了充分的展现,下面是一个例子。

import time
import numpy as np

a=np.random.rand(1000000)#产生一个有1000000个数的随机矩阵
b=np.random.rand(1000000)
#这部分使用的是向量化
tic=time.time()
c=np.dot(a,b)
toc=time.time()

print(c)
print("向量化:"+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("循环:"+str(1000*(toc-tic))+"ms")

这个代码得结果是这样的

两个计算的结果是差不多的,但是向量化充分利用了cpu进行并行化运算,几乎没有用多少时间,循环却用了400毫秒。

所以我们一定要学会使用向量。

原文地址:https://www.cnblogs.com/fromzore/p/10128054.html