{{ title }}
{{ errorMessage }}


{{ errorMessage }}





{{ registerSuccessMessage }}
当前位置: 首页> 技术应用> 正文 
收藏
点赞
投稿
矢量到底有什么特别之处?
来源: 作者:
  2021-12-23   

                                  文章译自Embedded Computing Design

为什么人工智能(AI),特别是神经网络,在这段时间如此受欢迎?

这些算法背后的数学和科学是几十年前开发的,但只是在最近几年,由神经网络驱动的人工智能才开始起飞。那么,到底发生了什么,使神经网络能够成功,而它们在过去却没有成功?

正如通常的情况一样,有一个关键事件催化了任何技术从 "小众 "到 "变革 "的阶段性转变。图形处理单元(GPU)从图形设备到通用计算机器的重新想象,是当前人工智能革命的核心所在。GPU能够加速一组特定的数学运算:向量和矩阵转换。他们给了我们在实际时间内处理信息的能力,但单单是GPU并不能把我们带到这里。人工智能革命之所以发生,是因为在GPU提供动力的同时,还有一个基础设施--互联网和开源开发者社区--促进了成千上万的研究人员和开发者的合作,并创造了今天在人工智能开发中无处不在的工具和库。

如果不是研究人员和开发者的大军创造了抽象出直接为GPU编程的细微差别和困难的库,以GPU为动力的加速神经网络的突破将仍然是小众的。这对于解决广泛的使用案例中所面临的挑战很有效。然而,这些库没有遵循安全关键的开发准则,而这正日益成为许多应用中的基本要求。

当我们看到自主性和依赖于安全、确定性和可靠性的嵌入式行业时,我们发现自己又回到了阶段性过渡的起点。我们有了GPU,有了Khronos集团的Vulkan® SC,我们有了支持安全关键图形和GPU编程计算的API。现在,我们需要在Vulkan SC安全层的基础上建立一个补充性的库,以遵循安全关键准则和标准,使我们从小众走向主流。

CoreAVI推出了ComputeCore,从而启动了这场革命。ComputeCore是CoreAVI对线性代数(BLAS)API的实现。线性代数,特别是向量,是所有AI算法的燃料。今天选择你最喜欢的人工智能引擎。该引擎运行速度快,因为它有一个加速所有向量操作的BLAS库。ComputeCore正是这样做的,但它的实现是为了满足航空电子、汽车和工业市场的功能安全认证标准(DO-178C,A级,ISO 26262 ASIL D,以及IEC61508 SIL 3)。向量和矩阵是人工智能和数据处理的核心。这一点经常被提及,但几乎从未被解释过。让我们来看看。

什么是数据处理?

当我们想到数据处理时,也就是广义上的数据处理,即采取一些信息并以某种方式进行转换,有一种数据结构是任何和所有处理的核心,这就是矢量。矢量到底有什么特别之处?

当我们谈到数据处理时,我们指的是获取信息和修改信息的能力。在某些情况下,我们想改变信息,以便我们能够从中提取知识。这就是机器学习的情况。我们可能会取一张图像,并以一种能够告诉我们场景中存在哪些物体的方式进行转换。我们在计算机视觉中这样做,使自动驾驶汽车成为可能。我们也可以通过模糊图像,或锐化图像,或提取关于场景中结构的边缘信息来转换图像。这些操作是强大的视觉管道中的常见步骤。

数据也可能是非视觉的。考虑一个天气预报系统,我们希望该系统能够预测一年中某一天的最高和最低温度。在这种情况下,系统的输入可能是描述过去十年中某一特定地点每年每一天的温度范围的历史数据样本的集合。在任何情况下,数据样本是一个信息单位。在分析图像时,一个数据样本是一个单一的图像。当分析一个病人的临床病史,试图预测该病人的心脏病风险时,数据样本是一个病人。数据样本是由以某种方式描述样本的一系列特征组成的。在图像的情况下,这些特征是构成图像的像素。在医学病人的情况下,特征是描述该病人的属性:年龄、性别、吸烟习惯、家族中的心脏病史,以及其他与他们的临床病史有关的信息。当我们把每个数据样本看成是一个特征的集合时,这种观点与向量的概念非常吻合。

