seegongsik
我的单词本
工程数学

张量是数·向量·矩阵之上的阶梯

数·向量·矩阵是张量阶梯的头几级,外积造出秩1,矩阵就是它们之和

"张量"这个词听着难,其实只是给我们早已熟悉的东西串成一架阶梯起的名字。一格就是一个数(标量)。排成一行就是向量。摊成格子就是矩阵。把格子叠成几层就是立方体。需要几个下标,就是它的阶(rank):零、一、二、三。把两个向量向外相乘的外积 u⊗v = u vᵀ 造出最简单的 rank-1 矩阵,而任何矩阵都能拼成这种片的和(那正是 SVD)。矩阵也能吃下两个向量、吐出一个数 uᵀ M v。一张图像、一整批训练数据,全都是张量。我们一级一级地往上爬吧。

用按钮把阶一级一级往上抬。rank 0 是一格,就是一个数,不需要下标去指位置。rank 1 把一格拉成一行,成为向量,要选哪一格得用一个下标。rank 2 把行摊成格子,成为矩阵,"第几行第几列",所以两个下标。rank 3 把那些格子叠成立方体,于是三个下标。一眼就能看出:阶就是下标(轴)的个数。形状也随之长大:点 → 线 → 面 → 体。张量不是什么新怪物,而是把我们熟悉的东西立到同一架梯子上的名字。

这次把两个向量向外相乘,造一个矩阵。用滑块把 u = (u1, u2) 放在左边竖列、v = (v1, v2) 放在上边横排,那么格子的格 (i, j) 里就是 ui · vj。这就是 u⊗v = u vᵀ。每个位置的数是左边值乘上边值,格子按值深浅着色。把 u 加倍,整整一行翻倍;调大 v,整整一列变大。妙的是,不管怎么转旋钮,这矩阵的秩永远是 1:每一行都是 u 的倍数,每一列都是 v 的倍数,独立方向只有一个。外积是最简单的矩阵,一块 rank-1 的砖。

那普通的矩阵怎么造呢?把几块 rank-1 砖叠起来就行。用开关一层一层地加。层 1 只有第一片 σ1·u1·v1ᵀ,所以只能粗粗地仿出目标矩阵的大轮廓。加上层 2,σ2·u2·v2ᵀ 补上剩下的差,于是和与目标矩阵完全一致。画面把当前重建和目标并排显示,还用数字给出二者的差。这正是 SVD 的核心:任何矩阵都是 A = Σ σk uk vkᵀ,也就是 rank-1 片的和,而只留最大的几个 σ,形状仍几乎保住。压缩就从这里来。

矩阵也可以不看作"变换",而看作"吃两个向量的机器"。把 u 从左边、v 从右边塞进固定矩阵 M,就出来一个数:uᵀ M v。这就是 rank 2 张量(矩阵)接收两个向量、吐出一个标量的双线性型。在坐标平面上拖动 u 和 v 两支箭头。下方读数板实时显示 uᵀ M v 的值。固定一边,只把另一边加倍,结果也正好加倍。它对两个自变量各自都是线性的,所以叫"双线性"。量长度(内积)、能量(½ xᵀ K x)、曲率、应力,凡是吃两个方向、给出一个数的量,全是这个模子。

最后,看看为什么张量是机器学习的母语。用开关一次加一个轴。一张灰度图是像素亮度的格子,即 [H, W] 矩阵(rank 2)。转到彩色,红、绿、蓝三个通道叠起来成 [H, W, 3] 立方体(rank 3)。一次训练许多图,就把这些立方体叠 N 个,成 [N, H, W, 3](rank 4)。画面在你每加一个轴时,同时显示形状标签和格子如何堆叠。张量不是抽象数学的装饰,而是把数据的多个轴装进一个容器的实用器皿。这正是深度学习框架名字里带"Tensor"的缘故。

实际应用张量是把数·向量·矩阵·立方体立到同一架梯子上的名字。下标(轴)的个数就是阶(rank):标量=0,向量=1,矩阵=2,立方体=3。外积 u⊗v = u vᵀ 把格 (i,j) 填上 ui·vj,造出最简单的 rank-1 矩阵,而任何矩阵都是 A = Σ σk uk vkᵀ,即 rank-1 片的和(这就是 SVD,只留大的 σ 就是压缩)。当作双线性型用,矩阵吃两个向量、返回一个数 uᵀ M v,对每个自变量都是线性的;内积、能量、应力都是这个模子。机器学习的数据整个就是张量:灰度图 [H,W]、彩色 [H,W,3]、一批 [N,H,W,3]。从数到向量、到矩阵、到立方体一级一级往上爬,整个线性代数就显成一架梯子。
工程数学
如果有帮助,请支持我们