当前位置: 首页 > article >正文

机器学习——向量化

当你实现一个学习算法时,使用向量化将使代码更短,也使其运行更有效,学习如何编写向量化代码,将允许你还利用现代数值线性代数库甚至还有代表图形处理单元的GPU硬件,这是最初为加快计算机图形速度而设计的硬件,但事实证明,当你编写向量化代码时,它可以使用,还可以帮助你更快的执行代码,让我们看一个向量化的具体例子。

下边是一个W和b的具体实例,其中W是一个由三个数的向量,也有一个特征向量x,也有3个数字所以n=3,注意在线性代数中,索引或计数从1开始,所以第一个值是W1和X1。在Python代码中,可以使用如下数组定义这些变量wb和x,实际上使用的是Python中的数值线性代数库numpy,它是迄今为止Python中使用最广泛的数值线性代数库。在机器学习中,因为在Python中,数组的索引或数组中的计数从零开始,你将使用W[0],W[1],所以这里的索引是从0到1,而不是从1到2。类似于访问x的单个特性,你将使用X[0],X[1],包括python在内的许多编程语言从零开始计数,而不是从一开始计数。

现在,让我们看一个没有向量化的实现,用代码计算模型的预测,就会变成取每个参数W,并将其乘以相关联的特性。如果n=3,相反n=100000,对编码和计算机的计算来说都是低效的,所以这里有另一种不使用矢量化的方法。在数学中使用for循环,可以使用求和运算符将w,j和x,j的所有乘积相加,然后再求和的末尾加上b,可以将f初始化为零,那么对于从零到n范围内的j,这实际上使j从0到n-1,最后在for循环之外添加。注意,在python中,0-n的范围意味着j从零开始,一直到n-1,并且不包括n本身,更常见的是,这是用Python编写的范围n,在这里加了一个零,只是为了强调它是从零开始的,虽然这个实现比第一个好一点,它没有实现矢量化,现在效率不是很高。

让我们看看如何使用矢量化来做到这一点,这是函数f的数学表达式,即f(x)=w*x+b,现在可以用一行代码来实现这一点,该式子实现了向量w和x之间的数学点积,最后再加上b在最后,这个函数是点积运算的矢量化实现,在两个向量之间,尤其当n很大的时候,这将比前面的两个代码示例运行的快得多。

矢量化实际上有两个明显的好处,它使代码更短,它还会使代码运行速度比前两个实现中的任何一个都快的多,没有使用矢量化,矢量化实现速度快得多的原因是幕后,Numpy函数能够在计算机中使用并行硬件,无论是在普通计算机上运行这个,这都是正确的,那是在普通的计算机CPU上,或者如果你使用的是GPU一种图形处理器单元,通常用于加速机器学习工作以及Numpy函数使用并行硬件的能力,使其比for循环效率高得多或者我们之前看到的顺序计算。现在这个版本在n很大的时候更实用,因为你没有输入W[0]*X[0]+W[1]*X[1],加上许多额外的术语,就像之前的版本一样,虽然这节省了很多,但这种类型在计算机上仍然没有那么高的效率,因为它仍然没有使用矢量化。

总结一下,向量化使代码更短,所以希望更容易写,更容易阅读,也让它运行的更快

为何向量胡使代码运行的更快

让我们看看这个for循环,像这样没有向量化,所以如果j从0-15,这段代码一个接一个地执行操作,它首先对索引零处的值进行操作,在下一个时间步骤,它计算与索引1相对应的值,以此类推,直到第五步,换句话说,它一步一步的计算这些计算,相比之下,该函数在Numpy中通过向量化在计算机硬件中实现,所以计算机可以得到向量W和X的所有值,一步到位,它将每对W和X 相乘同时并行,计算机接收这16个数字,并使用专门的硬件非常有效地将它们相加,不需要一个一个地进行不同的加法来把这16个数字加起来,这意味着带有向量化的代码与没有向量化的代码可以在更短的时间内执行计算,当你在大型数据集上运行学习算法时,这一点更加重要,或者试图训练大模型,机器学习经常是这样,所以说,这就是为什么能够写向量化,学习算法的实现,一直是让学习算法高效运行的关键一步,因此,很好的扩展到大数据集,很多现代机器学习算法现在必须对其进行操作。

让我们看一个具体的例子,说明如何帮助实现多个线性回归,那就是具有输入特征的线性回归,假设你有16个功能的问题,16个参数(W1—W16),除了参数b,你为这16个权重计算了16个导数项并进行了编码,也许你将w和d的值存储在两个numpy数组中,用d存储导数的值。对于本例,将忽略参数b,现在需要为这16个参数中的每一个计算更新,所以Wj被更新为Wj减去学习速率,在没有向量化的代码中,从1-16对j说0.1*dj。你将执行类似于此更新的操作,在没有向量化的代码中,1*d16,可以使用for循环,就像这样,在0-16范围内的j,又从0-15,与因式分解相反,你可以想象计算机的并行处理硬件是这样的,它取向量w中的所有16个值,并联减去零点一次,向量d中的所有16个值,同时将所有16个计算分配回W,在代码中一步到位,你可以通过以下方式实现这一点,在最后,W被分配给W-0.1*D,计算机把这些数字数组w和d并使用并行处理硬件高效地运行所有16项计算,所以使用矢量化实现,你应该得到一个更有效的线性回归实现,如果你有16个功能,也许速度差异不会很大,但是如果你有成千上万的功能,也许是非常大的训练集,这种类型的矢量化实现将产生巨大的差异,在你的学习算法的运行时间里,这可能是代码在一两分钟内完成的区别,而不是在接下来的可选实验室里花很多很多小时做同样的事情.

可以看到机器学习中最常用的Python库之一的介绍,如何在代码中创建向量,这些向量或数列被称为Numpy数组,也看到了如何取两个向量的点积,使用一个叫做dot的numpy函数,还可以看到向量化代码


http://www.kler.cn/news/354670.html

相关文章:

  • 学习第三十六行
  • 【实战案例】树形字典结构数据的后端解决方案
  • 雷达数据与影像数据直观对比
  • YOLO的更新迭代
  • 基于SpringBoot的企业客户管理系统的设计与实现(论文+源码)_kaic
  • 软件测试CNAS实验室软件维护性测试作业指导书怎么写
  • AI大模型与相对论的结合点的思考、应用及相对论原理与公式表达
  • C++之《剑指offer》学习记录(9):字符串替换空格
  • 3D Slicer 教程五 ---- 基本功能介绍(二)
  • 五款软件神器
  • 萱仔求职复习系列——力扣
  • KafKa 集群【docker compose】
  • 刚刚,ChatGPT推出Windows客户端!
  • 111 - Lecture4
  • 如何保证接口幂等性?
  • C语言 sizeof 的介绍,以及sizeof计算数组名、 数组首地址、数组的元素之间的区别
  • 华为OD题库刷题记录1(掌握的单词个数+手机APP防沉迷+找朋友+流浪地球)
  • 小马识途海外媒体推广有何优势?
  • 关于核心技术工程化、产业化的思考
  • Django操作数据库