营销型网站主页定制,wordpress 自定义结构 分类,设计类比赛网站,网页浏览器包括Vectorization
深度学习算法中#xff0c;数据量很大#xff0c;在程序中尽量减少使用loop循环语句#xff0c;而可以使用向量运算来提高程序运行速度。
向量化(Vectorization)就是利用矩阵运算的思想#xff0c;大大提高运算速度。例如下面所示在Python中使用向量化要比使…
Vectorization
深度学习算法中数据量很大在程序中尽量减少使用loop循环语句而可以使用向量运算来提高程序运行速度。
向量化(Vectorization)就是利用矩阵运算的思想大大提高运算速度。例如下面所示在Python中使用向量化要比使用循环计算速度快得多。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21import 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(for loop: str(1000*(toc-tic)) ms)
输出结果类似于1
2
3
4250286.989866
Vectorized version:1.5027523040771484ms
250286.989866
For loop:474.29513931274414ms
从程序运行结果上来看该例子使用for循环运行时间是使用向量运算运行时间的约300倍。因此深度学习算法中使用向量化矩阵运算的效率要高得多。
为了加快深度学习神经网络运算速度可以使用比CPU运算能力更强大的GPU。事实上GPU和CPU都有并行指令(parallelization instructions),称为Single Instruction Multiple Data(SIMD)。SIMD是单指令多数据流能够复制多个操作数并把它们打包在大型寄存器的一组指令集。SIMD能够大大提高程序运行速度例如python的numpy库中的内建函数(build-in function) 就是使用了SIMD指令。相比而言GPU的SIMD要比CPU更强大一些。
More Vectorization Examples
尽量避免使用for循环而使用向量化矩阵运算。在python的numpy库中我们通常使用np.dot()函数来进行矩阵运算。
我们将向量化的思想使用在逻辑回归算法尽可能减少for循环而只使用矩阵运算。值得注意的是算法最顶层的迭代训练的for循环是不能替换的。而每次迭代过程对Jdwb的计算是可以直接使用矩阵运算。
Vectorizing Logistic Regression
整个训练样本构成的输入矩阵X的维度是$(n_X,1)$,b是一个常数值而整个训练忘本构成的输出矩阵Y的维度是(1,m)。利用向量化的思想所有m个样本的线性输出Z可以用矩阵表示
在python的numpy库中可以表示为1
2Z np.dot(w.T,X) b
A sigmoid(Z)
其中wT表示w的转置
这样我们就能够使用向量化矩阵运算代替for循环对所有m个样本同时运算大大提高了运算速度。
Vectorizing Logistic Regression’s Gradient Output
再来看逻辑回归中的梯度下降算法如何转化为向量化的矩阵形式。对于所有m个样本db可表示为
db可表示为
对应的程序为1db1/m*np.sum(dZ)
dw课表示为
对应的程序为1dw1/m*np.dot(X,dZ,T)
这样我们把整个逻辑回归中的for循环尽可能用矩阵运算代替对于单次迭代梯度下降算法流程如下所示1
2
3
4
5
6
7
8Znp.dot(w.T,X)b
A sigmoid(Z)
dZ A-Y
dw 1/m*np.dot(X,dZ.T)
db 1/m*np.sum(dZ)
w w - alpha*dw
b b - alpha*db
其中alpha是学习因子决定w和b的更新速度。上述代码只是单次训练更新而言的外层还需要一个for循环代表迭代次数。
Broadcasting in Python
下面介绍使用python的另一种技巧广播(Broadcasting).python中的广播机制可以由下面四条表示
·让所有输入数组都向其中shape最长的数组看齐shape中不足的部分都通过在前面加1补齐
·输出数组的shape是输入数组shape的各轴上的最大值
·如果输入数组的某个轴和输出数组的对应轴的长度相同或者其长度为1时这个数组能够用来计算否则出错
·当输入数组的某个轴的长度为1时沿着此轴运算时都用此轴上的第一组值
简而言之就是用python中可以对不同维度的矩阵进行四则混合运算但至少保证有一个维度是相同的。下面给出几个广播的例子具体细节可参阅python的相关手册这里就不赘述了。
在python程序中为了保证矩阵运算正确可以使用reshape()函数来对矩阵设定所需的维度。这是一个很好且有用的习惯。
A note on python/numpy vectors
总结一些python的小技巧避免不必要的code bug
python中如果我们用下列语句来定义一个变量1a np.random.randn(5)
这条语句生成的a维度是(5, )。它既不是行向量也不是列向量我们把a叫做rank 1 array。这种定义会带来一些问题。例如我们对a进行转置还会得到a本身。所以如果我们要定义(5,1)的列向量最好使以下标准语句避免使用rank 1 array。1
2a np.random.randn(5,1)
b np.random.randn(1,5)
除此之外我们还可以使用assert语句对向量或者数组的维度进行判断例如1assert(a.shape (5,1))
assert语句会对内嵌语句进行判断即判断a的维度是不是(5,1)的。如果不是则程序在此处停止。使用assert语句也是一种很好的习惯能够帮我们及时检查、发现语句是否正确。
另外还可以使用reshape函数对数组设定所需的维度1a.shape((5,1))
Quick tour of Jupyter/iPython Notebooks
Jupyter notebook是一个交互笔记本支持运行40中编程语言本课程所有的编程练习题都将在Jupyter notebook上进行使用语言是python。
Explanation of logistic regression cost function(optional)
接下来简要介绍逻辑回归的Cost function是怎么来的
首先预测输出$hat{y}$的表达式可以写成:
其中$sigma(z)frac{1}{1exp(-z)}$。$hat{y}$可以看成是预测输出为正类(1)的概率
那么当y1时
当y 0时
我们把上面两个式子整合到一个式子中得到
由于log函数的单调性可以对上式P(y|x)进行log处理
我们希望上述概率P(y|x)越大越好对上式加上负号则转化成额单个样本的Loss function越小越好也iu得到了我们之前介绍的逻辑回归的Loss function形式
如果对于所有m个训练样本假设样本之间是独立同分布的(iid),我们希望总的概率越大越好
同样引入log函数加上负号将上式转化为Cost function
上式中$frac{1}{m}$表示对所有m个样本的Cost function求平均是缩放因子。
Summary
本节课我们主要介绍了神经网络基础————python和向量话。在深度学习程序中使用向量化和矩阵运算的方法能够大大提高运行速度节省时间。以逻辑回归威力我们将算法流程包括梯度下降转化为向量化的形式同时我们也介绍了python的相关编程方法和技巧。