解题思路
核心思路是按 Post-LN 顺序模拟一层 Transformer Encoder:权重全部是 4×4 单位阵,因此 Q=K=V=x。把最后一维切成 h=2 个头(每头 dk=2),每个头做缩放点积注意力,拼接后再加残差并做 LayerNorm;FFN 在本题退化为逐元素 ReLU,再加残差并做一次 LayerNorm。
实现方法:
- 读入 8 个数,reshape 成 (1,2,4)。
- 对每个头计算 softmax(QK⊤/dk)V,softmax 先减行最大值。
- LayerNorm 在最后一维上用总体方差(除以 4),ε=10−5。
题目描述
实现一层标准的 Transformer Encoder Layer。该层依次包含两个子层:
- 多头自注意力(Multi-Head Self-Attention, MHSA)
- 逐位置前馈网络(Position-wise Feed-Forward Network, FFN)
每个子层的计算完成之后,立刻做残差连接,再做层归一化(Post-LN):
SublayerOut=LayerNorm(x+Sublayer(x))
整层顺序为:先对输入做 MHSA 子层(残差 + LN),再对结果做 FFN 子层(残差 + LN)。
固定设定
为使评测结果唯一,按下述约定实现,不要自行改成 Pre-LN 或改权重。
- 输入张量 x 的形状为 (batch,seq,d_model)=(1,2,4)。
- 头数 h=2,因此每头维度 dk=dmodel/h=2。
- 注意力与输出投影、FFN 的权重均为 4×4 单位矩阵:WQ=WK=WV=WO=W1=W2=I。
- FFN 偏置 b1=b2=0。
- 层归一化的 γ=1,β=0,ε=10−5。均值与方差都在最后一个维度上统计,方差用总体方差(除以 dmodel,不要除以 dmodel−1)。
公式
缩放点积注意力(每个头内独立计算,在序列维上做 softmax):
Attention(Q,K,V)=softmax(dkQK⊤)V
多头拼接后再乘输出投影:
MultiHead(Q,K,V)=Concat(head1,…,headh)WO
切分方式:把最后一维按长度 dk 切成 h 段,第 t 个头取特征区间 [t⋅dk,(t+1)⋅dk)。
层归一化:
LayerNorm(x)=Var[x]+εx−E[x]⋅γ+β
FFN(ReLU):
FFN(x)=max(0,xW1+b1)W2+b2
softmax 在实现时先减去当前行最大值再 exp,避免溢出。
输入描述
一行 8 个实数,按行优先给出 x,即
x[0,0,0], x[0,0,1], x[0,0,2], x[0,0,3], x[0,1,0], x[0,1,1], x[0,1,2], x[0,1,3]
输出描述
一行 8 个实数,把形状为 (1,2,4) 的输出按同样顺序平铺。每个数四舍五入到小数点后 2 位。
数据范围
8 个分量均满足 ∣xi∣≤50。
样例1
输入
2.00 0.00 0.00 0.00 0.00 2.00 0.00 0.00
输出
1.73 -0.55 -0.59 -0.59 -0.55 1.73 -0.59 -0.59
说明
两个位置分别是 (2,0,0,0) 与 (0,2,0,0)。
第 0 个头上,Q=K=V 为 [(2,0), (0,2)],缩放后得分矩阵对角线为 4/2=22≈2.828,另一侧为 0。softmax 后约 [(0.944,0.056), (0.056,0.944)],该头输出约 [(1.888,0.112), (0.112,1.888)]。第 1 个头全 0,拼接后与 x 相加再 LN、ReLU、残差、LN,得到上述输出。
若把残差拿掉,或改成 Pre-LN,第一维不会落到 1.73。
样例2
输入
1.00 0.00 1.00 0.00 0.00 1.00 0.00 1.00
输出
1.00 -1.00 1.00 -1.00 -1.00 1.00 -1.00 1.00
说明
两个位置为 (1,0,1,0) 与 (0,1,0,1),两个头的 Q,K,V 相同。MHSA 后与 x 相加,每个位置都是两个 1.670 与两个 0.330 交错;第一次 LN 已把它们变成 ±1。ReLU 只保留正分量,第二次 LN 后仍是 ±1.00 的交错图案。