在上一篇文章中,我们学习了多样本的梯度下降,但是它有一个弊端,就是在编码过程中会使用到循环语句,这个显然不是我们希望见到的,因为做深度学习要处理的数据数量级都很大,采用循环会浪费很多时间,使我们的开发受到了阻碍,而使用向量化就可以解决这个问题,可能从字面上感觉不到向量化要比循环耗时短,下面我们使用numpy来计算下:
import numpy as np
import time
a=np.random.rand(100000)
b=np.random.rand(100000)
start=time.time()
c=np.dot(a,b)
end=time.time()
print('向量化使用的时间为:'+str(1000*(end-start))+'ms')
start=time.time()
for i in range(100000):
c=a*b
end=time.time()
print('循环使用的时间为:'+str(1000*(end-start))+'ms')
结果如下:
可以看出,采用向量化后运行的时间要远远小于使用循环的时间,所以学习向量化是非常有必要的。
所以我们将用向量来处理多个样本,Let‘s Go!
之前没有向量化的时候,对于多个样本的前向传播,我们会这样写:
而使用了向量化之后,两个式子解决:
下面来进行说明:
Z是一个向量,用来存储每一个样本计算出的z,即
X是一个矩阵,用来存储每一个样本的输入x,即
A是一个向量,用来存储每一个样本的z经过激活函数后的得到的a,即
假设有m个样本,每一个样本有两个特征,即,所以X就会使一个矩阵,即,其中上标代表第i个样本,下表代表第i个特征。
我们来计算一下维度,其中X的维度为2*m,Z的维度为1*m,根据矩阵乘法则的维度为2*1,b的维度为1*m,A的维度和Z的维度是一样的。
我们来验算一下:
经过验算维度完全正确,说明我们前向传播向量化成功了。
接下来我们看一下反向传播:
之前没有向量化的时候,对于多个样本的反向传播,我们会这样写:
而有了向量化之后,我们就可以这样写:
这里的dZ、dW、db的维度和Z、W、b的维度是一样的,我们来看一下:
,这里A是1*m,而Y也是1*m,所以dZ的维度也是1*m,和Z的维度一样。
,这里X是2*m,是m*1,所以dW的维度为2*1和W的维度一样。
,这里dZ是1*m,则db也是1*m,和b的维度一样。
然后在进行参数更新就行啦:
最后给大家贴下吴恩达老师的视频中的一张图:
如果您觉得文章对你有帮助,点个关注不迷路~
以上就是本文的全部内容,获取深度学习资料以及课程,扫描下方公众号,回复“资料”两字即可获取,祝您学习愉快。