今天很多现有的深度学习系统都是基于张量代数(tensor algebra)而设计的,但是张量代数不仅仅只能用于深度学习。
什么是张量
张量有很多种定义的方式,这里只讨论人工智能领域里的概念。
在人工智能领域,定义比较简单,TensorFlow是这么定义的:
简单翻译过来就是:张量是多维数组,目的是把向量、矩阵推向更高的维度。
标量、向量、矩阵、张量的关系
这4个概念是维度不断上升的,我们用点线面体的概念来比喻解释会更加容易理解:
点——标量(scalar) 线——向量(vector) 面——矩阵(matrix) 体——张量(tensor)
kdnuggets的Twitter里也有一个很形象的表示:
关键的线性代数
- 运算在计算机上使用的最基础的线性代数运算是两个向量的点积(dot product)。这种点积仅仅是两个向量中相关元素的乘积和。
- 一个矩阵和一个向量的积可以被视为该矩阵和向量行(row)的点积。
- 两个矩阵的乘积可以被视为一个矩阵和另一个矩阵的每一列(column)进行的矩阵-向量乘积的和
- 再配上用一个值对所有元素进行逐一的加法和乘法,我们可以构造出所需要的线性代数运算机器。
计算机之所以可凭极快速度求出用线性代数编写的程序值,一个原因是线性代数具有规律性,另一个原因是它们可以大量地被并行处理。
然而,历史的模式总是一致的,即要想充分利用新的处理器,我们就要让运算越来越抽象。Cray-1(Cary-1 是世界上最早的一台超级计算机)和它向量化的后继者们需要其运行程序能够使用向量运算(如点积)才能发挥出硬件的全部性能。后来的机器要求要就矩阵-向量运算或矩阵-矩阵运算来将算法形式化,从而方可尽可能地发挥硬件的价值。
但是现在我们没有任何超越矩阵-矩阵运算的办法,即:我们对线性代数的使用已达极限。
但是,我们没有必要把自己限制在线性代数上。事实证明,我们可以沿着数学这棵大树的枝叶往上再爬一段。长期以来,人们都知道在数学抽象的海洋中存在着比矩阵还要大的鱼,这其中一个候选就是张量(tensor)。张量是广义相对论重要的数学基础,此外它对于物理学的其它分支来说也具有基础性的地位。那么如同数学的矩阵和向量概念可被简化成我们在计算机中使用的数组一样,我们是否可以将张量也简化和表征成多维数组和一些相关的运算呢?很不幸,事情没有那么简单,这其中的主要原因是不存在一个显而易见且简单的(如在矩阵和向量上类似的)可在张量上进行的一系列运算。
然而,也有好消息。虽然我们不能对张量使用仅几个运算。但是我们可以在张量上写下一套运算的模式(pattern)。不过,这还不够,因为根据这些模式编写的程序不能像它们写的那样被充分高效地执行。但我们还有另外的好消息:那些效率低下但是编写简单的程序可以被(基本上)自动转换成可非常高效执行的程序。
更赞的是,这种转换可以无需构建一门新编程语言就能实现。只需要一个简单的技巧就可以了,当我们在 TensorFlow 中写下如下代码时:
v1 = tf.constant(3.0)
v2 = tf.constant(4.0)
v3 = tf.add(node1, node2)
真正发生的是构造了一个如图所示的数据结构:
该数据结构不会在上面我们展示的程序中实际执行。TensorFlow 在我们实际运行它之前,将数据结构重写成更有效的代码。这也许会牵涉到我们想让计算机处理的小型或大型结构。它也可生成对我们使用的计算机 CPU、使用的集群、或任何手边可用的 GPU 设备实际可执行的代码。对它来说很赞的一点是,我们可以编写非常简单但可实现令人意想不到结果的程序。
然而,这只是开始。
做一些有用但不一样的事
TensorFlow 和像它一样的系统采用的完全是描述机器学习架构(如深度神经网络)的程序,然后调整那个架构的参数以最小化一些误差值。它们通过创建一个表征我们程序的数据结构,和一个表征相对于我们模型所有参数误差值梯度的数据结构来实现这一点。这个梯度函数的存在使得优化变得更加容易。
但是,虽然你可以使用 TensorFlow 或 Caffe 或任何其它基本上同样工作模式的架构来写程序,不过你写的程序不一定要去优化机器学习函数。如果你写的程序使用了由你选择的包(package)提供的张量标注,那它就可以优化所有类型的程序。自动微分和最先进的优化器以及对高效 GPU 代码的编译对你仍然有利。
举个简例,下图给出了一个家庭能耗的简单模型。
该图显示了一间房子的日常能耗情况(圆圈),横轴代表了温度(华氏度)。模型的参数按理来说会形成一个矩阵,但是当我们要处理上百万个模型时,我们便可以用到张量。
对此进行建模。得到一个模型不是什么难事,但是为了找出这个模型,需要自己写代码来分别对数百万间房子的能耗情况进行建模才行。如果使用 TensorFlow,我们可以立即为所有这些房子建立模型,并且我们可以使用比之前得到这个模型更有效的优化器。于是,我们就可以把节省下来的时间对数百万个房间的模型进行优化,而且其效率比之前我们原始的程序要高得多。
当然,第一步的工作,理论上我们可以手动优化代码,并且可以有人工推导的导数函数。不过完成这项工作所需要的时间,以及更重要的,调试花费的时间会让人无法在有限时间里建立这个模型。
这个例子为我们展示了一个基于张量的计算系统如 TensorFlow(或 Caffe 或 Theano 或 MXNet 等等)是可以被用于和深度学习非常不同的优化问题的。
https://www.kdnuggets.com/2017/06/deep-learning-demystifying-tensors.html
|