34 分钟
AI 数学精要

向量与张量:模型世界的通用语言

从标量一路搭到高维张量,亲手算点积与范数,建立神经网络一切数据结构的几何直觉

  • 把标量、向量、矩阵、张量的层级关系讲明白,能准确读出任意张量的形状和轴
  • 能手算向量加减、数乘、点积与 L1/L2 范数
  • 理解点积的几何意义是投影与相似度,并说出它在神经网络里的三处用途
  • reshape 只改你看待数据的方式,数据本身没变。

神经网络里没有「数字」,只有张量——先学会这门通用语言

以后你读任何模型源码,最先撞上的不是算法,是形状:输入是 [64, 3, 224, 224],某层权重是 [768, 768],某个激活值是 [64, 128]。这些方括号里的东西统称张量(Tensor)。线性代数最核心的作用,就是让你看见这些数字时,脑子里能浮现出结构和几何,不是一堆无意义的嵌套列表。这节顺着一条因果线讲:标量堆成向量,向量排成矩阵,矩阵叠成张量;向量有方向和长度,两个向量的点积可以衡量一致性——而点积正是注意力打分、相似度检索、全连接计算的同一块地基。

为什么向量能成描述世界的基本单位?因为任何一个对象,都能从好几个「描述角度」同时刻画:说一套房子用 [面积, 房龄, 楼层, 距地铁距离],说一个词用一串几百到几千维的 embedding。每一维是一个观测角度,合起来的向量就是这个对象在「特征空间」里的坐标。两个对象越相似,它们的坐标点在这个空间里就越靠得近——机器学习说的「学习」,很大程度上就是在学一个能让同类点聚拢、异类点分开的特征空间。

1.1 从标量到张量:维度就是「嵌套了几层列表」

标量(Scalar,0 维张量):一个数,比如温度 36.5、损失 0.37,形状是 []。向量(Vector,1 维张量):一排有序的数,比如一个人的 [身高, 体重, 年龄]=[175, 70, 26],形状是 [3]。矩阵(Matrix,2 维张量):一张数表,比如 100 个人、每人 3 个特征,形状 [100, 3];Excel 表就是矩阵。三维及以上统称张量:一批灰度图是 [批次, 高, 宽],一批彩色图是 [批次, 通道, 高, 宽]。维度(ndim)数的是「嵌套几层列表」,形状(shape)数的是「每层各有几个元素」,两者不是一回事。

示例代码(可运行)
ℹ️轴(axis)是有方向的

二维矩阵里 axis=0 沿「行」向下走(跨行聚合,比如求每列均值),axis=1 沿「列」向右走。三维图像张量 [N,C,H,W] 有 4 根轴:批次轴、通道轴、高、宽。做归一化、求均值、拼接时选错轴,是深度学习最常见的隐性 Bug——程序不报错,但结果悄悄错了。

选择题

一个张量形状是 [32, 3, 224, 224],下列解读正确的是?

💡广播(broadcasting):形状不同也能算的三条规则

两个张量做逐元素运算,形状不一样的时候,框架会按三条规则自动对齐,这就是广播:维度少的那个,在最左边补 1;某一维长度是 1,就沿着这一维复制,凑到和对方这一维一样长;某一维两边长度不相等,而且都不是 1,直接报错。举个例子,[3] 和 [64,3] 相加,会把 [3] 这个向量复制 64 份再算。广播省显存,但也容易写错。算出来结果不对,手算一遍复制后的形状,最快定位问题。

1.2 向量不是「一列数」,它是一支带方向的箭

把向量 [3, 4] 画在平面上:从原点出发,走到横坐标 3、纵坐标 4,它同时带长度和方向。分量(component)是这支箭在各坐标轴上的投影。这个几何视角比「有序列表」有用得多,后面所有运算——相加、投影、旋转——都能对应到看得见的箭头操作上。

向量加法 u+v:把 v 的尾巴平移接到 u 的箭头,合向量就是「先走 u 再走 v」,对应分量逐项相加。数乘 c·u:把箭头拉长 c 倍;c 为负时方向反转。它不改变向量所在的直线(共线),只改变长短与朝向。零向量 [0,0] 是缩成一个点、没有方向的特殊向量。线性组合:a·u+b·v 这种「先各自数乘再相加」的操作,是线性代数的核心动作——张成空间、基、矩阵乘,本质都是在做线性组合。

示例代码(可运行)

1.3 点积:用一个数衡量「两个向量有多一致」

两个同维向量 a、b 的点积,就是对应分量相乘再求和:a·b = Σᵢ aᵢbᵢ。它把两个向量压成一个标量。举个例子,a=[1,2,3]、b=[4,5,6]:a·b = 1×4 + 2×5 + 3×6 = 4 + 10 + 18 = 32。

示例代码(可运行)
预测输出
a=[1,2,3], b=[4,5,0](第三个分量从 6 改成 0),print(sum(x*y for x,y in zip(a,b))) 输出什么?
推导

点积的几何真身:投影长度 × 对方长度

点积有个等价的几何公式:a·b = ‖a‖·‖b‖·cosθ,θ 是两向量的夹角。意思就是「b 在 a 方向上的投影长度,乘上 a 的长度」。顺着这个公式推:方向一致时(θ=0,cos=1),点积最大,值为正;正交时(θ=90°,cos=0),点积为 0,说明两个向量零相关;方向相反时,点积为负。

