题目内容
实现 MLA(Multi-head Latent Attention)的前向传播。MLA 是 DeepSeek-V2 提出的注意力机制,核心是把 Key 和 Value 压缩到低维潜变量,从而大幅减少推理时的 KV 缓存。
本题同时包含解耦 RoPE:内容部分(NoPE)与位置部分分开。为简化,旋转之后的位置向量直接给出,不需要自行实现 RoPE。
给定输入 X(N×d)。按头计算,每头内容维度为 dh。可见计算步骤为:
- 低秩压缩(KV 共享潜变量,位置部分单独给出):
- Ckv=XWDKV,Cq=XWDQ。
- 内容 Query / Key / Value 由潜变量上投影:Qc=CqWUQ,Kc=CkvWUK,V=CkvWUV。
- 位置部分 Qr、Kr 由输入中的对应投影得到(已经是旋转后的向量)。
- 每个头把内容分数和位置分数相加,再做因果掩码与 softmax:
scores=dhQcKcT+dropeQrKrT
j≤i 的位置保留,j>i(未来 token)置为 −∞。然后 weights=softmax(scores),head=weightsV。
- 各头拼接后经输出投影 Wo 得到最终输出。
输入描述
第一行输入七个整数 N,d,nh,nq,dc,dh,drope(1≤N≤12,1≤d≤8,1≤nh,nq,dc,dh,drope≤4),依次表示序列长度、模型维度、头数、Query 潜变量维度、KV 潜变量维度、每头内容维度、位置维度。
随后按行输入浮点数矩阵,元素空格分隔,顺序为:
- X:N×d
- WDQ:d×nq
- WUQ:nq×(nh⋅dh)
- WDKV:d×dc
- WUK:dc×(nh⋅dh)
- WUV:dc×(nh⋅dh)
- WQR:d×(nh⋅drope),用于得到已经旋转后的 Qr=XWQR
- WKR:d×drope,用于得到已经旋转后的 Kr=XWKR
- Wo:(nh⋅dh)×d
位置向量不再单独输入,按上述两个投影得到。
输出描述
输出 N 行,每行 d 个浮点数,表示 MLA 前向结果,保留 4 位小数。
样例 1
输入
2 2 1 1 1 1 1
1.0000 0.0000
0.0000 1.0000
1.0000
0.0000
1.0000
0.0000
1.0000
1.0000
1.0000
1.0000
0.0000
0.0000
1.0000
1.0000 0.0000
输出
0.0000 0.0000
0.5000 0.0000
说明
单头。Ckv=XWDKV 得到低维潜变量,内容分数与位置分数相加后再 softmax。因果掩码把上三角置为 −∞,因此第二个 token 只能看到自己。
样例 2
输入
2 2 1 1 1 1 1
1.6243 -0.6118
-0.5282 -1.0730
0.8654
-2.3015
1.7448
-0.7612
0.3190
-0.2494
1.4621
-2.0601
-0.3224
-0.3841
1.1338
-1.0999 -0.1724
输出
2.3022 0.3609
1.5942 0.2499
说明
维度与样例 1 相同,权重改为非平凡数值。dc=1,远小于展开后的 nh⋅dh 在更大配置下的规模;KV 仍先压到潜变量再上投影。