decomposed Relative Positional Embeddings的理解

这篇具有很好参考价值的文章主要介绍了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)时,

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:

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来计算每个方向上对应的相对位置编码:

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和每个方向上对应的位置编码来计算最终的编码:

    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

Reference

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

https://blog.csdn.net/weixin_42364196/article/details/132477924文章来源地址https://www.toymoban.com/news/detail-683328.html

到了这里,关于decomposed Relative Positional Embeddings的理解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Kaggle】Stable Diffusion - Image to Prompts竞赛代码初步理解

    此次代码集成了 CLIP Interrogator、OFA 模型和 ViT 模型。 首先安装指定版本的 transformers 库: transformers-4.18.0.dev0-py3-none-any.whl 是一个 transformers 库的文件,它的命名方式表示这是一个开发版本(dev)的预构建轮子(wheel)文件。 轮子文件是 Python 包的一种打包格式,可以通过 pip

    2024年02月03日
    浏览(51)
  • 【计算机视觉 | 目标检测】CORA: Adapting CLIP for Open-Vocabulary Detection with Region Prompting and Anchor

    基于区域提示和锚点预匹配的开放词汇检测。 CORA 在目标检测任务中提出了一种新的 CLIP 预训练模型适配方法,主要包括 Region Prompting 和 Anchor Pre-Matching 两部分。 这种方法能够让 CLIP 模型适应目标检测的任务,能够识别出图像中的对象,并提供准确的分类和定位信息。 开放

    2024年02月14日
    浏览(42)
  • 对于计算机视觉的一定理解

    计算机视觉(CV)技术是一种通过计算机对图像或视频进行处理和理解的技术。它利用算法和模型来模仿人类视觉系统,从而实现图像识别、目标检测、图像分割等任务。以下是计算机视觉技术的一些优势和挑战的例子。 计算机视觉的应用方面非常广泛,包括但不限于以下几

    2024年02月19日
    浏览(41)
  • 深入理解计算机系统AttackLab实验

    实验目的与要求 强化机器级表示、汇编语言、调试器和逆向工程等方面基础知识,并结合栈帧工作原理实现简单的栈溢出攻击,掌握其攻击的基本方式和原理,进一步为编程过程中应对栈溢出攻击打下一定的基础。 理解缓冲区的工作原理和字符填充过程及其特点。对于无边

    2024年02月04日
    浏览(44)
  • 【计算机视觉】上游任务和下游任务的理解

    计算机视觉中有常见的四大任务: 分类(解决\\\"what\\\") 定位(解决\\\"where\\\") 检测(解决\\\"what\\\"和\\\"where\\\") 分割(实例分割、语义分割和场景分割等像素级别的处理) 预训练模型。一般就是利用上游数据进行预训练,以生成一个包含视觉表征能力的模型。 比如,我们想要的是一个

    2024年02月10日
    浏览(73)
  • 【计算机视觉】对比学习综述(自己的一些理解)

    对比loss 对比学习的 loss(InfoNCE)即以最 大化互信息为目标推导而来。其核心是通过计算样本表示间的距离,拉近正样本, 拉远负样本,因而训练得到的模型能够区分正负例。 具体做法为:对一个 batch 输入的图片,随机用不同的数据增强方法生成两个 view,对他们用相同的

    2024年02月12日
    浏览(46)
  • 特征向量与计算机视觉: 解决图像理解的挑战

    计算机视觉是人工智能领域的一个重要分支,它涉及到计算机对于图像和视频的理解与处理。图像理解是计算机视觉的核心技术之一,它旨在让计算机能够理解图像中的对象、场景和动作,并进行相关的分析和判断。然而,图像理解的挑战在于图像中的信息量非常大,并且与

    2024年04月14日
    浏览(56)
  • 【计算机视觉 | 目标检测】Object query的理解

    以下是Object query的几个常见理解: 在目标检测中,Object Query可以理解为查询对象,是用于检测任务中对每个目标进行描述的一种方式。它是Transformer中的一种重要结构,可以将检测任务转化为对预测结果与特征图的相似性进行计算。 在DETR中,每个Object Query都可以看作是一个

    2024年02月05日
    浏览(40)
  • 深入理解计算机系统(13)_存储器层次结构

    第一章 计算机的基本组成 1. 内容概述 2. 计算机基本组成 第二章 计算机的指令和运算 3. 计算机指令 4. 程序的机器级表示 5. 计算机运算 6. 信息表示与处理 第三章 处理器设计 7. CPU 8. 处理器体系结构 9. 优化程序性能 10. 其他处理器 第四章 存储器和IO系统 11. 存储器的层次结构

    2024年02月16日
    浏览(32)
  • 【计算机视觉】简述对EQ-Net的理解

    最近又看了一些点云分割的文章,近两年点云分割的文章是真的少,不知道是不是点云分割算法接近了末端。这篇文章主要提出了一个基于查询方法的统一范式,它解决了一些不仅仅是点云分割的问题,还解决了三维点云分类和三维目标检测的问题。 文章整体结构如上图,可

    2024年02月16日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包