Architecture

Self-Attention
自注意力机制允许模型在处理一个词时,权衡输入序列中其他所有词的重要性。它通过为序列中的每个词计算一个“注意力分数”来实现这一点,从而动态地决定关注哪些词。

self-attention的实现方式是Scaled Dot-Product Attention,核心是三个向量,; 这三个向量分别代表 Query - “我在寻找什么信息”,Key - “我能提供什么信息”,Value - “我包含的信息内容”;
单词向量(通过Embedding而来)
Hint
打个比方: 你去图书馆找书(Query),书架上的标签就是 Key。当你发现某个标签和你的需求匹配时,你拿走的书中内容就是 Value。
具体计算过程,
- 计算相似度: 将每个查询向量 Q 与所有键向量 K 进行点积,得到注意力分数。点积结果越高,说明这两个词越相关。
- 缩放(Scaling),将Score除以sqrt(d_k)(d_k是键向量的维度)以稳定梯度。
- 归一化(Softmax),将Scpre转化为0-1的概率分布,代表每个单词对当前单词的“重要程度”;(Softmax后得到Attntion Weights,每一行都代表当前单词和剩下单词的关联程度的概率分布,每一行 sum = 1)
- 加权求和(MatMul),将得到的权重乘以对应的 Value () 并求和。这样得到的向量就融合了全句的信息。

即,
Tip
Self-Attention有的优势在于,
- 捕捉长距离依赖: 无论两个词离多远,计算复杂度都是常数级别的
- 消除歧义: 比如在“The animal didn’t cross the street because it was too tired”中,自注意力会让 “it” 更多地关注 “animal”,而不是 “street”。
- 并行化: 不需要像 RNN 那样等待前一个词算完,所有词可以同时计算。
Self-Attention具体计算过程见:self_attention_example
Interview-Question
为什么 Scaling 要除以 ?
为了“防止梯度消失”,稳定梯度。
主要原因是因为Softmax的函数特性,如果不除以 ,会造成点积爆炸;假设 and 的维度 () 很大,比如 512。 当我们在做点积 () 时,是在将 512 个数字相乘再相加,会导致数值范围变得非常大。
Softmax函数公式是,对输入的数值大小非常敏感;例如[20,30], ,权重:;
Softmax 的分布变得像“独热编码 (One-hot)”一样极端。其中一个不仅拿走了所有权重,而且在数学上,Softmax 函数在趋近于 0 或 1 的位置,导数(梯度)趋近于 0。
以至于为什么要除以,假设 和 中的每个元素都是均值为 0,方差为 1 的随机变量。它们的点积 。[根据统计学规律,如果你把 个方差为 1 的数加起来,结果的方差会变成 ]((math/statistic/basic_concepot/var_addition.md)。这意味着点积结果的标准差变成了 ,因此需要把结果除以标准差,让数值保持在 Softmax 喜欢的“舒适区”。
为什么要使用softmax归一化weight matrix?
但 Softmax 最终成为了 Transformer 的标准配置,主要原因不是因为它“好算”,而是因为它具备一个简单的归一化(Sum)无法提供的核心特性:“赢家通吃” (Winner-Take-All) 的倾向性,同时又保持了可导性。
1.核心差异:放大信号,抑制噪声
注意力机制的本质是**“查字典”。当我在找东西时,我希望找到那个最匹配的,而忽略掉那些一般般**的。
假设我们算出来的 Score 是:[10, 9, 2]。
- 10 是最相关的(目标)。
- 9 是干扰项(只差一点点)。
- 2 是完全不相关的背景噪声。
方案 A:直接按和分配 (Linear Normalization)
我们把它们加起来:。
然后算权重:
结果: 0.48 和 0.43 几乎没有区别!模型会变得**“犹豫不决”**。它混入了大量干扰项(9)的信息,导致最终提取出的特征变得模糊。
方案 B:Softmax
我们计算 :
- 总和
权重:
结果:
- 拉开差距: 原始分数只差 1 (10 vs 9),经过 Softmax 后,权重差距变成了近 3 倍 (0.73 vs 0.27)。Softmax 敏锐地放大了“稍微好一点”的那个选项。
- 降噪: 那个得分为 2 的噪声,被彻底压到了 0。
结论: Softmax 是一种 “软性的最大值” (Soft Maximum)。它让模型能够聚焦 (Focus)。如果用简单的 Sum,模型就变成了“雨露均沾”,失去了注意力的意义。
2. 数学上的必须性:非负性 (Positivity)
“直接根据 Sum 来分配 weight”,公式大概是 。这里有一个巨大的隐患:点积算出来的 Score 可以是负数!
- 如果 ,,点积是 。
- 如果你的 Score 列表是
[10, -5, -8]。 - 求和是 。
- 第一项的权重变成 。
权重变成了负数? 这在注意力机制里解释不通。我们要的是“加权平均”,通常要求权重必须是正的且和为 1(凸组合),这样才能保证输出的向量 不会飞出原本的特征空间。
Softmax 的优势:
永远是正数。不管你的点积算出 还是 ,Softmax 都能把它变成一个正的概率值(虽然很小),保证了加权求和在数学上的稳定性。
3. 梯度的“选拔”作用
你说 Softmax 导致梯度需要缩放(防止梯度消失),这是它的缺点。但反过来看,Softmax 的梯度特性正是它能训练出好模型的关键。
Softmax 的导数特点是:只有当两个分数的竞争非常激烈时,梯度才最大。
- 如果一个是 100,一个是 0(胜负已分),Softmax 认为不需要调整了,梯度趋近 0。
- 如果一个是 10,一个是 9.9(难分伯仲),Softmax 会产生很大的梯度,告诉前面的层:“嘿,你得把这两个区分开!去更新权重,让 10 变得更大,让 9.9 变得更小!”
这种机制迫使模型去学习如何区分相似的词,而不是仅仅记住一堆平均值。
总结
为什么一定要 Softmax,哪怕要为了它专门搞一个 Scaling?
- 非线性 (Non-linearity): 神经网络需要非线性才能拟合复杂函数。单纯的除以 Sum 是线性变换,能力有限。
- 聚焦 (Selectivity): Softmax 能把微小的分数差异放大,让模型敢于“做决定”,关注最重要的那个词。
- 非负性 (Positivity): 解决了点积出现负数时权重分配的数学灾难。
- 可导的 Hardmax: 我们其实最想要的是
Hardmax(只取最大的那个,其他全为0),但 Hardmax 不可导。Softmax 是我们能找到的、最接近 Hardmax 且处处可导的完美替代品。
所以,Scaling () 就像是我们要使用 Softmax 这把“利剑”所必须支付的“保养费”。为了它的聚焦能力,这个代价是值得的。