各位如果看到博客内有广告,可以动手点一点,谢谢

MENU

More Examples of Vectorization

March 29, 2019 • Read: 302 • Deep Learning

当我们在写神经网络程序,或者在写逻辑($logistic$)回归时,应该避免写循环(loop)语句。虽然有时循环是不可避免的,但是我们可以使用比如numpy的内置函数或者其他办法去计算

让我们看另外一个例子。如果你想计算向量$u=Av$,矩阵乘法的定义为$u_i=\sum_jA_{ij}v_i$

首先使用非向量化实现,$u=np.zeros(n,1)$,并且通过两层循环$for(i):for(j)$得到$u[i]=u[i]+A[i][j]\times v[j]$

向量化方式就可以用$u=np.dot(A,v)$

下面通过另一个例子继续了解向量化。如果你已经有一个向量$v$,并且想要对向量$v$的每个元素做指数操作,得到向量$u=[e^{v_1},e^{v_2},...,e^{v_n}]^T$,对于非向量化方式,首先初始化向量$u=np.zeros(n,1)$,并且通过循环依次计算每个函数;向量化的做法是执行$u=np.exp(v)$

事实上,numpy库有很多向量函数,比如np.log(v)计算每个元素的对数,np.abs(v)计算每个元素的绝对值,np.maximum(v)计算元素的最大值,也可以写成np.maximum(v,0)计算所有元素和0相比的最大值,v**2计算v中每个元素的平方,1/v计算v中元素的倒数。所以当你想写循环时候,检查numpy是否存在类似的内置函数,从而避免使用循环(loop)方式

将刚才所学到的内容,运用在逻辑回归的梯度下降上,看看我们是否能简化两个计算过程中的某一步

上图是逻辑回归的求导代码,有两层循环,分别是最外层的1 to m,还有内层隐含的一个for i = i to 2 dwi,因为这里只有$d\omega_1$和$d\omega_2$两个变量,因此没有写循环,但实际上,如果$\omega$很多,这里是必须要有循环的。

我们现在来消除内层循环,因此第一行我们就不需要初始化$d\omega_1$和$d\omega_2$,重新定义一个$n_x$行的一维向量$d\omega = np.zeros(n_x,1)$。那么下面的循环操作也可以改为向量操作$d\omega +=x^{(i)}dz^{(i)}$,最后一行改成$d\omega\ /= m$

Archives Tip
QR Code for this page
Tipping QR Code
Leave a Comment