关于SAM中decomposed Relative Positional Embeddings的理解

这篇具有很好参考价值的文章主要介绍了关于SAM中decomposed Relative Positional Embeddings的理解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

关于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,则当相对位置为(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和每个方向上对应的位置编码来计算最终的编码:文章来源地址https://www.toymoban.com/news/detail-671289.html

    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

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

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

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

相关文章

  • 概念解析 | 神经网络中的位置编码(Positional Encoding)

    注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:Positional Encoding A Gentle Introduction to Positional Encoding in Transformer Models, Part 1 在自然语言处理任务中,序列的顺序信息非常重要。例如,“小明去公园玩球”和“小明玩球去公园”

    2024年02月05日
    浏览(49)
  • 相对位置编码之RPR式:《Self-Attention with Relative Position Representations》论文笔记

    😄 额,本想学学XLNet的,然后XLNet又是以transformer-XL为主要结构,然后transformer-XL做了两个改进:一个是结构上做了segment-level的循环机制,一个是在attention机制里引入了相对位置编码信息来避免不同segment的同一位置采用相同的绝对位置编码的不合理。但无奈看到相对位置编码

    2024年02月17日
    浏览(41)
  • Transformer正余弦位置编码理解

    在学习Transformer模型过程中不可避免的一个过程便是要对序列进行位置编码,在Transformer中分为固定位置编码与可学习的位置编码,其一般采用固定位置编码中的正余弦位置编码方式。 今天便以DETR模型为例,介绍正余弦编码的原理与实现过程。 首先给出其公式: 其中i指的是

    2024年02月07日
    浏览(42)
  • 关于有关找寻链表结点位置问题的分析

    leetcode题目链接 关于删除链表中倒数第n个节点的问题,一种有效的方法是使用双指针技术,具体地说,是使用两个指针:左指针(L)和右指针(R)。通过这种方法,我们可以充分利用给定的位置信息(即n),以高效地找到并删除目标节点。以下是该方法的详细步骤: 初始

    2024年02月22日
    浏览(27)
  • Transformer的PE(position embedding),即位置编码理解

    最近要搞理论学习了,先前搞了大半年的工程,又要捡起一些理论原理,现在还是从transformer熟悉理解一下,争取吃透。 关于transformer的经典介绍和资料也一大堆,我就不展开来讲了,碰到了一些一时没太想明白的问题,就记一下,也当是重新理解一遍。 transformer的输入要么

    2024年02月16日
    浏览(65)
  • 关于安卓手机charles抓包安装设置信任证书位置找不到

    关于安卓手机charles抓包安装设置信任证书位置找不到的问题,详细很多朋友都有遇到过; 安卓手机系列太多,型号也多,兼容性和设置问题很大; 很多朋友都找不到去哪安装证书 以红米手机为例; 去手机无线网连接的地方,点击进入- 再次进入 将一直到下方,找到代理 代

    2024年02月09日
    浏览(48)
  • [pyqt5]关于在pyqt5界面上鼠标位置问题

    先上代码,主要看鼠标移动事件里面代码 通过运行代码可以发现: 上面这2行就是相当于屏幕左上角坐标了

    2024年02月15日
    浏览(39)
  • 【区块链 | EVM】深入理解学习EVM - 深入Solidity数据存储位置:内存

    图片来源: Mech Mind on Unsplash 这是深入Solidity数据存储位置系列的另一篇。在今天的文章中,我们将学习EVM内存的布局,它的保留空间,空闲内存指针,如何使用 memory 引用来读写内存,以及使用内存时的常规最佳做法。 我们将使用 Ethereum Name Service (ENS)中的合约代码片段,

    2024年02月02日
    浏览(48)
  • STM32内存分配以及堆栈、变量、代码等的存储位置理解与分析

    文中不足之处,欢迎各位同仁批评指正!         STM32的程序存储器、数据存储器、寄存器和输入输出端口被组织在同一个4GB的线性地址空间内, 地址范围为0x0000 0000至0xFFFF FFFF。其中FLASH为ROM类型,储存的数据掉电不易失;RAM中存储的数据掉电易失。以STM32F103系列为例,最多

    2024年02月03日
    浏览(38)
  • 关于torch.load()更改了cuda位置还是cuda内存不够的问题

    问题背景:在一次任务中,由于需要使用cuda进行代码运行,但是分明修改了cuda到一个空闲的卡位置,但是依然抱错cuda out of memory的问题 在任务中,最开始原始代码是采用以下方式尽心模型load的(指定了cuda to device的位置是空闲的卡2): 但是依然抱错cuda out of memory,分析如

    2024年02月15日
    浏览(44)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包