神经网络与深度学习笔记 (三)python和向量化

10 篇文章 2 订阅
9 篇文章 0 订阅

摘要:本文主要包含向量化、向量化logistic回归、向量化logistic回归的梯度输出、Python中的广播、Python_numpy向量注意点、Jupyter Ipython笔记本使用介绍和logistic损失函数解释等神经网络的基础知识。

1.向量化

深度学习算法中,数据量很大,在程序中应该尽量减少使用loop循环语句,而可以使用向量运算来提高程序运行速度。

向量化(Vectorization)就是利用矩阵运算的思想,大大提高运算速度。例如下面所示在Python中使用向量化要比使用循环计算速度快得多。

下面举个例子:
在这里插入图片描述

import numpy as np
import time

a = np.random.rand(1000000)
b = np.random.rand(1000000)

#使用向量方法
st = time.time()
c = np.dot(a,b)
et = time.time()

print(c)
print("向量计算所用时间:"+str(1000*(et-st))+"ms")
print("======================================")
#使用loop方法
c = 0
st = time.time()
for i in range(1000000):
    c+=a[i]*b[i]
et = time.time()
print(c)
print("for循环所用时间:"+str(1000*(et-st))+"ms")

从程序运行结果上来看,该例子使用for循环运行时间是使用向量运算运行时间的约300倍。因此,深度学习算法中,使用向量化矩阵运算的效率要高得多。

为了加快深度学习神经网络运算速度,可以使用比CPU运算能力更强大的GPU。事实上,GPU和CPU都有并行指令(parallelization instructions),称为Single Instruction Multiple Data(SIMD)。SIMD是单指令多数据流,能够复制多个操作数,并把它们打包在大型寄存器的一组指令集。SIMD能够大大提高程序运行速度,例如python的numpy库中的内建函数(built-in function)就是使用了SIMD指令。相比而言,GPU的SIMD要比CPU更强大一些。

在python的numpy库中,我们通常使用np.dot()函数来进行矩阵运算

2.向量化在logistic回归中使用

我们将向量化的思想使用在逻辑回归算法上,尽可能减少for循环,而只使用矩阵运算。值得注意的是,算法最顶层的迭代训练的for循环是不能替换的。而每次迭代过程对J,dw,b的计算是可以直接使用矩阵运算。

在神经网络与深度学习笔记 (二)中我们介绍过,整个训练样本构成的输入矩阵X的维度是(nx,m),权重矩阵w的维度是(nx,1),b是一个常数值,而整个训练样本构成的输出矩阵Y的维度为(1,m)。利用向量化的思想,所有m个样本的线性输出Z可以用矩阵表示:
在这里插入图片描述
在python的numpy库中可以表示为:
在这里插入图片描述
其中,w.T表示w的转置。

这样,我们就能够使用向量化矩阵运算代替for循环,对所有m个样本同时运算,大大提高了运算速度。

3.向量化在logistic回归的梯度下降算法中的使用

逻辑回归中的梯度下降算法如何转化为向量化的矩阵形式?对于所有m个样本,dZ的维度是(1,m),可表示为:
在这里插入图片描述
db可表示为:
在这里插入图片描述
注:上面两个公式忘记或没看懂,可看我前面写的的神经网络与深度学习笔记 (二) 第6.1、6.2节。
对应的程序代码为:
在这里插入图片描述
dw可表示为:
在这里插入图片描述
这个公式是由dw的求法推导出的,看视频的2.14节就能明白,这样写是为了后面好用python来计算,即是向量化使用。
对应的程序代码为:
在这里插入图片描述
这样,我们把整个逻辑回归中的for循环尽可能用矩阵运算代替,对于单次迭代,梯度下降算法流程如下所示:
在这里插入图片描述
其中,alpha是学习因子,决定w和b的更新速度。上述代码只是对单次训练更新而言的,外层还需要一个for循环,表示迭代次数。

4.Python中的广播

