Transformer位置编码计算中i需做整除2运算的原因是什么?
关于TensorFlow Transformer教程中位置编码
i//2运算的作用 首先需要明确原论文公式和代码变量的对应关系:
原Transformer论文的位置编码公式定义如下:
PE(pos, 2i) = sin(pos / 10000^(2i/d_model))
PE(pos, 2i+1) = cos(pos / 10000^(2i/d_model))
其中pos是词在序列中的位置,d_model是词向量的维度,公式里的i是正余弦配对的分组索引,范围是0 ~ (d_model/2 - 1),每一组i对应两个相邻的维度:偶数下标维度用sin计算,奇数下标维度用cos计算,两个维度共享同一个角度参数。
代码中的i是d_model维度的全局下标,范围是0 ~ d_model-1,i//2的作用就是把全局下标映射到原公式里的分组索引,实现相邻的两个奇偶维度共享同一个角度率:
- 举个示例,当d_model=4时,全局下标i分别为0、1、2、3:
- i=0:
0//2 = 0,对应分组索引0,角度率为1/10000^(0/4) - i=1:
1//2 = 0,和i=0共享同一个分组索引0,角度率完全相同 - i=2:
2//2 = 1,对应分组索引1,角度率为1/10000^(2*1/4)=1/100 - i=3:
3//2 = 1,和i=2共享同一个分组索引1,角度率完全相同
- i=0:
这种写法可以统一所有维度的角度计算逻辑,不需要分开写奇偶维度的计算分支,后续只需要对偶数下标的计算结果套sin、奇数下标的套cos即可,代码更简洁高效。
内容的提问来源于stack exchange,提问作者marlon
相关产品推荐
相关产品推荐

