核心思路是按定义模拟:对每个查询位置 i 构造候选下标集合 Ci,计算点积分数,丢掉非正分数后取 Top-T,再用分数对 V 做加权和。
i 属于全局集合 P 时,Ci 是整个 [0,L);i 不是全局位时,Ci 等于局部窗口 [i−W,i+W](越界截断)再并上 P。窗口与 P 可能重叠,必须去重,否则同一 j 会被加两次。
分数 score(i,j)=Q[i]⋅K[j]。只保留 score>0 的位置(0 和负数都丢掉)。排序键是 (−score,j):分数大者优先,分数相同取更小下标。取前 T 个得到 Ai。Ai 为空则该行输出全 0,否则
给定三个整数矩阵 Q、K、V,尺寸均为 L×D,以及 G 个全局位置,它们构成集合 P。
对位置 i,先确定可参与注意力的下标集合 Ci:
Ci={{0,1,…,L−1},P∪{j∣0≤j<L, ∣i−j∣≤W},i∈Pi∈/P集合内同一位置只计一次。
对 j∈Ci,注意力分数定义为
score(i,j)=x=0∑D−1Q[i][x]⋅K[j][x]只保留满足 score(i,j)>0 的位置,再从中选出至多 T 个分数最大的候选,得到 Ai。分数相同时,下标 j 较小者优先。若正分数候选个数不超过 T,则全部保留。
输出矩阵 O:当 Ai 非空时
O[i][x]=j∈Ai∑score(i,j)⋅V[j][x](0≤x<D)当 Ai 为空时,O[i] 的每一维都是 0。
请输出最终的 L×D 矩阵 O。
第一行五个整数:
L D G W T
依次为序列长度、特征维数、全局位置个数、局部窗口半径、每个位置最多保留的候选数。
若 G>0,下一行 G 个互不相同的整数:
p1 p2 ... pG
表示全局位置,下标从 0 开始。
若 G=0,则没有这一行,接下来直接读矩阵 Q。
随后 L 行,每行 D 个整数,为矩阵 Q。
随后 L 行,每行 D 个整数,为矩阵 K。
随后 L 行,每行 D 个整数,为矩阵 V。
输出 L 行,每行 D 个整数,表示矩阵 O。
同一行相邻整数之间用一个空格分隔。
输入:
5 2 2 1 2
0 3
1 0
1 0
2 0
0 1
1 1
2 0
1 0
3 0
0 2
-1 1
1 1
2 2
3 3
4 4
5 5
输出:
11 11
11 11
22 22
13 13
10 10
说明
全局位置集合为 P={0,3}。
对 i=1(非全局):C1={0,1,2,3},分数为 2,1,3,0。丢掉非正分数后,按 T=2 取位置 2 与 0:
O[1]=3×[3,3]+2×[1,1]=[11,11]对全局位置 i=3:C3={0,1,2,3,4},正分数只有 2(对应 j=3)和 1(对应 j=4):
O[3]=2×[4,4]+1×[5,5]=[13,13]对 i=4:C4={0,3,4},分数为 2,2,0。0 被丢掉,两个分数 2 并列时先取较小下标 0,再取 3:
O[4]=2×[1,1]+2×[4,4]=[10,10]输入:
3 1 0 0 1
1
2
-1
-2
3
1
10
20
30
输出:
0
120
0
说明
本例 G=0,没有全局位置行。W=0,每个位置的 Ci 只含自己。
i=0 的分数为 −2,不进入 A0,输出 0。
i=1 的分数为 6,因此
O[1]=6×20=120i=2 的分数为 −1,输出 0。
1≤L≤10000
1≤D≤64
0≤G≤min(L,32)
0≤W≤128
1≤T≤min(L,16)
0≤pi<L
全局位置两两不同
−10≤Q[i][j],K[i][j],V[i][j]≤10
全局位置的输入顺序不影响结果。
矩阵与序列下标均从 0 开始。
中间结果和最终结果均在 64 位有符号整数范围内。
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册