Skip to content

第 3 章:点积怎样一步步变成注意力比例 ​

返回目录

这里对应你说的“还是太快,不太好理解”。原回答后来把点积、取指数、归一化和加权分开讲,这个展开顺序保留下来。缩放因子的推导紧接在下一章。

3.1 先理解:为什么需要计算点积? ​

假设一句话里有三个 Token,我们希望知道当前 Token 应该更加关注哪一个。

首先,模型已经通过线性变换得到:

  • 当前 Token 的查询向量 q(Query)。
  • 三个候选 Token 的键向量 k_1,k_2,k_3(Key)。

为了方便,我们假设所有向量都是二维的:

q=(1,0)
\begin{aligned}
k_1&=(1,0)\\
k_2&=(0,1)\\
k_3&=(-1,0)
\end{aligned}

你已经学过点积公式:

q\cdot k=\|q\|\|k\|\cos\theta

这里所有向量的模长都是 1,于是点积仅由夹角决定。

逐个计算:

\begin{aligned}
q\cdot k_1&=1\times1+0\times0=1\\
q\cdot k_2&=1\times0+0\times1=0\\
q\cdot k_3&=1\times(-1)+0\times0=-1
\end{aligned}

于是得到三个分数:

\boxed{s=(1,0,-1)}

它们可以表示三种匹配程度:

Key点积分数在这个例子中的直观含义
k_11匹配程度较高
k_20匹配程度居中
k_3−1匹配程度较低

到这里,我们还没有涉及概率,也没有进行信息组合。

点积只是给出了一个分数,用于比较不同 Key 与当前 Query 的匹配程度。

需要注意,实际模型的 Q、K 不一定是单位向量,点积不仅由夹角决定。所谓「高分意味着更值得关注」,是模型通过训练学出的规则,而不是任何两个语义相近的向量天然都有高点积。

3.2 为什么不能直接拿 (1, 0, −1) 作为权重? ​

现在假设三个 Token 各自携带信息:

v_1,\quad v_2,\quad v_3

我们想构造:

z=a_1v_1+a_2v_2+a_3v_3

你最近学过凸组合,知道如果把三个系数解释为信息分配比例,应当满足:

a_1,a_2,a_3\ge0
a_1+a_2+a_3=1

这样我们才能说:

「从第一个 Token 获取 60% 的权重,从第二个获取 30%,从第三个获取 10%。」

但刚才点积得到的:

(1,0,-1)

有两个问题:存在负数,而且总和是 0。

不能直接将它理解成三个非负的信息分配比例。

因此需要一个额外的数学函数:

把任意实数分数转换成总和为 1 的非负权重,同时尽可能保留原来的高低顺序。

这就是 Softmax 的作用。

3.3 Softmax 分成两个步骤,其实很简单 ​

我们仍然使用:

s=(1,0,-1)

第一步:每个分数取指数 ​

也就是计算 e^s。

你可以先把 e\approx2.718 当作一个固定常数。

\begin{aligned}
e^1&\approx2.718\\
e^0&=1\\
e^{-1}&\approx0.368
\end{aligned}

得到:

(2.718,\ 1,\ 0.368)

为什么这样做?

因为指数函数有几个非常适合这里的性质:

  • 对任何实数,指数结果始终大于 0。
  • 原来分数越大,指数结果也越大。
  • 较高的分数经过指数变换后,会获得相对更大的权重。

因此,它既消除了负数,又保留了匹配分数的排序。

第二步:让三个数字的和等于 1 ​

目前三个数字之和为:

2.718+1+0.368=4.086

那就把每个数字都除以 4.086:

\begin{aligned}
a_1&=\frac{2.718}{4.086}\approx0.665\\
a_2&=\frac{1}{4.086}\approx0.245\\
a_3&=\frac{0.368}{4.086}\approx0.090
\end{aligned}

现在:

0.665+0.245+0.090=1

我们成功得到了三个凸组合系数。

如果把三个分数全部设为0。

这时 Softmax 会得到:

\left(\frac13,\frac13,\frac13\right)

因为三个 Token 的匹配分数完全相同,所以它们获得同样的权重。

这说明一件很重要的事情:

Softmax 不是独立判断某个 Token 的分数够不够高,而是在多个候选 Token 之间进行相对分配。

3.4 现在才把它和凸组合联系起来 ​

经过上面的计算,我们得到了:

a=(0.665,0.245,0.090)

假设三个 Value 向量为:

v_1=(2,0),\qquad
v_2=(0,2),\qquad
v_3=(0,0)

我们进行加权组合:

z=0.665v_1+0.245v_2+0.090v_3

代入:

\begin{aligned}
z&=0.665(2,0)+0.245(0,2)+0.090(0,0)\\
&=\boxed{(1.33,0.49)}
\end{aligned}

这时候就可以用你熟悉的凸包知识理解了。

因为三个权重全部非负,而且总和为 1,所以得到的新点 z,一定在 v_1,v_2,v_3 的凸包内部。

这就是注意力机制中的信息整合过程。

注意:Q、K 负责计算权重,但最终被加权的是 V,而不是 Q 或 K。

3.5 为什么加同一个数不改变结果 ​

如果把所有分数都加c,则分子分母都多了同一个因子e^c,它会约去:

\frac{e^{s_j+c}}{\sum_r e^{s_r+c}}
=\frac{e^ce^{s_j}}{e^c\sum_r e^{s_r}}
=\frac{e^{s_j}}{\sum_r e^{s_r}}.

这说明Softmax使用候选之间的相对分数,而不是拿一个固定分数线判断是否重要。数值实现常先减去最大分数,利用同一性质避免指数太大。

注意,上面把比例说成“取多少信息”,是解释计算分工,不是已测量的语义贡献百分比。V的方向、大小和后续网络,也会影响最终结果。

原来两个候选的比例还满足:

\frac{a_j}{a_k}=\frac{e^{s_j}}{e^{s_k}}=e^{s_j-s_k}.

因此它们的分数相差1,权重之比就是e;所有分数一起平移,则这个比不变。

保留每一次追问,认真走完每一步证明。