完整教程:从另一个视角看Transformer:注意力机制就是可微分的k-NN算法

news/2025/9/27 9:04:49/文章来源:https://www.cnblogs.com/ljbguanli/p/19114739

完整教程:从另一个视角看Transformer:注意力机制就是可微分的k-NN算法

注意力机制听起来很玄乎,但我们可以把它看作一个软k-NN算法。查询向量问:“谁跟我最像?”,softmax投票,相似的邻居们返回一个加权平均值。这就是注意力头的另外一种解释: 一个可微分的软k-NN:计算相似度 → softmax转换为权重 → 对邻居值求加权平均。

通过

1/sqrt(d)

缩放防止softmax在高维时饱和,掩码决定哪些位置可以互相"看见"(处理因果关系、填充等问题)。

想象有个查询向量 在问:“哪些token跟我相似?”

接下来就是三步走:

  • 把 跟每个 做比较,算出相似度分数
  • Softmax把这些分数归一化成概率分布(分数越高权重越大)
  • 用这些权重对向量 做加权平均

这就是注意力的另外一种解释:考虑序列顺序的软邻居平均算法。

数学推导

单注意力头,键/查询维度是 ,值维度是

相似度计算用缩放点积:

可选的掩码操作:

按行做softmax得到权重:

最后计算值的加权平均:

为什么要除以 sqrt(d)?

随机d维向量的点积会按 O(sqrt(d)) 增长。不做缩放的话,softmax就变成了胜者通吃(一个权重接近1,其他都接近0),梯度直接就消失了,所以除以sqrt(d)能让分数方差保持在合理范围,这样softmax的熵也就稳定了。

掩码的作用

掩码 在softmax之前加入:

因果掩码用于语言建模,阻止位置 t 看到 j > t 的未来信息。填充掩码则屏蔽那些占位符token。数学上就是 A=softmax(S+M),其中 Mᵢⱼ=0 表示允许,-∞ 表示阻塞。

软k-NN的不同变体

换个相似度函数就是换个归纳偏置:

点积考虑方向和幅度:

余弦相似度只看角度,忽略长度:

负距离(RBF风格)专注欧几里得邻域:

之后都是 softmax → 权重 → 加权平均。温度参数τ控制软硬程度:τ越小越尖锐,越像argmax。

NumPy最小实现

目标很简单:清晰胜过速度。

import numpy as np
def softmax(x, axis=-1):
x = x - np.max(x, axis=axis, keepdims=True)   # numerical stability
ex = np.exp(x)
return ex / np.sum(ex, axis=axis, keepdims=True)
def attention(Q, K, V, mask=None):
"""
Q: (n_q, d), K: (n_k, d), V: (n_k, d_v)
mask: (n_q, n_k) with 0=keep, -inf=block (or None)
Returns: (n_q, d_v), (n_q, n_k)
"""
d = Q.shape[-1]
scores = (Q @ K.T) / np.sqrt(d)              # (n_q, n_k)
if mask is not None:
scores = scores + mask
weights = softmax(scores, axis=-1)           # (n_q, n_k)
return weights @ V, weights

简单实验:6个二维token

创建6个token embedding和一个查询,看看权重分配:

# toy data
np.random.seed(7)
n_tokens, d, d_v = 6, 2, 2
K = np.array([[ 1.0,  0.2],
[ 0.9,  0.1],
[ 0.2,  1.0],
[-0.2,  0.9],
[ 0.0, -1.0],
[-1.0, -0.6]])
# Values as a simple linear map of keys (for intuition)
Wv = np.array([[0.7, 0.1],
[0.2, 0.9]])
V = K @ Wv
# Query near the first cluster
Q = np.array([[0.8, 0.15]])  # (1, d)
out, W = attention(Q, K, V)
print("Attention weights:", np.round(W, 3))
print("Output vector:",    np.round(out, 3))
# -> weights ~ heavier on the first two neighbors
Attention weights: [[0.252 0.236 0.174 0.138 0.126 0.075]]
Output vector: [[0.318 0.221]]

权重可视化:

查询通过缩放点积+softmax给键分配概率(权重和为1),大部分权重落在最近的邻居上(0≈0.25,1≈0.24),输出就是这些值的加权平均。所以可以说注意力就是软k-NN

