总工会网站建设方案,广州网站建设教程,网站建设材料汇报,温州建网站哪家强Transformer和BERT的区别比较表#xff1a;
两者的位置编码#xff1a;
为什么要对位置进行编码#xff1f; Attention提取特征的时候#xff0c;可以获取全局每个词对之间的关系#xff0c;但是并没有显式保留时序信息#xff0c;或者说位置信息。就算打乱序列中token…Transformer和BERT的区别比较表
两者的位置编码
为什么要对位置进行编码 Attention提取特征的时候可以获取全局每个词对之间的关系但是并没有显式保留时序信息或者说位置信息。就算打乱序列中token的顺序最后所得到的Attention结果也不会变这会丢失语言中的时序信息因此需要额外对位置进行编码以引入时序信息。
Position Embedding in Transformer 在Transformer中位置编码是由sin /cos sin/cossin/cos函数生成的固定值。
具体做法用不同频率的正余弦函数对位置信息进行编码位置编码向量的维度与文本编码向量的维度相同即dmodeld_{model}dmodel。因此二者可以直接相加作为token最终的编码向量。 pos表示位置i 表示所在维度。 即使测试集中某些样本超出了最大文本长度这种编码方式仍然可以获得有效的相对位置表示。
Position Embedding in BERT 在BERT中与一般的词嵌入编码类似位置编码也是随机生成且可训练的维度为[seq_length, width]其中seq_length代表序列长度width代表每一个token对应的向量长度。
从实现上可以看到BERT中将位置编码创建为一个tensorflow变量并将其broadcast到与词嵌入编码同维度后相加。
with tf.control_dependencies([assert_op]):full_position_embeddings tf.get_variable(nameposition_embedding_name,shape[max_position_embeddings, width],initializercreate_initializer(initializer_range))# 这里position embedding是可学习的参数[max_position_embeddings, width]# 但是通常实际输入序列没有达到max_position_embeddings# 所以为了提高训练速度使用tf.slice取出句子长度的embeddingposition_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两者之间的区别 Transformer的位置编码是一个固定值因此只能标记位置但是不能标记这个位置有什么用。
BERT的位置编码是可学习的Embedding因此不仅可以标记位置还可以学习到这个位置有什么用。
BERT选择这么做的原因可能是相比于TransformerBERT训练所用的数据量充足完全可以让模型自己学习。
如何延拓BERT的位置编码 我们知道BERT模型最多只能处理512个token的文本其原因在于BERT使用了随机初始化训练出来的绝对位置编码最大位置设为为512若是文本长于512便无位置编码可用。
另一方面 复杂度使得长序列的显存用量极大一般显卡就连finetune也做不到。
苏神提出了一种层次分解的方法将BERT的位置编码最多可以延拓至26万。
具体内容可自行阅读苏神博客
层次分解位置编码让BERT可以处理超长文本