吴恩达深度学习笔记(13)-多样本梯度下降和向量化处理多批次数据

吴恩达深度学习笔记(13)-多样本梯度下降和向量化处理多批次数据m个样本的梯度下降在之前的笔记中,已经讲述了如何计算导数,以及应用梯度下降在逻辑回归的一个训练样本上。

大家好,欢迎来到IT知识分享网。

m 个样本的梯度下降(Gradient Descent on m Examples)

在之前的笔记中,已经讲述了如何计算导数,以及应用梯度下降在逻辑回归的一个训练样本上。现在我们想要把它应用在m个训练样本上。

吴恩达深度学习笔记(13)-多样本梯度下降和向量化处理多批次数据

首先,让我们时刻记住有关于损失函数就J(w,b) 的定义。

吴恩达深度学习笔记(13)-多样本梯度下降和向量化处理多批次数据

当你的算法输出关于样本y 的 a(i), a(i)是训练样本的预测值,即:

吴恩达深度学习笔记(13)-多样本梯度下降和向量化处理多批次数据

所以我们在前面展示的是对于任意单个训练样本,如何计算微分当你只有一个训练样本。

因此dw_1,dw_2和db 添上上标i表示你求得的相应的值。

如果你面对的是我们在之前演示的那种情况,但只使用了一个训练样本(x^(i),y^(i)) 。

现在你知道带有求和的全局代价函数,实际上是1到m项各个损失的平均。

所以它表明全局代价函数对w1的微分,w1的微分也同样是各项损失对w1微分的平均。

吴恩达深度学习笔记(13)-多样本梯度下降和向量化处理多批次数据

但之前我们已经演示了如何计算这项,即之前幻灯中演示的如何对单个训练样本进行计算。

所以你真正需要做的是计算这些微分,如我们在之前的训练样本上做的。并且求平均,这会给你全局梯度值,你能够把它直接应用到梯度下降算法中。

所以这里有很多细节,但让我们把这些装进一个具体的算法。同时你需要一起应用的就是逻辑回归和梯度下降。

我们初始化 J=0,dw_1=0,dw_2=0,db=0

代码流程:

 J=0;dw1=0;dw2=0;db=0; for i = 1 to m z(i) = wx(i)+b a(i) = sigmoid(z(i)) J += -[y(i)log(a(i))+(1-y(i))log(1-a(i)) dz(i) = a(i)-y(i) dw1 += x1(i)dz(i) dw2 += x2(i)dz(i) db += dz(i) J/= m dw1/= m dw2/= m db/= m w=w-alpha*dw b=b-alpha*db 

笔记上只应用了一步梯度下降。因此你需要重复以上内容很多次,以应用多次梯度下降。看起来这些细节似乎很复杂,但目前不要担心太多。

但这种计算中有两个缺点,也就是说应用此方法在逻辑回归上你需要编写两个for循环

第一个for循环是一个小循环遍历m个训练样本,

第二个for循环是一个遍历所有特征的for循环。

这个例子中我们只有2个特征,所以n等于2并且n_x 等于2。 但如果你有更多特征,你开始编写你的因此dw_1,dw_2,你有相似的计算从dw_3一直下去到dw_n。所以看来你需要一个for循环遍历所有n个特征

当你应用深度学习算法,你会发现在代码中显式地使用for循环使你的算法很低效,同时在深度学习领域会有越来越大的数据集。所以能够应用你的算法且没有显式的for循环会是重要的,并且会帮助你适用于更大的数据集。所以这里有一些叫做向量化技术,它可以允许你的代码摆脱这些显式的for循环。

我想在先于深度学习的时代,也就是深度学习兴起之前,向量化是很棒的。

可以使你有时候加速你的运算,但有时候也未必能够。

但是在深度学习时代向量化,摆脱for循环已经变得相当重要。

因为我们越来越多地训练非常大的数据集,因此你真的需要你的代码变得非常高效。

所以在接下来的几个笔记中,我们会谈到向量化,以及如何应用向量化而连一个for循环都不使用。

所以学习了这些,我希望你有关于如何应用逻辑回归,或是用于逻辑回归的梯度下降,事情会变得更加清晰。

向量化(Vectorization)

向量化是非常基础的去除代码中for循环的艺术,在深度学习安全领域、深度学习实践中,你会经常发现自己训练大数据集,因为深度学习算法处理大数据集效果很棒,所以你的代码运行速度非常重要,否则如果在大数据集上,你的代码可能花费很长时间去运行,你将要等待非常长的时间去得到结果。所以在深度学习领域,运行向量化是一个关键的技巧,让我们举个栗子说明什么是向量化。

在逻辑回归中你需要去计算z=w^T x+b,w、x都是列向量。如果你有很多的特征那么就会有一个非常大的向量,所以w∈R^(n_x ) , x∈R^(n_x ),所以如果你想使用非向量化方法去计算w^T x,你需要用如下方式(python)

z=0 for i in range(n_x) z+=w[i]*x[i] z+=b 

这是一个非向量化的实现,你会发现这真的很慢,作为一个对比,向量化实现将会非常直接计算w^T x,代码如下(其中使用了numpy函数,这个有点重要,需要记得哦!):

z=np.dot(w,x)+b 

这是向量化计算w^T x的方法,你将会发现这个非常快

吴恩达深度学习笔记(13)-多样本梯度下降和向量化处理多批次数据

让我们用一个小例子说明一下(以下为在Jupyter notebook上写的Python代码):

import numpy as np #导入numpy库 a = np.array([1,2,3,4]) #创建一个数据a print(a) # [1 2 3 4] import time #导入时间库 a = np.random.rand() b = np.random.rand() #通过round随机得到两个一百万维度的数组 tic = time.time() #现在测量一下当前时间 #向量化的版本 c = np.dot(a,b) toc = time.time() print(“Vectorized version:” + str(1000*(toc-tic)) +ms”) #打印一下向量化的版本的时间 #继续增加非向量化的版本 c = 0 tic = time.time() for i in range(): c += a[i]*b[i] toc = time.time() print(c) print(“For loop:” + str(1000*(toc-tic)) + “ms”)#打印for循环的版本的时间 

返回值见图。

吴恩达深度学习笔记(13)-多样本梯度下降和向量化处理多批次数据

在两个方法中,向量化和非向量化计算了相同的值,如你所见,

向量化版本花费了1.5毫秒,非向量化版本的for循环花费了大约几乎500毫秒,非向量化版本多花费了300倍时间

所以在这个例子中,仅仅是向量化你的代码,就会运行300倍快。这意味着如果向量化方法需要花费一分钟去运行的数据,for循环将会花费5个小时去运行。

一句话总结,以上都是再说和for循环相比,向量化可以快速得到结果。

你可能听过很多类似如下的话,“大规模的深度学习使用了GPU或者图像处理单元实现”,但是以上做的案例都是在jupyter notebook上面实现,这里只有CPU,CPU和GPU都有并行化的指令,他们有时候会叫做SIMD指令,这个代表了一个单独指令多维数据,这个的基础意义是,如果你使用了built-in函数,像np.function或者并不要求你实现循环的函数,它可以让python的充分利用并行化计算,这是事实在GPU和CPU上面计算,GPU更加擅长SIMD计算,但是CPU事实上也不是太差,可能没有GPU那么擅长吧。

接下来的笔记中,你将看到向量化怎么能够加速你的代码,经验法则是,无论什么时候,避免使用明确的for循环。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/85188.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信