ng-深度学习-课程笔记-3: Python和向量化(Week2)

1 向量化( Vectorization )python

在逻辑回归中,以计算z为例,$ z =  w^{T}+b $,你能够用for循环来实现。数组

可是在python中z能够调用numpy的方法,直接一句$z = np.dot(w,x) + b$用向量化完成,并且你会发现这个很是快。网络

ng作了个实验,求两个100万长的一维向量的內积,用向量化花了1.5毫秒,而用for循环计算花了400多毫秒。函数

因此日常记得用向量化,必定要避免使用for循环,你的代码会快不少。3d

CPU和GPU都有并行化的指令,有时候叫SIMD( single instruction multiple data )。调试

若是你使用了这样的内置函数,好比np.function,python的numpy能充分利用并行化去更快的计算。blog

 

2 更多向量化的例子( More Vectorization Examples )ip

平时要避免使用for循环,善用python的numpy库中的内置函数。文档

好比矩阵A和向量v的內积,能够用np.dot。对一列向量v实施指数运算,能够用np.exp,还有各类np.log,np.abs,np.maxmum( v, 0)等等。io

对于 v**2, 1/v这样的操做也要考虑用np里的函数。

 

3 向量化逻辑回归( Vectorizing Logistic Regression )

对于逻辑回归的导数计算也应该使用向量化,彻底不用for循环。图中给出了向量化的过程。

Z的计算的向量化形式是$z = np.dot(w.T,x) + b$,其中b在这里是一个实数,python在向量和实数相加时,会自动把实数变成一个相同维度的向量再相加。

 其中w是n * 1的列向量,w.T是1 * n的列向量,X是n * m的矩阵,结果就是1 * m的向量,最后加上1 * m的b向量,获得1 * m的Z。最后经过sigmoid获得预测值A。

 

同时还能够利用向量化计算m个数据的梯度,注意是同时计算。下图左边是for循环的实现,右边是向量化的实现。

这里dz是代价函数对z变量的导数,以前推导过等于预测值减去实际值a - y。

dw是代价函数对w的导数,db是代价函数对b的导数,若是不记得了能够翻看上一节课,逻辑回归的内容。

虽然要尽可能使用向量化,可是在进行屡次梯度降低的迭代仍是要用到for循环,这个不可避免。

 

4 python中的广播( python broadcasting)

当你用一个向量加上一个数的时候,python会自动把这个数变成向量再一一相加。

当你用一个m*n的矩阵加(减乘除)上1*n的向量时,python会自动把1*n的向量竖直复制变成m*n再相加。

当你用一个m*n的矩阵加上m*1的向量时,python会自动把m*1的向量水平复制变成m*n再相加。

这是实现神经网络时主要用到的广播,更详细的能够查看numpy文档搜索broadcasting。

对于numpy中的一些用法须要了解,能够帮助你更高效地用矩阵运算来提高程序效率,ng在本节还举了求百分比的例子。

$A.sum(axis=0)$表明竖直求和,若是axis = 1就是水平求和。

 

5 python / numpy中的向量说明( A note on python/numpy vectors )

numpy和广播使咱们能够用一行代码完成不少运算。

但有时可能会引入很是细微的错误,很是奇怪的bug,若是你不熟悉全部的复杂的广播运做方式。

好比你以为一个行向量和列向量相加应该会报错,可是并不会,并且也不是简单的一一相加。

python这些奇怪的效果有其内在逻辑,若是不熟悉python,你可能会写出奇怪的难以调试的bug。

ng的建议,在实现神经网络的时候不要使用shape为(n,)这样的变量,要用(n,1)。

好比a 的 shape是(5, ) ,当你计算$np.dot(a, a.T)$的时候获得的是一个实数,a和a的转置,它们的shape都是(5, )。

若是a 的 shape是(5, 1),你计算$np.dot(a, a.T)$的时候获得的就是一个5*5的矩阵。a的shape是( 5, 1),而a.T的shape是( 1, 5 )。

a.shape = (5, )这是一个秩为1的数组,不是行向量也不是列向量。不少学生出现难以调试的bug都来自秩为1数组。

另外你在代码中作了不少事情后可能不记得或者不肯定a是怎样的时候,用$assert( a.shape == (5,1) )$来检查你的矩阵的维度。

若是你获得了(5,) 你能够把它reshape成(5, 1)或(1, 5),reshape是很快的O(1)复杂度,因此放心大胆的用它,不用担忧。

相关文章
相关标签/搜索