← 全部文章

Attention 到底是什么?其实就是一次「软查找」

不用被 Transformer 和那句 "Attention Is All You Need" 吓到。先只搞懂最小的一块——attention(注意力)。搞懂它,后面全是顺的。

先回忆一个你天天用的东西:哈希表

哈希表你太熟了:给一个 key → 取对应的 value。

Attention 就是它的"软版本":

  • 不是"精确匹配一个 key",而是和所有 key 算相似度;
  • 不是"只取一个 value",而是按相似度,加权混合所有 value。

一句话:

Attention = 一次「软查找」。

为什么叫"软"? 因为它是连续的、可微的——所以能反向传播、能被训练。普通哈希表做不到这一点,这正是关键。

三个角色:Q / K / V

名字含义(一句话)
Query(Q)我在找什么
Key(K)我是什么(用来被匹配)
Value(V)我的内容(被取走的东西)

一个最小的例子

3 个词:「猫 坐 垫子」。为了好算,每个词用一个 2 维向量表示(真实里是几百维,道理一样)。

猫   = [1, 0]
坐   = [0, 1]
垫子 = [1, 1]

最简情形让 Q = K = V = 输入(这就是 self-attention:自己看自己)。三步:

  1. 每个词的 Q 和所有 K 做点积 → 相似度分数;
  1. softmax → 变成权重(每行加起来 = 1);
  1. 用权重对所有 V 加权求和 → 输出。

20 行跑一遍

import numpy as np
np.set_printoptions(precision=2, suppress=True)

# 3 个词,每个 2 维(示意)
x = np.array([[1., 0.],   # 猫
              [0., 1.],   # 坐
              [1., 1.]])  # 垫子

def softmax(a):
    e = np.exp(a - a.max(axis=-1, keepdims=True))
    return e / e.sum(axis=-1, keepdims=True)

Q = K = V = x                        # 最简:Q/K/V 就是输入自己
scores  = Q @ K.T / np.sqrt(2)       # 相似度矩阵(点积)
weights = softmax(scores)            # 每行归一化成权重
out     = weights @ V                # 加权求和

print("权重:\n", weights)
print("输出:\n", out)

怎么读输出:weights[i][j] = "第 i 个词关注第 j 个词的程度"。 例如 weights[1] 就是"坐"在看谁——哪个权重大,它就"混进"了谁的信息。

你只要记住三件事

  1. Attention = 软查找:点积算相似度 → softmax 成权重 → 加权求和;
  1. Q / K / V:我在找什么 / 我是什么 / 我的内容;
  1. 因为可微,所以它能被训练——这才是它比"查表"强的地方。

下一篇:为什么需要 Multi-head?以及 attention 为什么"不认顺序"(于是要加位置编码)。

💬 看完这段,"attention"是不是没那么玄了?评论区聊聊。 🛠️ 需要嵌入式 / 边缘 AI / Agent 定制与咨询?见 关于页。

评论 0

还没有评论,来抢沙发~

登录 登录后即可参与评论