Transformer中的相对位置编码(Relative Position Embedding)

本文介绍了Transformer中相对位置编码的概念,相对于绝对位置编码,它考虑了token间的相对距离,通过在self-attention计算中加入相对位置信息的表示,增强了模型对语序的捕获能力。文中详细解释了相对位置编码的公式推导,并提到在实际代码实现中,Hugging Face的库已支持该方法,但在大型模型中可能因引入额外参数而影响预训练权重的使用。
摘要由CSDN通过智能技术生成

回顾transformer中绝对位置编码(absolute position embedding)

在transformer的实现中,所有的input tokens是无序的,是没法像RNN的方法一样学到token之间的位置顺序关系,但是自然语言一定是有语序在里面的,所以原始的transformer的代码实现里就提供了一种非常简单的位置编码,输入的是一个和max_sequence_length一样长的固定index序列,比如在max_sequence_length=64的情况下,输入的位置信息序列就是[0,1,2,3…62,63],然后通过一个embedding层让网络自己去学习位置的编码和表征。因为不管输入的文本是什么,位置编码永远是一个定值的序列(在不同的网络中仅长度会变化),所以这就是一种绝对位置编码方式。我个人对这种位置编码方式是否能提供有用的位置信息是存疑的,因为当网络训练好了以后,所有的input embedding相当于都加上一个定值,然而不同的input里面的位置和语义信息都是不同的,我认为这种加定值的方式并不能学到一些位置带来的语义上的差别,但毕竟增加了一定的参数量,可能聊胜于无吧。
贴一下transformer中绝对位置编码的实现,在modeling_bert.py中,实现也很简单:

class BertEmbeddings(nn.Module):
   def __init__(self, config):
        super().__init__()
        self.word_embeddings = nn.Embedding(config.vocab_size, config.hidden_size, padding_idx=config.pad_token_id)
        self.position_embeddings = nn.Embedding(config.max_position_embeddings, config.hidden_size) #初始化定义position_embedding的embedding层,其实底层就是一个fc
        self.token_type_embeddings = nn.Embedding(config.type_vocab_size, config.hidden_size)
    def forward(self, input_ids=None, token_type_ids=None, position_ids=None, inputs_embeds=None):
        if input_ids is not None:
            input_shape = input_ids.size()
        else:
            input_shape = inputs_embeds.size()[:-1]

        seq_length = input_shape[1]

        if position_ids is None:
            position_ids = self.position_ids[:, :seq_length] #生成定值的序列

        if position_ids.dtype is not torch.long:
            position_ids = position_ids.to(torch.long)

        if token_type_ids is None:
            token_type_ids = torch.zeros(input_shape, dtype=torch.long, device=self.position_ids.device)

        if inputs_embeds is None:
            inputs_embeds = self.word_embeddings(input_ids)
        embeddings = inputs_embeds
            embeddings += token_type_embeddings
        if self.position_embedding_type == "absolute":
            position_embeddings = self.position_embeddings(position_ids) #输入的固定序列经过一个fc得到位置编码,直接point-wise加回到token embedding上
            embeddings += position_embeddings

        embeddings = self.LayerNorm(embeddings)
        embeddings = self.dropout(embeddings)
        return embeddings

相对位置编码方法详解和公式推导

相对位置编码的方法主要是出自于Google的一篇paper《Self-Attention with Relative Position Representations》
先说一下transformer中的self-attention机制:
每一层transformer由h个attention heads组成,其中每个attention head的输入为n个元素组成的token序列 x = ( x 1 , . . . , x n ) x = (x_1,...,x_n) x=(x1,...

  • 19
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

今儿学习了没

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值