将数据样本转换为矢量

我们如何将图像和病人转换为向量?对于图像,我们将每个像素的颜色解释为一个数值,并构建一个像素值的列表。例如,一张宽度为2个像素、高度为2个像素的图像将产生一个有4个数值的向量,可能看起来像这样。[10,0,245,50],其中每个值代表该像素的颜色强度。高分辨率的图像会产生更高维度的向量,例如,256x256像素的图像会产生65,536个值的向量。

患者信息也可以通过用数字编码每个特征的含义来进行矢量化,例如1=男性,0=女性,1=家族中有心脏病史,0=没有心脏病,等等。将数据样本转换为矢量在两个非常重要的方面是有用的:它有助于以一种易于与每个样本相关联的方式来封装一个特征列表;其次,从几何角度解释矢量可以揭示数据集中的样本如何相互关联的信息。例如,假设我们想创建一个算法,可以学习区分汽车和行人的图像。我们首先将我们的图像解释为矢量。从几何学上讲,一个向量可以被认为是空间中的一个箭头,从我们坐标系的原点出发,穿过空间,到达由每个维度的向量值定义的点,见图1。


图1. 该图说明了卡特尔坐标系中的三维矢量V1。矢量是以原点为起点,以其3个分量定义的点为终点的线:X、Y、Z。

虽然我们不能直观地表示三维以上维度的向量,但在数学上我们仍然可以用同样的方程来操作它们。让向量如此特别的是,当我们从几何学角度解释它们时,指向类似方向的向量具有类似的属性。例如,当我们把汽车和行人的图像解释为某个多维空间(称为超空间)中的向量时,虽然我们不能直观地看到该向量所指向的方向,但我们可以计算出它,我们可以比较属于汽车图像的向量和属于行人图像的向量。事实证明,汽车图像的向量大致指向同一方向,而行人图像的向量则指向与其他行人图像相似的方向,但远离汽车向量。

要创建一个能够学会自动区分汽车和行人的算法,意味着要用数学方法处理这些向量,以了解它们所指向的方向,并找到将汽车和行人向量所在的空间一分为二的线--或超平面。一旦我们找到了这个超平面,算法就可以对一个全新的图像进行分类,只需知道它的矢量落在线的哪一边,是有所有汽车矢量的那一边,还是有所有行人矢量的那一边。

这就是为什么人工智能算法最终都要进行大量的向量运算。这是因为输入数据通常被表示为矢量,因为这样做在几何学上是有利的。另一个在人工智能中经常使用的数据结构是矩阵。这其中的原因不应该让人感到惊讶。矢量是一个值的集合。矩阵只是一个向量的集合,一个一个地堆叠在一起。在某些情况下,将向量组合成矩阵是很有用的,这样我们就可以同时处理一组向量--例如一组输入样本。

计算工具--是什么,为什么,以及如何计算

在这一点上,我们已经确定了人工智能中对向量和矩阵的需求。现在我们需要一种方法来快速执行这些计算。

当我们想到自动化时--例如,汽车在繁忙的高速公路上无人驾驶,或者机器人在仓库或工厂中与人类一起工作--我们想到的是系统的实时执行,以及实时后果。当一辆自动驾驶的汽车未能在足够的时间内检测到一个行人以避免碰撞时,人工智能算法本身可能不是错误的根源。事实上,该算法可能已经正确地检测到一个行人,但检测可能只是花了几毫秒的时间。这个例子有助于说明几件事。首先,这些系统需要尽可能快地执行矢量和矩阵数学运算。

第二,在安全关键应用中,这些操作需要在一个确定的时间内发生。也就是说,我们需要能够计算出执行算法的最坏情况下的执行时间,这样我们就可以确定在每个可预见的情况下,系统是否有足够的时间对执行该算法的结果作出反应。如果躲避障碍物的机会之窗已经过去,那么探测到障碍物就没有什么用处了。

