10.3.2 加性注意力
这里查询,键和值的形状不要看书上,看我下面写的文字
- 对于查询来说,第一维的确是批量大小,可以忽略不管;第二维是一个批量中查询\(z\)的个数;第三维是每个查询\(z\)的特征维度(代码中的
query_size) - 对于键来说,第一维的确是批量大小,可以忽略不管;第二维是键值对个数,也就是键的个数,也就是值的个数;第三维是每个键\(x\)的特征维度(代码中的
key_size) - 对于值来说,第一维的确是批量大小,可以忽略不管;第二维是键值对个数,也就是键的个数,也就是值的个数;第三维是每个值\(y\)的特征维度
现在加性注意力想要干的事情,也就是跟前面一样,找出加权平均数的权重。假设现在查询已经定下来了,为\(q\)(注意这是一个查询,也就是上文的\(z\)),那么对于某一个键\(k\)(注意这是一个键,也就是上文的\(x\)),其权重为\(a(q,k)\)
由于现在查询和键的维度大小是不同的,所以现在必须用一个矩阵乘法将他们转成维度一样的向量(这个向量有num_hiddens这么多维度)
对于features = queries.unsqueeze(2) + keys.unsqueeze(1),之所以要使用unsqueeze是为了加法广播
nn.Dropout无论输入多少维,都是对张量中的每一个元素单独进行丢弃
可以想一下为什么masked_softmax传入的valid_lens是对的(提示:按Bahdanau注意力,此时scores的第一维为\(1\),且第二维的长度不是num_hiddens而是编码器的num_steps)

浙公网安备 33010602011771号