Transformer模型中的位置嵌入层

 Transformer模型中位置嵌入层的设计目的是为了给输入序列中的每个位置提供一个独特的向量表示,因为Transformer摒弃了循环结构,无法像RNN那样通过递归过程直接捕捉序列的位置信息。在Transformer中,位置嵌入是通过对位置索引进行编码来实现的。

位置嵌入通常采用正弦和余弦函数生成一系列固定大小的向量,这些向量与词嵌入相加后,共同构成序列中每个位置的输入表示:

  • 上面一行的公式计算的是偶数位置上的位置嵌入。
  • 下面一行的公式计算的是奇数位置上的位置嵌入。
  • PE(pos,2i)​ 和PE(pos,2i+1)​ 分别代表偶数和奇数位置上位置嵌入的第 i 维值。
  • pos 表示当前位置的索引。
  • dm​odel 是模型的维度大小,即输出向量的长度。
  • sin 和 cos 分别是正弦函数和余弦函数。

这种编码方式确保了不同的位置会有不同的向量表示,并且在连续的位置之间,位置嵌入的变化体现出一种平滑过渡和周期性的特性,理论上可以覆盖任意长度的序列。最终,每个输入单词的词嵌入加上对应位置的位置嵌入,就构成了Transformer模型实际处理的输入序列。

在实际编程实现中,位置嵌入矩阵可以预先计算并存储,也可以在运行时动态生成,然后与输入序列的词嵌入矩阵相加,得到完整的带有位置信息的输入向量序列。

import math

def get_position_embedding(pos, dim, d_model):
    position_embeddings = []

    for i in range(dim):
        if i % 2 == 0:
            position_embeddings.append(math.sin(pos / (10000 ** ((2 * i) / d_model))))
        else:
            position_embeddings.append(math.cos(pos / (10000 ** ((2 * i + 1) / d_model))))

    return position_embeddings

# 计算位置为5、维度为3的位置嵌入
position = 5
dimension = 3
model_dim = 64

embedding = get_position_embedding(position, dimension, model_dim)
print(embedding)

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值