大模型位置编码


前言

本文介绍了大模型位置编码的基础内容。

一、BERT位置编码

相比Transformer是通过正弦函数生成的,BERT的位置编码是学习出来的(learned position embedding),是绝对位置的参数式编码,且和相应位置上的词向量进行相加而不是拼接。

在BERT中,Token,Position,Segment Embeddings 都是通过学习来得到的,pytorch代码中它们是这样的:
self.word_embeddings = Embedding(config.vocab_size, config.hidden_size)
self.position_embeddings = Embedding(config.max_position_embeddings, config.hidden_size)
self.token_type_embeddings = Embedding(config.type_vocab_size, config.hidden_size)

上述BERT pytorch代码来自:https://github.com/xieyufei1993/Bert-Pytorch-Chinese-TextClassification,结构层次非常清晰。
Transformer的位置编码是一个固定值,因此只能标记位置,但是不能标记这个位置有什么用。BERT的位置编码是可学习的Embedding,因此不仅可以标记位置,还可以学习到这个位置有什么用。要这么做的一个原因可能是,相比于Transformer,BERT训练所用的数据量充足,完全可以让模型自己学习。

BERT的位置编码维度为[seq_length, width]。从实现上可以看到,BERT中将位置编码创建为一个tensorflow变量,并将其broadcast到与词嵌入编码同维度后相加。代码如下:

with tf.control_dependencies([assert_op]):
      full_position_embeddings = tf.get_variable(
          name=position_embedding_name,
          shape=[max_position_embeddings, width],
          initializer=create_initializer(initializer_range))
 
      # 这里position embedding是可学习的参数,[max_position_embeddings, width]
      # 但是通常实际输入序列没有达到max_position_embeddings
      # 所以为了提高训练速度,使用tf.slice取出句子长度的embedding
      position_embeddings = tf.slice(full_position_embeddings, [0, 0],
                                     [seq_length, -1])
      num_dims = len(output.shape.as_list())
 
      # word embedding之后的tensor是[batch_size, seq_length, width]
      # 因为位置编码是与输入内容无关,它的shape总是[seq_length, width]
      # 我们无法把位置Embedding加到word embedding上
      # 因此我们需要扩展位置编码为[1, seq_length, width]
      # 然后就能通过broadcasting加上去了。
      position_broadcast_shape = []
      for _ in range(num_dims - 2):
        position_broadcast_shape.append(1)
      position_broadcast_shape.extend([seq_length, width])
      position_embeddings = tf.reshape(position_embeddings,
                                       position_broadcast_shape)
      output += position_embeddings

缺点:BERT模型最多只能处理512个token的文本,其原因在于BERT使用了随机初始化训练出来的绝对位置编码,最大位置设为为512,若是文本长于512便无位置编码可用。


参考文献

参考1
参考2


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值