一、张量
在前面的文章“线性代数的基本向量”中,对张量(Tensor)有了一个较为清楚的描述。这对于掌握大模型底层的基础运算是非常必要的。可以简单的这样看,标量是一个零维空间的数据描述,向量是一维空间的,矩阵是二维空间的,而张量则三维及以上的空间的。在计算机技术中,向量可以用一维数据描述,而矩阵可以用二维数组描述,张量则是一个多维的数组。
大家可以想象一下,张量是一个由多个矩阵迭加组成的立体数据容器。这也是学习大模型的底层技术的一个重要的关键技术。张量的更重要的意义在于其物理和几何意义即“无论观察者的坐标系如何旋转或变换,张量所代表的物理规律或几何关系保持不变。”这在前面已经描述过。之所以如此,是因为张量是由基向量和向量分量组合而成的,如果基向量已知的前提下,张量完全可以由向量分量进行描述。
普通人不好理解的原因在于,普通人一般生活的都是比较规则的空间中。但在一些实际的应用中,如流体力学、波等,它的空间变化复杂而方向性也多变,特别是在AI中的多维空间的数据处理更是如此。而这恰恰是张量的的优势。
要想更形象的理解张量,可参看Dan Fleisch的视频中对“通过向量来表示面积”(面积是平面上两个分向量的与角度计算的结果,而垂直于这个面积所在平面的向量代表了两个分向量的叉积)这个段。只要理解了这一段,那么理解张量就算是掌握了基础。
二、大模型的数据处理
在AI和大模型的底层数据分析处理过程中,其一个基本的问题就是如何理解人类输入的信息。或者说语言文字或者是语音等。有过底层数据处理经验的都知道,基本就是将其进行Token化。在此基础上,再将其映射为数字向量。这样就可以使用向量来描述不同语言文字或事物的特征即嵌入向量,而向量就可以描述事物间的关联度。也就是说,向量空间可以映射到现实世界的事物中来(反过来也一样)。
这样说可能还是有一点复杂,再简单的说,就是现实事物被拆解映射到向量空间后,每个Token都可以被一组向量描述,即在高维空间中的坐标点。
在此基础上再抽象到矩阵。矩阵就可以进行更加复杂的向量运算。这才在前面的大模型的分配过程中,已经分析过参数的微调其实就是矩阵的低秩处理过程。而现在的大模型为了更好的体现向量特征间的关系,又引入了注意力机制,即将相关的向量特征(上下文中)关系进行处理。
通过不断的对输入矩阵与权重矩阵进行运算(多层)和反向传播机制处理,最终形成一个矩阵向量结果。利用其的概率统计输出结果。这就是一个最初的大模型的数据处理。只不过,真实的大模型中,因为数据是海量的,所以其矩阵可能不只是一个二维矩阵可以描述的,它可能是多个(甚至可能是成千上万或者更多)。而此时,再用矩阵来描述这些数据,就已经变得有些吃力。
好的,张量就这么应运而生了。也就是说,从数据表示上来说,张量就是高维度空间中的向量矩阵。
三、矩阵乘法
在大模型实际生成结果的过程中,它需要一个概率的计算过程。这个计算过程中,其实就是通过注意力机制找到向量矩阵之间的特征关系,再与向量矩阵(描述的信息)及权重矩阵(从海量的输入数据中找到规律)进行运算,进而得到输出结果。
而这个运算的过程,就是矩阵乘法计算的过程。它不是一个简单的一次两次的过程,这是一个动态的不断正向(多层网络)和反向传播的处理过程。这个矩阵的计算的结果,就是输出结果的概率分布,大模型会在这已知的结果中通过此概率找出相关的内容并重新丢回输入上下文中,并重新进行上述的动作。
四、张量计算
上述的矩阵计算过程,体现在高维度空间的运算中,就是张量计算。而张量计算有加法、乘法、积等各种运算操作。但在大模型的底层,其基础的张量运算就是矩阵乘法和累加操作。它也是很多张量加速计算库的主要功能。
张量计算的核心作用就是对正向传播中的输出和反向传播中的梯度计算、优化调参起着加速的作用。比如常见的深度学习和神经网络、NLP以及图像图像处理等等场景中,都广泛使用到了张量计算。
五、总结
如果明白了上面的分析,基本就明白了,所谓标量、向量、矩阵等等都可以用张量来表示。正如二维平面空间可以描述为高度为零的三维立体空间,反过来也可以把三维空间描述为多个二维平面空间的组合一样。由分到合再由合到分。既掌握细节的不同,又能抽象的统一。这就是张量的意义。