本题要求实现一个两层的 Decoder,每层包含因果自注意力和前馈网络(FFN)两个部分,并在每个子层后加入残差连接。
对于输入 X∈RB×N×D,每一层执行如下操作:
计算:
本题为群友提供,26年拼多多大模型岗一面,面试官出的题目
实现一个两层带因果注意力(Causal Attention)的 Decoder 核心模块。
给定:
B,表示 batch 大小;N,表示序列长度;D,表示特征维度;x,其中 x[b][i] 表示第 b 个样本中第 i 个位置的输入向量,长度为 D;params。你需要按照如下规则,完成一个两层 Decoder 的前向计算:
对于每一层,依次执行以下两个子层:
因果自注意力子层
对输入 X 分别计算:
Q = XWqK = XWkV = XWv注意力分数计算为:
加入因果掩码:
j > i,则位置 i 不能看到位置 j计算:
前馈网络子层
第 1 层的输出作为第 2 层的输入,最终输出第 2 层的结果。
每一层参数包括:
Wq:形状为 D × DWk:形状为 D × DWv:形状为 D × DW1:形状为 D × Db1:长度为 DW2:形状为 D × Db2:长度为 D你需要返回一个形状为 (B, N, D) 的三维数组,表示两层 Decoder 的最终输出。
注意:
1e-6。输入:
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