1. 把数字摆成方块:一张"数表"
想象老师让统计班级 3 次小测成绩:
| 学生 | 第1次 | 第2次 | 第3次 |
|---|---|---|---|
| 小A | 85 | 90 | 88 |
| 小B | 78 | 82 | 86 |
把数字单独拎出来,按原位置排好:
85 90 88
78 82 86
这就是"矩阵" ------一个 m 行 n 列的矩形数表。
上面这张叫 2×3 矩阵(先报行数,再报列数)。
2. 向量:只有一列(或一行)的矩阵
把"小A 三次成绩"竖着写:
85
90
88
它只有 1 列,叫 列向量 ;如果横着写 [85 90 88],就叫 行向量 。
向量就是"一条数字",矩阵就是"多条向量并排"。
3. 为什么要弄成方块?
- 一眼看出谁对应谁(行=学生,列=考试)
- 电脑能把"整张表"当一个整体来算,速度飞快
4. 矩阵 × 向量:一次把账算完
还是那张成绩表:
G = 85 90 88
78 82 86
现在算"每人总分",只要给每门课一个"权重"向量 w:
w = 1 (第1次占比1)
1.2 (第2次占比1.2)
1 (第3次占比1)
步骤:把 G 的每一行去点积 w
- 小A:85×1 + 90×1.2 + 88×1 = 291
- 小B:78×1 + 82×1.2 + 86×1 = 272.4
写成矩阵乘法:
G · w = [291] ← 小A
[272.4]← 小B
口诀:矩阵 × 向量 = 对矩阵每行做"对应位置相乘再相加"(点积)。
5. 矩阵 × 矩阵:批量算账
再加一次考试,权重换成矩阵 W(3×2):
W = 1 0.8
1.2 1
1 0.9
把 G(2×3)× W(3×2)→ 结果 2×2:
-
左高 × 右宽 = 新尺寸
-
每个元素 = 左行 点 右列
G·W = [291 263.2] ← 小A两次总评
[272.4 246.2] ← 小B两次总评
电脑一次 GEMM(General Matrix Multiply)全部搞定。
6. 矩阵乘法的三条"形状铁律"
- 左矩阵列数 = 右矩阵行数
- 结果行数 = 左行数,列数 = 右列数
- 每个元素 = 对应行 × 对应列 的点积
记住口诀:(m×n)·(n×p)→(m×p)
7. 从"数表"看 AI 的万能套路
------矩阵怎样一路查表、旋转、掰弯,最终让电脑"看懂"一句话
(本节绝不跳步,每一行乘出来都给你看)
7.1 查表:one-hot 抽列仍是矩阵乘
词典还是 4 个字:【我、爱、猫、狗】,编号 0→3。
"猫"的 one-hot 向量 x:
0
0
1 ← 只有这里是 1
0
Embedding 矩阵 E(3×4,每列对应一词):
0.2 0.5 -0.1 0.8
0.3 0.4 0.7 0.2
0.1 0.6 0.9 -0.3
乘一遍:
E · x =
[-0.1] ← 第 2 列被完整抽出
[ 0.7]
[ 0.9]
数学事实 :
4×1 的 one-hot 与 3×4 的矩阵相乘,结果恰好是矩阵的第 2 列 。
所以"查表"这个动作,外表是乘,实质是拿列,电脑还能继续求导。
7.2 线性搬家:Attention 里的 Q/K/V 投影
句子只有两个字【我 爱】,已经查完表得到 2 个向量(行=字,列=维度):
X = ← 2×3 矩阵(先升到 3 维方便演示)
[ 0.2 0.5 0.1] ← "我"
[ 0.3 0.4 0.7] ← "爱"
现在要把它三次搬家 :问空间 Q、被问空间 K、给信息空间 V。
做法:再准备 3 个 3×3 的小矩阵 WQ, WK, WV,元素随机扔:
WQ 举例(先给具体数):
0.2 0.1 -0.3
-0.1 0.3 0.4
0.5 -0.2 0.6
算 Q = X · WQ(2×3 乘 3×3 → 2×3,每行独立):
第 1 行(我):
q1_0 = 0.2×0.2 + 0.5×(-0.1) + 0.1×0.5 = 0.04 - 0.05 + 0.05 = 0.04
q1_1 = 0.2×0.1 + 0.5×0.3 + 0.1×(-0.2)= 0.02 + 0.15 - 0.02 = 0.15
q1_2 = 0.2×(-0.3)+0.5×0.4 + 0.1×0.6 = -0.06 + 0.20 + 0.06 = 0.20
第 2 行(爱):
q2_0 = 0.3×0.2 + 0.4×(-0.1) + 0.7×0.5 = 0.06 - 0.04 + 0.35 = 0.37
...(同理算完)
最终 Q:
[ 0.04 0.15 0.20] ← 我
[ 0.37 0.26 0.54] ← 爱
看到了吗?
同一个 X,换一张表 WQ,就被旋转+缩放 到新坐标系;
K、V 同理,只是换另外两张随机表。
所有字一起乘完,GPU 一次 kernel 解决。
7.3 注意力权重:矩阵乘自己的转置
现在用 Q、K 算"谁跟谁相关"。
尺寸:Q(2×3), K(2×3)
先算 S = Q · Kᵀ(2×3 乘 3×2 → 2×2)
S[0,0] = q1 · k1 = 0.04×0.10 + 0.15×0.25 + 0.20×0.35 = 0.004 + 0.0375 + 0.07 ≈ 0.1115
S[0,1] = q1 · k2 = ...
得到 2×2 的"原始分矩阵" S:
[ 0.1115 0.089 ] ← 我 对 我/爱 的分
[ 0.142 0.128 ] ← 爱 对 我/爱 的分
接着 softmax 按行归一化 → 权重矩阵 A(每行和=1)。
没有任何手工规则,全是点积 + exp + 除法。
7.4 加权求和:再一次矩阵乘
拿到权重 A(2×2) 与值 V(2×3) 相乘:
O = A · V (2×2 乘 2×3 → 2×3)
每一行就是 用权重把 V 里的向量求和 ,得到新表示。
Attention 输出 O 完成。
7.5 FFN:对每个向量单独"升维→掰弯→降维"
拿 O 的第 1 行 o = [o0, o1, o2](3 维)举例:
- 升维:
h = o · W₁ (W₁ 是 3×12 表,随机初始)
→ 得到 12 维向量 - 掰弯:
h = ReLU(h) 【负数变 0,正数保持】 - 降维:
y = h · W₂ (W₂ 是 12×3 表)
→ 回到 3 维
尺寸链 :3 → 12 → 3
参数量:3×12 + 12×3 = 72(忽略偏置)
结论 :
FFN 不对字与字之间操作,只把每个字的向量单独送进"小前馈网络"加工一次,让表达能力从"直线"升级成"折线/曲线"。
7.6 残差 + LayerNorm:把高速路留回梯度
Attention/FFN 都可能把信息带远,要留条捷径:
x = LayerNorm( FFN(x) + x )
- + x 保证梯度能沿原路返回(残差)
- LayerNorm 把向量均值归 0、方差归 1,训练更稳
数学 :
μ = mean(x), σ = std(x)
x̂ = (x − μ) / √(σ² + ε)
output = γ · x̂ + β (γ, β 也是可训练向量)
7.7 输出层:再查同一张 Embedding 表
最后要猜下一个字,把当前向量 h 乘回 E 的转置:
logits = h · Eᵀ (1×3 乘 3×4 → 1×4)
→ 得到 4 个分数,softmax 变概率,采样或取最大即可。
好处 :
输入输出共享同一张语义表,参数省一半,小模型尤其明显。
7.8 小结:矩阵一条龙流程
字 ID
↓ one-hot × E ← 查表(3×4 乘 4×1 → 3)
↓ X 拼成矩阵
↓ X·WQ , X·WK , X·WV ← 三次投影(2×3 乘 3×3 → 2×3)
↓ A = softmax(Q·Kᵀ) ← 权重(2×2)
↓ O = A·V ← 加权求和(2×2 乘 2×3 → 2×3)
↓ FFN:升维→ReLU→降维 ← 每行单独 3→12→3
↓ +残差 & LayerNorm
↓ logits = h·Eᵀ ← 再查表
↓ softmax → 概率 → 下一字
所有步骤都是"换一张表 → 矩阵乘 → 偶尔掰弯" ,
电脑眼里没有语义,只有大块大块数字搬家。
8. 小结(一句话背走)
矩阵 = 把数字摆成方块,乘法 = 批量点积,AI 里所有"查表、旋转、加工"全用它一张表搞定。