【2.8 计算图的导数计算】
偏导数 链式法则
eg:J对v的求导就是完成了一步反向传播
v比原来增加0.001时,J比原来增加0.003,是v增量的三倍
【2.9 logistic回归中的梯度下降法】
计算偏导数来实现logistic回归中的梯度下降法
-
单个训练样本的logistic回归中的梯度下降法:
logistic回归的公式:
logistic回归中单个样本的导数计算图计算(偏导数流程图):
设样本只有两个x1和x2,为了计算z,需输入w1,w2,b。变换w,b的值,使L函数最小
注:
- 代码中的写法:“da”表示函数最终因变量(即L)对a的求导
- 反向步骤eg:先L对a求导,再a对z求导,则dz就等于。
计算dw1,dw2等,同理。
- 为学习率,右下角蓝色字体:新的w=w - 学习率 * J的导数
【2.10 m个样本的梯度下降】
-
m个训练样本的logistic回归中的梯度下降法:
1.首先,初始化各值;
2.使用for循环遍历训练集;
*注:设只有两个特征,n=2,
用dw1,dw2,db作为累加器,求整个训练集上该值的和
计算得到的四个值分别除以m得到平均值
3.更新参数:
*注: 利用一步梯度下降,更新w1,w2,b
- 缺点:显式地使用for循环,算法低效
两个for loop:
1.遍历m个训练样本的循环(m次);
2.遍历所有特征的循环(n次)。
所以要用向量化。
【2.10 向量化】
使用内置函数,消除代码中显式for循环语句
利用矩阵运算提高运算速度
对比eg:
左侧:非向量化,
右侧:向量化,用命令 计算
”in range“表示输入域的当前值处于允许范围内
使用向量化要比使用循环计算速度快得多。
eg:
import 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")
注:随机创建百万维度的数组,记录时间。
上半段为向量化版本,下半段为for loop版本.用这两种方法同时计算c,
输出结果:
表明如果用循环会慢大约300倍。所以深度学习算法中,使用向量化矩阵运算的效率要高得多。
可扩展深度学习实在GPU上做的, GPU:图像处理单元
CPU和GPU都有并行化的指令,eg:SIMD指令
SIMD指令(Single Instruction Multiple Data):单指令多数据流,能够大大提高程序运行速度。例如python的numpy库中,使用了内置函数(例如np.dot),能够充分利用并行化去更快计算。GPU的SIMD要比CPU的性能更好一些。
【2.12 向量化的更多例子】
eg1:向量u为矩阵A和另一个向量v的乘积
左侧:非向量化版本,对指标i,j进行双重for循环
右侧:利用np.dot实现向量化
eg2:
内存里已有一个向量v,指数运算作用到向量v中的每个元素
左 非向量化:首先,u初始化为全0向量,然后用for loop。
右 向量化:调用u=np.exp(v),v作为输入向量,u作为输出向量,只需要一行代码
Ps:内置函数
np.log(v) 逐个元素计算log
np.abs(v) 逐个计算绝对值
np.maximum(v,0) 计算v中所有元素和0相比的最大值
v**2 计算v中每个元素的平方
1/v 计算v中每个元素的倒数
向量法利用到logistic回归中的梯度下降法:
下图为计算logistic回归导数的程序,它有两个for循环(见2.10)
现在通过向量法去掉第二个for循环(绿色的框框和笔迹):
1.令dw=np.zeros((n_x,1));
2.第二个for循环变成;
3.最后一行写成dw/=m。
这样就完成了从两个for循环到一个for循环的简化~
程序还剩第一个循环:对单独训练样本的循环。
【2.13 向量化logistic回归】
向量化实现在logistic回归中,以同时处理整个训练集,来实现梯度下降法的一步迭代,针对整个训练集,不需要使用任何显式for loop。
logistic回归的正向传播步骤:需要对m个样本都计算出预测结果
定义矩阵X(nx,m)作为训练输入,
利用一个步骤,一行代码就可以计算z(1),z(2),z(3)…:
构建一个1*m的矩阵,即行向量
又 ,w的维度是(nx,1)
则
Pyhon可以自动将b扩展为一个(1,m)的矩阵,称为广播
计算a(1),a(2),a(3)…同理:
【2.14 向量化logistic回归的梯度输出】
利用向量化高效计算反向传播, 利用向量化同时计算m个训练数据的梯度
eg:
对m个样本进行同样的计算
注:
左侧,定义新的变量dZ,已知A,Y,得dZ
dw=0将dw初始化为0向量,累加,和除以m。db同理。
右侧,db,dw在python中的写法(红框中的为代码):
将变量传给np.sum函数就可以得到db。dw为矩阵与向量相乘。
与之前低效的两个显式for循环的计算过程的对比:
注:
右侧:没有用for loop就完成了正向和反向传播 ,实现了对所有样本的预测和求导。
右下角两行:对参数w和b的更新,“:”为赋值符号。