实验元数据 (Meta Data)
实验编号/标题:Transformer 实验
日期:2026-02-23
所属领域/标签:#Transformer #数据结构
耗时:08:32 -
🎯 实验前:假设与目标 (Plan)
当前问题 (Problem):我需要了解 Transformer 的结构
实验目标 (Objective):验证并模拟 Transformer 的底层数据结构
核心假设 (Hypothesis):
🧪 实验中:执行步骤与变量 (Do)
准备工作/工具:
控制变量 (Variable)
执行步骤 (Log):
设定:词表、输入、模型参数
词表 V=5,5 个 token
| token | id |
|---|---|
| A | 0 |
| B | 1 |
| C | 2 |
| D | 3 |
| E | 4 |
输入序列 T=3,Prompt 是:A C B,token ids: [0 2 1]
模型看到 A C B 后,下一个 token 最可能是什么。
Embedding + 位置:把 token 变成向量
1.1 Token embedding 每个 token 2 维
embedding 表:
E[A] = [1,0], E[B] = [0, 1], E[C] = [1, 1] E[D] = [-1, 1], E[E] = [0, -1]
1.2 位置向量(每个位置 2 维)
P1 = [0.1,0.0] P2 = [0.0,0.1] P3=[0.1,0.1]
1.3 初始隐藏状态 H0
ht = E[tokent] + Pt
h1 = [1,0] + [0.1,0] = [1.1, 0]
$$ H_0 = \begin{bmatrix} 1.1 & 0 \\ 1 & 1.1 \\ 0.1 & 1.1 \\ \end{bmatrix} $$
一层 Transformer Block:Attention + Residual + MLP + Residual
2.1 Attension
令 $W_Q=W_K=W_V=I$
$Q=K=V=H0$
2.2 位置 3 的 Attention 输出
Step A: 算分数 $s_{3,i} = \frac {q_3\cdot k_i} {\sqrt 2}$
$s_3=[0.0778,0.9269,0.8626]$
mask 对 t=3 不影响,因为 1..3 都允许看。
Step B: softmax 得注意力权重 $a_3$
- exp(0.0778) = 1.0808
- exp(0.9269) = 2.5267
- exp(0.8626) = 2.3693
总和 = 5.9768
权重:
- a_{3,1} = 1.0808/5.9768 = 0.1808
Step C: 加权求和 Value 得输出
$o_3 = \sum_i a_{3,i}v_i = [0.6613,0.9011]$
最后一个 token 的新表示,把历史 token 的信息按权重融合进来
Residual 1: 把 Attention 输出加回去
$$ h3’=h3+o3=[0.7613,2.0011] $$
MLP 在做一次非线性加工
先缩放一半再 ReLu,这里都为正 ReLu 不变
$m_3 = 0.5\cdot h_3’=[0.3807,1.0006]$
Residual2: 把 MLP 输出再加回去
$h_3’’=h_3’+m3=[1.1420,3.0017]$
$h_{last}=[1.1415,3.0015$
输出头 hidden->logits->概率
词表输出矩阵
给每个 token 一个 2 维列向量
A 列: [0.2, -0.1] B 列: [-0.2, 0.1] C 列: [0.0, 0.2] D 列: [0.1, 0.4] E 列: [-0.1, -0.3]
logits 计算 $logits=h_{last}\cdotW_{out}$
对每个 token v, $logit_v = h_{last} \cdot W_{out}^{(v)}$
logits=[-0.0719,0.0719,0.6003,1.3148,-1.0147]
对应 [A,B,C,D,E]
softmax 得到下一 token 的概率
P(A) = 0.1176 P(B) = 0.1358 P(C) = 0.2304 P(D) = 0.4707 P(E) = 0.0458
模型认为下一 token 最可能是 D。
👁️ 实验后:现象与数据 (Check)
🧠 深度复盘:分析与结论 (Act)
Transformer 在做什么
把 Transformer 想象成一个上下文混合器:
- 输入是一串 token。
- 每一层都会让每个 token 去参考别的 token,把重要信息拿过来(Attention)
- 最后模型输出下一个 token 是什么的概率分布
每一层都在做“看全文->挑重点->融合信息->更新表示“。
举例:有一个句子
“小明把苹果给了小红,因为 __ 很饿”
你需要模型知道“很饿”的主语更可能是“小明”(给了苹果所以自己饿)还是“小红”(拿到苹果也可能饿)。
这类指代/语义关联,要靠“看上下文”。
Attention 的工作就是:
让当前这个位置的 token,去上下文里找最相关的 token,把它们的信息融合进来。
Attention 一次计算的过程
假设在处理第 t 个 token,有一个向量表示 $x_t$,来自(embedding + 前几层)
Step1:生成 Q/K/V(三份“同一个 token 的不同用途版本)
对每个 token 的表示 x,分别做三次线性变换:
- $q = x{W_q}$(Query,我想找什么)
- $k = x{W_k}$(Key,我能被怎么匹配)
- $v = x{W_v}$(Value,我真正提供的内容)
用起来的意思是:
- 用 q 去和所有 k 计算相似度,决定该看谁。
- 最后拿到是 v 的加权和,决定“抄什么内容回来“
Q/K 负责找人,V 负责搬运信息。
Step2:算相似度分数(“我和你相关吗?“)
对第 t 个 token 的 query $q_t$,和每个位置 i 的 key $k_i$ 做点积
$$ s_{t,i} = \frac {q_t\cdot k_i}{\sqrt{d}} $$
$s_{t,i}$ 大:说明 t 更想关注 i
除以 $\sqrt d$:让数值别太大,否则 softmax 会变成 0/1,训练不稳
现在得到一排分数:[2.3, 0.1, …]
不是权重,只是偏好分
Step3: softmax 算权重
对一排分数做 softmax:
$$ a_{t,i} = softmax(s_{t,*})_i $$
- 全部权重 >=0
- 权重加起来 = 1
- 分数最大的 token 会得到最大的权重
- 权重就是我抄他信息到比例
Step4:用权重对 V 做加权求和(真正的融合信息)
$$ o_t=\sum_i a_{t,i}v_i $$
第 t 个 token 的新表示 $o_t$ 是从别的 token“按比例抄来的综合信息“。
例子
3 个 token:[小明,给,苹果],假设现在要更新 token 苹果的表示,让它知道苹果是被给出去的东西。
已知(假设算出来的 Q/K/V)
- 对苹果得到 query:$q_{苹果}=[1,0]$
- 三个 token 的 key
- $k_{小明}=[1,0]$
- $k_{给}=[2,0]$
- $k_{苹果}=[0,1]$
- 三个 token 的 value
- $v_{小明}=[10,0]$(代表主体信息)
- $v_{给}=[0,10]$(代表动作信息)
- $v_{苹果}=[1,1]$(自身信息)
算相似度(点积)
用 $q_{苹果}=[1,0]$ 去点积每个 k:
- 和小明:$1\cdot 1+0\cdot 0 = 1$
- 和给:$1\cdot 2 + 0\cdot 0 = 2$
- 和苹果:$1\cdot 0 + 0\cdot 1 = 0$
softmax 得权重
softmax(1,2,0) 大致权重会偏向 2:
- 给最大 -> 权重大, 0.66
- 小明次之,0.24
- 苹果最小,0.1
加权求和 V
$$ o_{苹果} = 0.24[10,0] + 0.66[0,10] + 0.10[1,1] = [2.5,6.7] $$
从输入到输出流水线
Tokenization 把文字变为 token ID
- 文字无法直接进神经网络,需要先变成数字(token ID)
- tokenizer 会把文本切分成小块:可能是字、词、子词。
- 输出是一串整数:[314,25,908,…]
Embedding:把 token ID 变成向量
- tokenId 只有编号,没有语义
- embedding 表就是一个大字典:每个 token 映射到一个向量
- 得到矩阵 X:形状是 [序列长度 T,隐藏维度 d]
- embedding 是把编号变成可计算的语义坐标
Position:告诉模型顺序
Transformer 本身不自带顺序概念 加位置编码:
- 绝对位置:第一个 token、第二个 token
- RoPE(旋转位置编码):更常见,擅长长上下文
下一步行动 (Next Actions):
✅ 验证通过,纳入标准流程。
❓ 产生新问题:验证 Redis ZSet 的底层结构