把长度归一化后,点积就变成余弦相似度 cosθ = (a·b)/(‖a‖·‖b‖),取值落在 [-1,1]。以 a=[1,2,3]、b=[4,5,6] 为例:‖a‖=√14≈3.742,‖b‖=√77≈8.775,cosθ ≈ 32/(3.742×8.775) ≈ 0.975,非常接近 1,说明两向量方向高度一致。

🐍点积是 AI 里被复用最多的一个运算

注意力:Query 与 Key 做点积得到相关度分数,softmax 后给 Value 加权(stage-13 会手算);向量检索:问题与文档 embedding 算余弦相似度取最相近者;全连接层:输出的每个数都是输入向量与某列权重的点积。看懂点积,这三件事就是同一件事。

1.4 范数:向量的「长度」,L1 与 L2 脾气不同

范数(norm)给向量量一个长度。最常用两种:L2 范数(欧氏长度)‖a‖₂ = √(Σ aᵢ²),即箭头到原点的直线距离。对 a=[1,2,3]:‖a‖₂ = √(1+4+9) = √14 ≈ 3.742。L1 范数(曼哈顿长度)‖a‖₁ = Σ|aᵢ|,即各分量绝对值之和:|1|+|2|+|3| = 6。把向量除以自己的 L2 范数得到单位向量(长度归一化为 1、方向不变),余弦相似度就是先归一化再点积。

两种范数的「脾气」不一样,直接影响模型效果。L2 对大分量格外敏感——平方会放大离群维度,它的等值面是光滑球面,最优解通常各维都非零、比较稠密;L1 的等值面是带棱角的菱形,最优解容易落在角点上,让很多分量恰好为 0,所以倾向产生稀疏解。这就是 L1 正则(Lasso)能做特征选择、L2 正则(Ridge/权重衰减)让权重整体变小变平滑的几何原因。另外还有 L∞ 范数,取各分量绝对值的最大值;L0 严格说不算真正的范数,它算的是非零分量的个数。

填空题填写空白处的代码
v=[3,4] # L2 范数:勾股定理 l2 = (3**2 + 4**2) ** # 填 0.5,等价开平方 # L1 范数 l1 = ([3, 4]) # 填 abs(3)+abs(4),结果为 7 # 归一化后第一个分量 unit_0 = 3 / # 填 l2,得 0.6

形状 [1,3]:一行三列,比如 [1,2,3]。数学教材里默认向量大多是列向量,代码里的一维数组既不算严格的行向量也不算严格的列向量,需要的时候用 reshape 显式声明就行。

1.5 张量:把一批向量整齐堆起来,一次并行算完

真实训练从不只处理一个样本,而是一批(batch)。把 64 个形状 [784] 的向量沿新轴堆叠,得到 [64,784] 的矩阵;权重 [784,128] 在右,一次矩阵乘就并行算出 64 个样本各自的 128 维输出,循环被张量运算彻底取代。轴让你能指定「沿哪个维度做什么」:沿批次轴求平均得到一个样本的平均损失,沿特征轴做归一化。

调整张量布局常用三个操作:reshape、转置、permute。reshape 只改「连续内存的切分方式」,不动任何数值,所以新旧形状各轴乘积必须相等。转置是交换两根轴,比如把 [H,W] 变成 [W,H]。permute 能同时重排多根轴,比如把通道在后的 [N,H,W,C] 调成通道在前的 [N,C,H,W]。数据本身一个字没动,变的只是「从哪个方向去读它」。

配对题把对象对到它最贴切的张量形态
找 Bugreshape(2,4) 要求 8 个元素却只有 6 个,直接报错;且 [2,3] 与 [3,2] 不能逐元素相加。
# 想把 6 个数变成 2 行 3 列,再变成 3 行 2 列 import numpy as np x = np.arange(6) a = x.reshape(2, 4) # 作者以为随便填 b = x.reshape(3, 2) c = a + b # 还想把两者相加
⚠️高频误区:把 ndim、shape、元素总数混为一谈

ndim 是轴的个数,等于 len(shape);shape 是每根轴长度组成的元组;元素总数是 shape 各分量相乘的结果。碰到 shape mismatch 报错,先把每个张量的这三项列在纸上对齐看,比瞎改代码快得多。

本节小结

先理清楚一条因果链:标量→向量→矩阵→张量,维度看嵌套层数、形状看各轴长度。向量就是带方向的箭,支持加法、数乘,线性组合是贯穿始终的基本动作。点积 a·b=Σaᵢbᵢ=‖a‖‖b‖cosθ,既是投影也是相似度,归一化后就是余弦相似度。L1 算绝对值之和,结果偏稀疏;L2 算直线距离,结果偏平滑。张量靠轴来组织批量并行计算,reshape 操作守恒元素总数,不会改变数据本身。这些是后面学矩阵乘、注意力、LoRA 的共同语言。

资深工程师加餐

底层原理 · 大厂视角 · 工程经验,点卡片展开

一条样本是一个特征向量,一批样本堆成矩阵,神经网络一层的变换本质就是矩阵乘法加激活。换基/特征值分解相当于找数据的主要方向(PCA 降维),GPU 之所以适合深度学习,正是因为它能大规模并行做矩阵运算。把「向量=对象、矩阵=变换」建立起直觉,后面公式就不再抽象。