下面介绍使用python的另一种技巧:广播(Broadcasting)。python中的广播机制可由下面四条表示:
1.让所有输入数组都向其中shape最长的数组看齐,shape中不足的部分都通过在前面加1补齐
2.输出数组的shape是输入数组shape的各个轴上的最大值
3.如果输入数组的某个轴和输出数组的对应轴的长度相同或者其长度为1时,这个数组能够用来计算,否则出错
4.当输入数组的某个轴的长度为1时,沿着此轴运算时都用此轴上的第一组值

简而言之,就是python中可以对不同维度的矩阵进行四则混合运算,**但至少保证有一个维度是相同的。**下面给出几个广播的例子,具体细节可参阅python的相关手册,这里就不赘述了。
在这里插入图片描述
值得一提的是,在python程序中为了保证矩阵运算正确,可以使用reshape()函数来对矩阵设定所需的维度。这是一个很好且有用的习惯。

5.Python_numpy向量注意点

接下来我们将总结一些python的小技巧,避免不必要的code bug。

python中,如果我们用下列语句来定义一个向量:

a = np.random.randn(5)

这条语句生成的a的维度是(5,)。它既不是行向量也不是列向量,我们把a叫做rank 1 array。这种定义会带来一些问题。例如我们对a进行转置,还是会得到a本身。所以,如果我们要定义(5,1)的列向量或者(1,5)的行向量,最好使用下来标准语句,避免使用rank 1 array。

a = np.random.randn(5,1)
b = np.random.randn(1,5)

除此之外,我们还可以使用assert语句对向量或数组的维度进行判断,例如:

assert( a.shape == (5,1))

assert会对内嵌语句进行判断,即判断a的维度是不是(5,1)的。如果不是,则程序在此处停止。使用assert语句也是一种很好的习惯,能够帮助我们及时检查、发现语句是否正确。

另外,还可以使用reshape函数对数组设定所需的维度:

a.reshape((5,1))

6.Jupyter Ipython笔记本

Jupyter notebook(又称IPython notebook)是一个交互式的笔记本,支持运行超过40种编程语言。本课程所有的编程练习题都将在Jupyter notebook上进行,使用的语言是python。

7.logistic损失函数是如何得到的

在上一个笔记二中,我总结的时候就提到这个问题还没写,现在在这里写一下;有兴趣的可以了解一下;接下来我们将简要解释这个Cost function是怎么来的。

首先,预测输出y^的表达式可以写成:
在这里插入图片描述
那么,当y=1时:
在这里插入图片描述
当y=0时:
在这里插入图片描述
我们把上面两个式子整合到一个式子中,得到:
在这里插入图片描述
由于log函数的单调性,可以对上式P(y|x)进行log处理:
在这里插入图片描述
我们希望上述概率P(y|x)越大越好,对上式加上负号,则转化成了单个样本的Loss function,越小越好,也就得到了我们之前介绍的逻辑回归的Loss function形式。
在这里插入图片描述
如果对于所有m个训练样本,假设样本之间是独立同分布的(iid),我们希望总的概率越大越好:
在这里插入图片描述
同样引入log函数,加上负号,将上式转化为Cost function:
在这里插入图片描述
上式中,1/m表示对所有m个样本的Cost function求平均,是缩放因子。

8.全文总结

本文主要介绍了神经网络基础——python和向量化。在深度学习程序中,使用向量化和矩阵运算的方法能够大大提高运行速度,节省时间。以逻辑回归为例,我们将其算法流程包括梯度下降转换为向量化的形式。同时,我们也介绍了python的相关编程方法和技巧。

这节的难点有两个:一个是理解向量化在logistic回归的梯度下降算法中的使用;二是logistic损失函数是如何得到的。

参考资料:
1.吴恩达《神经网络与深度学习》中英文视频字幕。
2.deeplearning.ai项目《机器学习训练秘籍》。
3.Al有道微信公众号。

转载请注明出处:
CSND链接:https://editor.csdn.net/md?articleId=106633139

往期文章推荐:
神经网络与深度学习笔记(一)适合刚入门的小白
神经网络与深度学习笔记(二)神经网络基础

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yue200403

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值