中国建设银行云浮分行网站,润滑油网站建设,优化关键词步骤,哪个网站专门做商铺啊关于SAM中decomposed Relative Positional Embeddings的理解。
relative positional embedding的一种实现方式是#xff1a;先计算q和k的相对位置坐标#xff0c;然后依据相对位置坐标从给定的table中取值。以q和k都是77为例#xff0c;每个相对位置有两个索引对应x和y两个…关于SAM中decomposed Relative Positional Embeddings的理解。
relative positional embedding的一种实现方式是先计算q和k的相对位置坐标然后依据相对位置坐标从给定的table中取值。以q和k都是7×7为例每个相对位置有两个索引对应x和y两个方向每个索引值的取值范围是[-6,6]。第0行相对第6行x索引相对值为-6第6行相对第0行x索引相对值为6所以索引取值范围是[-6,6]。这个时候可以构建一个shape为[13,13, head_dim]的table则当相对位置为(ij)时position embeddingtable[i, j]。ij的取值范围都是[0, 12]具体可参考有关swin transformer相对位置编码的理解
decomposed Relative Positional Embeddings的思想在于分别计算x和y两个方向上计算相对位置坐标并分别从两个table中取出对应的位置编码再将两个方向的编码相加作为最终的编码。
以q为4×4和k是4×4为例在x和y方向上每个索引值的取值范围是[-3,3]所以需要构建两个shape为[7, head_dim]的table
if use_rel_pos:assert (input_size is not None), Input size must be provided if using relative positional encoding.# initialize relative positional embeddingsrel_pos_h nn.Parameter(torch.zeros(2 * input_size[0] - 1, head_dim))rel_pos_w nn.Parameter(torch.zeros(2 * input_size[1] - 1, head_dim))然后依据q和k的shape来计算每个方向上对应的相对位置编码
def get_rel_pos(q_size: int, k_size: int, rel_pos: torch.Tensor) - torch.Tensor:# q_size和k_size分别为当前方向上q和k的个数, rel_pos为当前方向上定义的tableq_coords torch.arange(q_size)[:, None] # shape: [4, 1]给当前方向上每个q编号k_coords torch.arange(k_size)[None, :] # shape:[1, 4]给当前方向上每个k编号relative_coords (q_coords - k_coords) (k_size - 1) # q_coords - k_coords就是当前方向上每个q相对于k的位置加上k_size - 1是为了让相对位置非负return rel_pos[relative_coords.long()] # 依据相对位置从预定义好的table中取值依据q和每个方向上对应的位置编码来计算最终的编码 q_h, q_w q_sizek_h, k_w k_sizeRh get_rel_pos(q_h, k_h, rel_pos_h) # 获取h方向的位置编码shape:[4, 4, head_dim]Rw get_rel_pos(q_w, k_w, rel_pos_w) # 获取w方向的位置编码shape:[4, 4, head_dim]B, _, dim q.shaper_q q.reshape(B, q_h, q_w, dim)rel_h torch.einsum(bhwc,hkc-bhwk, r_q, Rh) # r_q与Rh在h方向矩阵乘rel_w torch.einsum(bhwc,wkc-bhwk, r_q, Rw)# attn是自注意力机制计算得到的注意力图attn attn.view(B, q_h, q_w, k_h, k_w) rel_h[:, :, :, :, None] rel_w[:, :, :, None, :]).view(B, q_h * q_w, k_h * k_w)return attn