吴恩达深度学习课程学习笔记 第二周 神经网络基础(下)

【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的求导
  • \large \sigma (z)=\frac{1}{1+e^{-z}}   
  • 反向步骤eg:先L对a求导,再a对z求导,则dz就等于dz=\frac{dL}{da}*\frac{da}{dz}。 

       计算dw1,dw2等,同理。

  •    \large \alpha为学习率,右下角蓝色字体:新的w=w - 学习率\large \alpha * 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:

左侧:非向量化,

右侧:向量化,用命令 z=np.dot(w,x)+b 计算 w^{T}x+b

”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的乘积

u_{i1}=A_{ij}v_{j1}

左侧:非向量化版本,对指标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循环变成dw+=x^{(i)}dz^{(i)}

3.最后一行写成dw/=m。

 这样就完成了从两个for循环到一个for循环的简化~

程序还剩第一个循环:对单独训练样本的循环。

【2.13 向量化logistic回归】

向量化实现在logistic回归中,以同时处理整个训练集,来实现梯度下降法的一步迭代,针对整个训练集,不需要使用任何显式for loop。

logistic回归的正向传播步骤:需要对m个样本都计算出预测结果

定义矩阵X(nx,m)作为训练输入,

利用一个步骤,一行代码就可以计算z(1),z(2),z(3)…:

构建一个1*m的矩阵,即行向量Z=[z^{(1)} z^{(2)} \cdots z^{(m)}]

 ,w的维度是(nx,1)

 则[z^{(1)} z^{(2)} \cdots z^{(m)}]=w^{T}X+[b b\cdots b ]

\therefore Z=np.dot(w.T,x)+b Pyhon可以自动将b扩展为一个(1,m)的矩阵,称为广播

 计算a(1),a(2),a(3)…同理:

【2.14 向量化logistic回归的梯度输出】

 利用向量化高效计算反向传播, 利用向量化同时计算m个训练数据的梯度

eg:

对m个样本dz^{(m)}=a^{(m)}-y^{(m)}进行同样的计算

注:

左侧,定义新的变量dZ,已知A,Y,得dZ

         dw=0将dw初始化为0向量,累加,和除以m。db同理。

右侧,db,dw在python中的写法(红框中的为代码):

       将变量传给np.sum函数就可以得到db。dw为矩阵与向量相乘。

与之前低效的两个显式for循环的计算过程的对比:

注:

右侧:没有用for loop就完成了正向和反向传播 ,实现了对所有样本的预测和求导。

右下角两行:对参数w和b的更新,“:”为赋值符号。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值