这是一个 Post-Norm 的 Encoder Block。先把 X 投影成 Q,K,V,按 h 拆头。每个头做 softmax(QK⊤/dk)V,拼起来再乘 WO。softmax 前减去每一行的最大值,避免指数溢出。
残差之后做 LayerNorm。均值和方差都沿最后一维计算,方差除以 dmodel,分母是 var+eps。
前馈是两层线性,中间加 ReLU。再和第一层 LayerNorm 的输出相加,做第二次 LayerNorm。注意力投影没有偏置。
实现 Transformer Encoder Block 的前向计算,结构是 Post-Norm,不使用 Dropout,所有位置之间都可以做注意力。
输入 X 的形状是 B×T×dmodel。用 WQ,WK,WV 把 X 投影成 Q,K,V,再拆成 h 个头,每个头的维度 dk=dmodel/h。每个头计算缩放点积注意力,缩放因子是 dk,然后拼回去,乘 WO。
第一层残差和 LayerNorm:LN(X+Attn)。LayerNorm 做在最后一维上,方差除以 dmodel,再加上 eps。gamma、beta 按最后一维相乘相加。
前馈网络是 ReLU(X1W1+b1)W2+b2。W1 的形状是 dmodel×dff,W2 的形状是 dff×dmodel。再做一次残差和 LayerNorm,得到 Y。
实现 class Solution 的 forward(self, X, W_Q, W_K, W_V, W_O, h, W_1, W_2, b_1, b_2, gamma_1, gamma_2, beta_1, beta_2, eps)。注意力投影和输出投影没有额外偏置。
第一行五个整数 B,T,dmodel,h,dff。
接着按下面的顺序给出浮点数,每个矩阵按行排列:
X 共 B×T 行,每行 dmodel 个数。
WQ,WK,WV,WO 各 dmodel 行,每行 dmodel 个数。
W1 共 dmodel 行,每行 dff 个数。下一行是 b1。
W2 共 dff 行,每行 dmodel 个数。下一行是 b2。
然后四行依次是 gamma1,beta1,gamma2,beta2,每行 dmodel 个数。
最后一行一个浮点数 eps。
1≤B≤4
1≤T≤48
1≤dmodel≤32,h 整除 dmodel
1≤dff≤64
10−8≤eps≤10−3
输入和权重的绝对值不超过 5。
按 batch、再按时间步输出 Y,一共 B×T 行,每行 dmodel 个浮点数,保留 6 位小数。
输入
1 2 2 2 2
1.00 2.00
3.00 0.00
1.00 0.00
0.00 1.00
1.00 0.00
0.00 1.00
1.00 0.00
0.00 1.00
1.00 0.00
0.00 1.00
1.00 0.00
0.00 1.00
0.00 0.00
1.00 0.00
0.00 1.00
0.00 0.00
1.00 1.00
0.00 0.00
1.00 1.00
0.00 0.00
1e-05
输出
-0.999998 0.999998
0.999998 -0.999998
说明
B=1,T=2,dmodel=2,h=2,dff=2。四个注意力矩阵和两个前馈矩阵都是单位矩阵,偏置是 0,gamma 是 1,beta 是 0。X 是 [[1,2],[3,0]]。每个头的维度是 1。注意力输出再走两次 Post-Norm 之后,得到上面两行。
输入
1 1 1 1 1
2.00
1.00
1.00
1.00
1.00
1.00
0.00
1.00
0.00
1.00
0.00
1.00
0.00
1e-05
输出
0.000000
说明
只有一个数。LayerNorm 时方差是 0,归一化结果是 0,后面的 ReLU 和第二次 LayerNorm 仍然是 0。
© CodeFun2000 · 使用条款
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册