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,则当相对位置为(i,j)时,

python 复制代码
position embedding=table[i, j]

(i,j的取值范围都是[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:

python 复制代码
if use_rel_pos:
    assert (
        input_size is not None
    ), "Input size must be provided if using relative positional encoding."
    # initialize relative positional embeddings
    rel_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来计算每个方向上对应的相对位置编码:

python 复制代码
def get_rel_pos(q_size: int, k_size: int, rel_pos: torch.Tensor) -> torch.Tensor:
    # q_size和k_size分别为当前方向上,q和k的个数, rel_pos为当前方向上定义的table
    q_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和每个方向上对应的位置编码来计算最终的编码:

python 复制代码
    q_h, q_w = q_size
    k_h, k_w = k_size
    Rh = 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.shape
    r_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

文献来源

https://blog.csdn.net/weixin_42364196/article/details/132477924

https://github.com/microsoft/Swin-Transformer

相关推荐
RaidenQ3 小时前
2024.9.13 Python与图像处理新国大EE5731课程大作业,索贝尔算子计算边缘,高斯核模糊边缘,Haar小波计算边缘
图像处理·python·算法·课程设计
酱香编程,风雨兼程3 小时前
深度学习——基础知识
人工智能·深度学习
Trouvaille ~3 小时前
【Python篇】深度探索NumPy(下篇):从科学计算到机器学习的高效实战技巧
图像处理·python·机器学习·numpy·信号处理·时间序列分析·科学计算
#include<菜鸡>4 小时前
动手学深度学习(pytorch土堆)-04torchvision中数据集的使用
人工智能·pytorch·深度学习
拓端研究室TRL4 小时前
TensorFlow深度学习框架改进K-means聚类、SOM自组织映射算法及上海招生政策影响分析研究...
深度学习·算法·tensorflow·kmeans·聚类
i嗑盐の小F5 小时前
【IEEE出版,高录用 | EI快检索】第二届人工智能与自动化控制国际学术会议(AIAC 2024,10月25-27)
图像处理·人工智能·深度学习·算法·自然语言处理·自动化
卡卡大怪兽6 小时前
深度学习:数据集处理简单记录
人工智能·深度学习
菜就多练_08286 小时前
《深度学习》深度学习 框架、流程解析、动态展示及推导
人工智能·深度学习
安逸sgr6 小时前
1、CycleGAN
pytorch·深度学习·神经网络·生成对抗网络
FL16238631296 小时前
[数据集][目标检测]俯拍航拍森林火灾检测数据集VOC+YOLO格式6116张2类别
人工智能·深度学习·目标检测