# python 与向量化
# 1. 向量化
借助 numpy
等库的内部函数使用向量化,实现了 SIMD
并行计算,能够充分利用 CPU
和 GPU
的能力。
# CPU 与 GPU
还有一种方式也可以更加快速的计算,就是GPU,它可以实现更好的并行操作,从而加快计算速度。(以下部分简单了解即可)
CPU是一个有多种功能的优秀领导者。它的优点在于调度、管理、协调能力强,计算能力则位于其次。而GPU相当于一个接受CPU调度的“拥有大量计算能力”的员工。
当需要对大数据bigdata做同样的事情时,GPU更合适,当需要对同一数据做很多事情时,CPU正好合适。
GPU能做什么?关于图形方面的以及大型矩阵运算,如机器学习算法等方面,GPU就能大显身手。
简而言之,CPU擅长统领全局等复杂操作,GPU擅长对大数据进行简单重复操作。CPU是从事复杂脑力劳动的教援,而GPU是进行大量并行计算的体力劳动者 。
# 代码实现
import numpy as np
a = np.random.rand(1000000)
b = np.random.rand(1000000)
# 使用向量化
c = np.dot(a, b)
# 使用 for 循环
c = 0
for i in range(1000000):
c += a[i] * b[i]
2
3
4
5
6
7
8
9
10
11
12
# 2. 逻辑回归中的向量化
# 矩阵运算的相关基础
矩阵乘法:
# 变量的形状定义
表示特征数量, 表示样本数量 表示一个单独的样本 是一个 维特征向量 是一个标量,表示 0 或 1
表示参数 W,维度为- b 表示偏置量,为一个实数
- 向量化
表示样本矩阵,其维度为 表示标签矩阵,维度为
# 前向传播
所谓前向传播,即是通过样本特征和参数值计算预测值。
对于单个样本,计算公式为:
为了得到所有训练样本的预测值,势必要使用 for i in range(m)
的显式循环。使用向量化可以避免这一循环操作:
其中,W.shape = (nx, 1)
,X.shape = (nx, m)
,np.dot(W.T, X).shape = (1, m)
,向量与实数相加用到了 numpy 中的向量广播特性,最终得到的
得到的向量 Z 通过 sigmoid 函数进行激活,得到最终结果:
# 后向传播
后向传播的目的是为了更新参数值。首先计算各参数相对于成本函数的偏导数,然后将其与学习率相乘,最后更新参数:
对于单个样本:
对于参数的更新:
参数更新:
# 迭代
通过前向传播加后向传播的方式,我们完成了参数的一次更新,当然学习一次是远远不够用的。为了完成多次学习迭代,还是需要使用显式的 for 循环来实现:
# 初始化 W,b
# 假设学习 3000 次
for i in range(3000):
# 前向传播
# 后向传播
# 更新参数
2
3
4
5
6
7
# 向量的广播
广播的原则:
# 关于向量维度的一些最佳实践
由于广播机制,python 代码可能出现尽管运行成功,结果却在预期之外的情况。为了避免这些问题,有必要保持一些良好的习惯:
- 不要使用秩为 1 的向量
- 经常使用 np.reshape() 来确保向量形状符合需要
- 使用 assert(a.shape == (5, 1)) 来断言向量形状