使用几何视角更直观:

查询(★)感受到来自附近键(●)的加权拉力,箭头长度正比于注意力权重。输出(✖)就是邻居们的加权重心。

三种相似度的对比

试试不同的相似度函数:

def attention_with_sim(Q, K, V, sim="dot", tau=1.0, eps=1e-9):
if sim == "dot":
scores = (Q @ K.T) / np.sqrt(K.shape[-1])
elif sim == "cos":
Qn = Q / (np.linalg.norm(Q, axis=-1, keepdims=True) + eps)
Kn = K / (np.linalg.norm(K, axis=-1, keepdims=True) + eps)
scores = (Qn @ Kn.T) / tau
elif sim == "rbf":
# scores = -||q-k||^2 / (2*tau^2)
q2 = np.sum(Q**2, axis=-1, keepdims=True)        # (n_q, 1)
k2 = np.sum(K**2, axis=-1, keepdims=True).T      # (1, n_k)
qk = Q @ K.T                                     # (n_q, n_k)
d2 = q2 + k2 - 2*qk
scores = -d2 / (2 * tau**2)
else:
raise ValueError("sim in {dot, cos, rbf}")
W = softmax(scores, axis=-1)
return W @ V, W, scores
for sim in ["dot", "cos", "rbf"]:
out_s, W_s, _ = attention_with_sim(Q, K, V, sim=sim, tau=0.5)
print(sim, "weights:", np.round(W_s, 3), "out:", np.round(out_s, 3))
[#结果](#结果)
dot weights: [[0.252 0.236 0.174 0.138 0.126 0.075]] out: [[0.318 0.221]]
cos weights: [[0.397 0.394 0.113 0.05 0.037 0.008]] out: [[0.576 0.287]]
rbf weights: [[0.443 0.471 0.055 0.021 0.01 0. ]] out: [[0.651 0.268]]

相似度选择就是归纳偏置选择。余弦看角度,RBF看距离,点积两者兼顾。

同一个查询,三种视角。余弦和RBF在最近键上更加聚焦,点积分布相对均匀。

因果掩码和填充掩码

语言建模里经常用到:

因果掩码防止模型偷看未来,位置 t 不能看到 > t 的内容。填充掩码忽略那些没有实际内容的占位符。

# Causal mask for sequence length n (upper-triangular blocked)
n = 6
mask = np.triu(np.ones((n, n)) * -1e9, k=1)
# Visualize structure by setting Q=K=V (toy embeddings)
X = K
out_seq, A = attention(X, X, X, mask=mask)
# Row sums stay 1.0 (softmax is row-wise):
print(np.allclose(np.sum(A, axis=1), 1.0))
[#True](#True)

严格的下三角结构 —— 每个位置只能看到自己和过去的信息。

填充掩码就简单了:构建布尔掩码,填充位置设为-∞,复用同一个attention函数即可。

缩放为什么有效?

用随机高维向量实验一下:

def entropy(p, axis=-1, eps=1e-12):
p = np.clip(p, eps, 1.0)
return -np.sum(p * np.log(p), axis=axis)
nq = nk = 64
dims = [256*(2**i) for i in range(7)]  # 256..16,384
trials = 5
H_max = np.log(nk)
for dim in dims:
H_u = []
H_s = []
for _ in range(trials):
Q = np.random.randn(nq, dim)
K = np.random.randn(nk, dim)
S_unscaled = Q @ K.T
S_scaled   = S_unscaled / np.sqrt(dim)
H_u.append(entropy(softmax(S_unscaled, axis=-1), axis=-1).mean())
H_s.append(entropy(softmax(S_scaled,   axis=-1), axis=-1).mean())
print(f"{dim:>6}  | unscaled: {np.mean(H_u):.3f}  scaled: {np.mean(H_s):.3f}  (max={H_max:.3f})")
[#结果](#结果)
256 | unscaled: 0.280 scaled: 3.686 (max=4.159)
512 | unscaled: 0.165 scaled: 3.672 (max=4.159)
1024 | unscaled: 0.124 scaled: 3.682 (max=4.159)
2048 | unscaled: 0.078 scaled: 3.669 (max=4.159)
4096 | unscaled: 0.063 scaled: 3.689 (max=4.159)
8192 | unscaled: 0.041 scaled: 3.685 (max=4.159)
16384 | unscaled: 0.024 scaled: 3.694 (max=4.159)

可以看到,缩放让softmax更加可靠。

数据很明显:未缩放时熵只有0.07-0.28,缩放后保持在3.68附近。64个键的最大熵是ln(64)≈4.16。

不缩放→接近独热分布:一个键可以霸占所有权重,梯度消失。

缩放后→高熵,权重分散:多个邻居都有贡献,梯度健康。

原理很简单:独立同分布随机向量的点积方差∝d。维度增长时logits变大,softmax饱和。除以sqrt(d)把logit方差归一化到O(1),保持softmax"温度"恒定。

1/sqrt(d)维护了可训练性和稳定性 —— 注意力保持软k-NN特性,不会退化成硬argmax。

一些常见问题

相似度太平→输出模糊。降低温度/提高缩放;训练投影矩阵W_Q、W_K分离token。

某个token占主导→过于自信,系统脆弱。调节温度、加attention dropout、增加多头多样性。

选错度量→关注错了重点。角度问题用余弦;距离问题用RBF;需要考虑幅度用点积。

从基础到Transformer

加上可学习的投影矩阵:

复制h个头,拼接输出再用W_O混合 ,所以还是软邻居平均,只是这是在多个学习子空间里并行。

总结

注意力机制没那么神秘,可以把它想象成带可学习投影的软k-NN。查询问"谁像我",softmax把相似度转成分布,输出就是加权平均。

只不过它多了两个关键调节器:

1/sqrt(d)缩放保持logits在O(1)范围,维持熵的稳定性。实验证明没有它会饱和(近似argmax),有它就能保持健康的软性。

掩码控制信息流:因果掩码防止偷看未来,填充掩码忽略无效内容。

相似度选择就是归纳偏置选择:点积(幅度+方向)、余弦(角度)、RBF(欧氏距离)。多头就是在并行子空间里跑这套逻辑然后混合结果。

所以如果你还不理解注意力,可以直接把它,注意力就是一个带温控的概率邻居平均算法。温度设对了(1/sqrt(d)),邻域选对了(相似度+掩码),剩下的就是工程实现了。

https://avoid.overfit.cn/post/036fe92cd30245fbb4d7ff97f5301c36

作者:Joseph Robinson, Ph.D.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/919275.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

哈尔滨电子网站建设个人建网站一般多少钱?

一、自动化测试基本介绍 1 自动化测试概述: 什么是自动化测试?一般说来所有能替代人工测试的方式都属于自动化测试,即通过工具和脚本来模拟人执行用例的过程。 2 自动化测试的作用 减少软件测试时间与成本改进软件质量通过扩大测试覆盖率…

ACM 杂题选做 题解合集

太困难QOJ #7509 01 Tree 翻转深度为奇数的点的颜色,将操作变为交换相邻的 \(\tt 0\) 点和 \(\tt 1\) 点。 对于每条边考虑,其施加操作的次数为 \(s\) 与 \(t\) 在其子树中 \(\tt 1\) 的个数差的绝对值。 所以对于串…

| 和 || 的区别详解及应用场景对比

|与||的区别 在众多编程语言中,|与||代表了不同的运算。其中|是按位或运算,||是逻辑或运算。 从字面意思来理解,|常可以用于具体数值的计算,结果为数值,而||是用来逻辑运算的,结果只有False或者True。例如: int…

准备建网站该怎么做网站改版对优化的影响

buffer busy waitshttp://metalink.oracle.com/metalink/plsql/ml2_documents.showDocument?p_database_idNOT&p_id34405.1当会话想要访问缓冲存储器中的数据块,而该数据块正在被其它会话使用时产生buffer busywaits事件。其它会话可能正在从数据文件向缓冲区存…

网站分成推广怎么做西部数码wordpress

我有一个带有OAuth2授权和资源服务器的spring boot设置.用户可以通过向/ oauth / token发出POST请求来获取令牌.到现在为止还挺好.但是,我不想通过BASIC auth保护/ oauth / token,而是通过自定义安全过滤器.我尝试了以下内容,但从未调用过DemoAuthenticationFilter:…

伊春网络建站公司网络营销的方式有哪些

https://docs.nvidia.com/cuda/wsl-user-guide/index.html 这个写的很详细

Kubernetes技巧:使用Prometheus监控Pod性能指标

监控Kubernetes集群中的Pod性能是确保应用健康和高效的关键。Prometheus是一个开源的监控和警报工具,被广泛用于收集和存储Kubernetes集群的性能指标。现在,我们就来探索如何使用Prometheus以一个有趣且形象的方式来…

全国网站建设开发公司网签物料

背景 git bash默认字体太小了,每次读信息都要伸头盯着屏幕,很不自在,不符合我的风格,so let’s do it! 修改前的git bash: 正确的打开方式 1、在任意目录下,右键选择“Git Bash Here”&…

如何加强校园网站建设高端网站制作软件

进程间通信机制(IPC) 简述 IPC:Inter Process Communication 进程和进程之间的用户空间相互独立,但是4G内核空间共享,进程间的通信就是通过这4G的内核空间 分类 传统的进程间通信机制 无名管道(pipe) 有名管道&…

2025.9.27——1橙

普及- P2430 严酷的训练 题目描述的乱七八糟的,实际上就是一个简单的背包。

深入解析:Python实现蝗虫优化算法(Grasshopper Optimization Algorithm, GOA)(附完整代码)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

提升网站转化率西海岸新区城市建设局公示网站

1、Stream 概述 Java 8 引入了 Stream API,它是一种用于简化集合和数组操作的强大工具。Stream API 允许我们将集合或数组视为流,并在流上进行各种操作,如筛选、排序、聚合等。 Stream API 的核心概念是 Stream 流,它代表了一个数据流,其中包含了一系列的元素。这些元素…

知名网站定制报价网页前端设计包括哪些内容

一、计算机简介: 1、计算机系统组成:软件和硬件,二者紧密相关,缺一不可 1.1硬件:计算机系统的物质基础,软件的载体 1.1.1硬件系统:主机(中央处理器(CPU,一般CPU由计算器和…

哪个网站可以做设计赚钱汽车门户网站开发

前言 最近发现有挺多人喜欢径向基函数(Radial Basis Function,RBF)神经网络,其实它就是将RBF作为神经网络层间的一种连接方式而已。这里做一个简单的描述和找了个代码解读。 之前也写过一篇,不过排版不好看,可以戳这里跳转 国际惯例&#x…

在Java 12环境中配置和部署Apache Tomcat

在Linux系统中,远程服务器的文件夹可以通过多种协议进行挂载,如NFS、SSHFS、CIFS等。要使这个过程像一场有趣的旅行一样,我们会“打包”(准备必要的工具),“规划路线”(确定连接的细节),然后“出发”(执行挂…

android pdf框架-14,mupdf重排 - 详解

android pdf框架-14,mupdf重排 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mona…

深入解析:UE5GAS GameAbility源码解析 CommitAbility

深入解析:UE5GAS GameAbility源码解析 CommitAbility2025-09-27 08:43 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; di…

详细介绍:基于物联网的智能衣柜系统的设计(论文+源码)

详细介绍:基于物联网的智能衣柜系统的设计(论文+源码)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas…

电子商务平台 网站 建设方式博达网站建设怎么建立下载

成员函数和成员变量是分开存储的 1. 非静态成员变量,属于类的一部分,sizeof(类名)的时候会包括进去 2. 静态成员变量,不属于类的一部分,不会影响类的大小 3. 成员函数,都不属于类的一部分 4. 空类大小为1B

上海做网站好的公司有哪些安卓优化大师旧版本

Acrobat Pro DC 2023是一款功能强大的PDF编辑和管理软件,它可以帮助用户在创建、编辑、转换和共享PDF文档方面达到前所未有的高度。这款软件提供了丰富的编辑功能,使用户能够轻松添加注释、高亮、下划线、插入文本等,自由地编辑PDF文档。除了…