为了解决这些问题,应用程序和解决方案开发人员需要两件事。首先,他们需要一个能够加速向量和矩阵运算的工具。对于非安全关键用例,有大量的工具和框架可以从开源社区免费获得。这些包括像Tensorflow、Pytorch、Caffe和Scikit-learn这样的框架。

所有这些框架和库都依赖于一个被称为BLAS库的关键组件,如上所述,它提供了一组函数来加速向量和矩阵操作。不幸的是,这些框架没有按照功能安全标准实施。现在需要的是,行业内产生一套积木式工具和框架,按照安全关键标准和实践来构建。这些框架必须包括保证确定性执行的GPU驱动实现。它们必须包括加速核心数学运算的工具--例如BLAS API的安全关键实施。这些工具和框架必须为计算机视觉和图像处理的基本预处理和后处理任务提供安全关键(确定性)的解决方案,同时也要为一般的机器学习任务提供安全关键(确定性)的解决方案,这些任务有助于强大的人工智能管道中的每个决策过程。换句话说,该行业必须提供与非安全关键性市场中存在的相同的解决方案,并达到相同的复杂程度,同时解决严重受限环境中的确定性和资源管理的困难问题。

加速

到目前为止,我们已经讨论了处理向量和矩阵的需要,并以确定性的方式进行处理。我们还说过,为了快速完成这些操作,我们需要一个可以进行加速的工具。我们所说的加速是什么意思?

通常,当我们想到软件的执行时,我们认为CPU是执行编程指令的终端设备。系统中的大部分软件都在CPU上运行。事实上,我们可以用C语言实现BLAS,并在CPU上执行计算。这种方法的好处是,嵌入式领域的大多数程序员--实时设备、汽车、机器人--都熟悉C语言编程,而且有标准的C语言开发安全关键软件的实践。

这种方法的缺点是,CPU在快速执行顺序操作方面很出色,但它在并行化工作方面并不出色。不幸的是,大多数人工智能算法的向量和矩阵的操作任务被称为 "令人尴尬的并行问题"。因此,在能够并行执行这些计算的机器上执行这些计算符合我们的最佳利益,而不是按顺序执行。

结论

过去的十年对人工智能来说是伟大的。研究界和开源工程界产生了大量的工具,为当今许多非安全关键产品提供动力。像亚马逊的Alexa或谷歌的家庭助理这样的产品是由最先进的自然语言处理(NLP)算法驱动的。

对这些算法的突破性研究是由一个工具生态系统实现的,它使工程师和科学家能够相对容易地开发和训练复杂的神经网络,并加速GPU设备上的操作。这些工具包括神经网络框架,如TensorFlow和PyTorch,统计和数据分析工具,如Python科学库scikit-learn,以及高性能计算框架,如CUDA®和SYCL™。

像OpenCV这样的图像处理库通过为常用的算法和技术提供内置功能,使工程师的生活更加轻松。事实上,这些可用的框架是如此成功和无处不在,以至于当我们进入安全关键领域时,许多人还没有意识到,在确定性和安全问题上,这些工具是不可用的。但是,正如研究界使用的工具生态不仅仅是CUDA或OpenCL™一样,安全关键型产业也需要建立一个安全关键型工具和框架的生态系统。

BLAS和FFT的安全关键性实现是朝着正确方向迈出的一步,但我们需要我们的合作伙伴和整个嵌入式和自主社区帮助定义工具和安全关键性API,这将为未来的所有可靠设备提供动力。开源社区已经展示了可以实现的目标,并为我们的产品和想法提供了一个很好的原型平台,但我们知道Python库并不是确定性地执行的。自主性意味着责任。负责任的系统必须是安全和可靠的。行业越早意识到这一点,我们就能越早离开沙盒,建立一个基于严格的安全标准和准则的基础设施,以促进安全自主性的大规模部署。



分享到:
  点赞
  收藏
  打印
评论(0
已输入0
最新文章