F07|模型最常做的算术:加权求和、点积与矩阵乘法
从具体对象与小例子开始,理解计算过程与适用条件。
本章目录
矩阵乘法像逐格填写配方结果
一个输出格子的数,到底从哪些输入格子来?
不要先背形状规则。先盯住一个输出格子:它只拿输入的一行、系数表的一列。每对数字相乘,再把乘积加起来。把同样的动作重复到所有输出格子,就得到整张结果表。
输入与适用条件:沿用本节“矩阵乘法”主算例X=[[1,2,3],[4,5,6]],W=[[1,0],[0,1],[1,1]];不是后文的独立两维算例。
1 / 4 · 填输出的第0行第0列
窄屏可左右滑动图形,或点击“放大图形”。文字解释紧随图后。
选择X的第0行和W的第0列,沿三个特征一一配对、相乘,再相加。其他输出格子各算各的,不能混用另一行。
Y[0,0] = 41×1 + 2×0 + 3×1 = 4
默认静止。用“下一步”看完解释再继续;播放到最后一步自动停止。键盘聚焦播放器后,可用左右键逐步查看、空格播放/暂停。图中颜色辅助区分,含义同时用文字注明。
为什么需要
用批量算子同时处理许多同类乘加,但每个格子的数学定义没有变化。
怎样实现
先把一个格子算对,再利用矩阵库和GPU处理整张表。
可能的代价与误解
形状正确仍可能取错轴、误用逐元素乘法。
如何判断是否做对
四个结果应依次是4、5、10、11,再与代码的矩阵乘对照。
从你已经会的平均数开始
2和6的普通平均是(2+6)/2=4,也能写成0.5×2+0.5×6。如果你认为第二个数应占更大比例,可以写成0.25×2+0.75×6=5,这叫加权平均。权重非负并且总和为1时,它表达“各占多少比例”。
对于两排数[2,0]和[0,4],仍按对应位置计算:
0.25×[2,0] + 0.75×[0,4]
= [0.25×2+0.75×0, 0.25×0+0.75×4]
= [0.5,3]
得到的仍是一排数,没有选出一句文字。这会直接用在Attention中。
点积是怎样把两排数变成一个数
点积(dot product)要求两排数一样长:把对应位置相乘,再加起来。
[1,2,3] · [4,5,6]
= 1×4 + 2×5 + 3×6
= 32
公式Σ_i x_i y_i只是把上面三次乘法与加法写成通用规则。点积结果是一个标量,而不是三排数。它可以用于比较方向或产生分数,但原始点积也受向量长度影响,不能无条件说它就是纯粹的语义相似度。
矩阵乘法是“一次做很多个点积”
本段先给两个对象起名:X是当前输入数字表;W是决定如何组合这些数字的系数表。这里先手动指定W,F10再说明它在模型里怎样成为可训练参数。字母只标识对象,没有增加新的算术操作。
设两张表:
X = [[1,2,3], W = [[1,0],
[4,5,6]] [0,1],
[1,1]]
X形状[2,3] W形状[3,2]
计算Y=XW:Y的每个格子,用X的一行与W的一列做点积。
Y[0,0] = [1,2,3]·[1,0,1] = 4
Y[0,1] = [1,2,3]·[0,1,1] = 5
Y[1,0] = [4,5,6]·[1,0,1] = 10
Y[1,1] = [4,5,6]·[0,1,1] = 11
所以Y = [[4,5],[10,11]],形状[2,2]
内侧尺寸必须匹配:[m,n]×[n,p]→[m,p]。m是第一张表的行数,n是每次点积配对的长度,p是输出列数。这里没有“把所有数字随便相乘”的自由。
一个Token从4096个数变成另外4096个数,究竟是什么动作
若输入一排数x长4096,乘一个[4096,4096]权重矩阵,每一输出列都对输入4096个数加权求和。输出还是4096个数,但数值和组合方式变了。这个过程常称线性投影;“投影”在这里不必等同三维物体投影到墙上,也不一定降低维度。
在多条输入的情况下,常把最后一个轴视为特征轴。同一W作用到每个位置,因此[B,T,d]×[d,k]→[B,T,k]。它改变每个位置的宽度,不直接混合两条样本或相邻Token。
转置怎样帮助“一排数分别与多行比较”
转置(transpose)是把一张表的行列交换。比如:
K = [[1,2], Kᵀ = [[1,3,5],
[3,4], [2,4,6]]
[5,6]]
K在这段只是给三行待比较数字起的表名,原来有3行,每行2个数。另有一排待比较数字q,长度也是2;想让q分别与K的3行做点积,可以将K转成2行3列,于是[1,2]×[2,3]→[1,3],一次得到三个比较分数。到F11,才会把这种接收方表示和候选表示分别引入为Query和Key,并完整解释它们的参数来源。
注意上标ᵀ是转置,不是序列长度T;Kᵀ也不是K的T次方。
矩阵乘与逐元素乘不能混
在常见Python数值库里,@表示矩阵乘,*常表示对应格子逐元素相乘。对两个2×2矩阵,这两种操作都能运行且输出2×2,但结果完全不同。形状对了只是必要检查,不代表运算含义对了。
读公式时依次问:输入每个轴是什么、操作按哪条轴进行、输出每格怎么计算、得到的是分数还是特征。这个办法比只记“QKV都是矩阵”更可靠。
用同一张表区分点积、矩阵乘法与逐元素乘法
独立的矩阵乘法对照:下面换用一排两维输入,不沿用上方三列X;本表内部始终使用这里给定的x和W。输入与条件。设一排输入 x=[1,2],权重矩阵 W=[[3,4],[5,6]]。行向量乘矩阵意味着用W的每一列分别计算一个新特征。
| 步骤与对象 | 内部动作 | 中间结果 / 新状态 |
|---|---|---|
| 1取第1列 | [1,2]·[3,5] | 1×3+2×5=13。 |
| 2取第2列 | [1,2]·[4,6] | 1×4+2×6=16。 |
| 3合成输出 | 把两个点积并排 | 得到 [13,16];这是 xW。 |
| 4逐元素对照 | [1,2]⊙[3,5] | 得到 [3,10],尚未求和,不能拿它替代点积13。 |
| 5两条输入 | 把 x2=[0,1] 也放进来 | [[1,2],[0,1]]W=[[13,16],[5,6]],每个位置都用相同权重。 |
把过程连起来。矩阵乘法没有神秘新动作,它是按规定配对并重复“乘后相加”。形状合法并不保证轴的语义正确。
边界与反例。权重是构造的,不含训练语义。本例用行向量约定;采用列向量时公式需一致转置。
依据与适用范围:[DERIVE]。示例输入和场景由本书明确设定。
课后自检
形状[2,3]能直接矩阵乘[4,5]吗?
查看参考答案收起参考答案
0.2×[1,5]+0.8×[6,0]等于什么?
查看参考答案收起参考答案
延伸阅读:相关系统问题
02|一次Transformer前向:逐张量、逐算子讲明白06|后训练、MoE与模型定制:能力和行为如何改变
07|KV Cache、FlashAttention与PagedAttention的内部过程
15|检索离线链路:文档怎样变成可查询索引
28|研究深水区与系统综合判断
机制依据:[F-LINALG][TR]。本节数值与情景除另注外均为原创教学示例;来源不代替中文讲解。