基础篇

F07|模型最常做的算术:加权求和、点积与矩阵乘法

基础篇约 2.2 千字1 组分步图解

从具体对象与小例子开始,理解计算过程与适用条件。

本章目录
动态图解 · F07

矩阵乘法像逐格填写配方结果

一个输出格子的数,到底从哪些输入格子来?

不要先背形状规则。先盯住一个输出格子:它只拿输入的一行、系数表的一列。每对数字相乘,再把乘积加起来。把同样的动作重复到所有输出格子,就得到整张结果表。

点积两排等长数字按位置相乘后求和。
参数表W控制输入各分量怎样被组合的系数。
线性投影这里指每行乘W,不必降低维度。

输入与适用条件:沿用本节“矩阵乘法”主算例X=[[1,2,3],[4,5,6]],W=[[1,0],[0,1],[1,1]];不是后文的独立两维算例。

1 / 4 · 填输出的第0行第0列

第1步,共4步

窄屏可左右滑动图形,或点击“放大图形”。文字解释紧随图后。

矩阵乘法像逐格填写配方结果:填输出的第0行第0列输入 X123456×系数表 W100111输出 Y4···1×1 + 2×0 + 3×1 = 4

选择X的第0行和W的第0列,沿三个特征一一配对、相乘,再相加。其他输出格子各算各的,不能混用另一行。

Y[0,0] = 4

1×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都是矩阵”更可靠。

运行示例 · F07

用同一张表区分点积、矩阵乘法与逐元素乘法

独立的矩阵乘法对照:下面换用一排两维输入,不沿用上方三列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]。示例输入和场景由本书明确设定。

课后自检

自检 1

形状[2,3]能直接矩阵乘[4,5]吗?

查看参考答案收起参考答案
按普通矩阵乘规则不能,内侧3和4不匹配。需要先确认设计,而不是任意reshape到能跑。
自检 2

0.2×[1,5]+0.8×[6,0]等于什么?

查看参考答案收起参考答案
第一格0.2+4.8=5,第二格1+0=1,所以是[5,1]。

机制依据:[F-LINALG][TR]。本节数值与情景除另注外均为原创教学示例;来源不代替中文讲解。

记录保存在本机浏览器。

输入关键词即可检索。

↑ ↓ 选择 Enter 打开Esc 关闭 · 仅本地搜索

阅读设置

阅读设置仅保存在本机浏览器,不上传任何数据。