Bert模型是自然语言处理方面里程碑式的进步,其核心是transformer层, 而transformer采用自注意力编码器摒弃了循环网络,循环网络天生的顺序信息在自注意力编码器中没有了,而语言往往是顺序不同意思相差很大。所以transformer的作者设计了一种三角函数位置编码方式,为每个不同位置的token单独生成一个位置向量(或者位置嵌入,即position embedding,缩写为PE)。下面的公式是位置编码的公式,但是论文及网上其他文章对公式解释不是很清楚,所以我在此采用例子来帮助初学者理解。
式中pos为token在序列中的位置号码,它的取值是0到序列最大长度max_que_length-1之间的整数。比如“[cls] 我 爱 中 华 [sep]”是6个token组成的序列,[cls]的pos值为0,“我”的pos值为1,“爱”的pos为2,“中”为3,“华”为4,'[sep]'为5 。bert base最大长度max_que_length是512,pos取值还能一直到511。当然如果序列真实长度小于最大长度时,后面的位置号没有意义,最终会被mask掉。
dmodel是位置向量的维度,与整个模型的隐藏状态维度值相同,这解释了为什么起dmodel这个名字,这个维度在bert base模型里设置为768。
i 是从0到dmodel/2-1之间的整数值,即0,1,2,...383。
2i 是指向量维度中偶数维