本题要求实现一个两层的 Decoder,每层包含因果自注意力和前馈网络(FFN)两个部分,并在每个子层后加入残差连接。
核心流程
对于输入 X∈RB×N×D,每一层执行如下操作:
1. 因果自注意力
计算:
P4791.两层的带因果注意力的decoder
本题为群友提供,27暑期实习拼多多大模型岗一面,面试官出的题目
题面描述
实现一个两层带因果注意力(Causal Attention)的 Decoder 核心模块。
给定:
- 一个整数
B,表示 batch 大小;
- 一个整数
N,表示序列长度;
- 一个整数
D,表示特征维度;
- 一个三维数组
x,其中 x[b][i] 表示第 b 个样本中第 i 个位置的输入向量,长度为 D;
- 两层 Decoder 的参数
params。
你需要按照如下规则,完成一个两层 Decoder 的前向计算:
对于每一层,依次执行以下两个子层:
-
因果自注意力子层
score=DQKT
-
加入因果掩码:
- 若位置
j > i,则位置 i 不能看到位置 j
- 这些位置在 softmax 前应视为负无穷(或一个极小值)
-
计算:
attn=softmax(score)
A=attn⋅V
H=X+A
-
前馈网络子层
FFN(H)=ReLU(HW1+b1)W2+b2
Y=H+FFN(H)
第 1 层的输出作为第 2 层的输入,最终输出第 2 层的结果。
每一层参数包括:
Wq:形状为 D × D
Wk:形状为 D × D
Wv:形状为 D × D
W1:形状为 D × D
b1:长度为 D
W2:形状为 D × D
b2:长度为 D
你需要返回一个形状为 (B, N, D) 的三维数组,表示两层 Decoder 的最终输出。
注意:
- 只需要实现单头注意力的核心逻辑;
- 不要求实现 LayerNorm、Dropout、多头拆分等完整工程细节;
- softmax 按最后一个维度进行计算;
- 结果误差容忍度为
1e-6。
示例1
输入:
B = 1
N = 2
D = 2
x = [[[1.0, 0.0],
[0.0, 1.0]]]
params = {
"layer1": {
"Wq": [[1.0, 0.0], [0.0, 1.0]],
"Wk": [[1.0, 0.0], [0.0, 1.0]],
"Wv": [[1.0, 0.0], [0.0, 1.0]],
"W1": [[1.0, 0.0], [0.0, 1.0]],
"b1": [0.0, 0.0],
"W2": [[1.0, 0.0], [0.0, 1.0]],
"b2": [0.0, 0.0]
},
"layer2": {
"Wq": [[1.0, 0.0], [0.0, 1.0]],
"Wk": [[1.0, 0.0], [0.0, 1.0]],
"Wv": [[1.0, 0.0], [0.0, 1.0]],
"W1": [[1.0, 0.0], [0.0, 1.0]],
"b1": [0.0, 0.0],
"W2": [[1.0, 0.0], [0.0, 1.0]],
"b2": [0.0, 0.0]
}
}
输出:
result = [[[16.0,0.0],[2.65,13.35]]]
数据范围:
1 <= B <= 8
1 <= N <= 200
1 <= D <= 128
-1e3 <= x[b][i][j] <= 1e3
-1e3 <= params 中各参数元素值 <= 1e3