词嵌入位置编码的实现(基于pytorch)

背景介绍

在transformers架构当中,对于词向量的输入需要加上原本词对应的位置信息,作为输入到模型中训练的input,那具体的位置编码如何实现呢?本篇博客就跟大家一起分享一下对应的步骤

位置编码的公式

对于词向量的位置编码的方式有多种,这里就介绍用三角函数进行位置编码的公式

PE是position embeding位置编码的意思,pos表示词的位置,表示词向量的维度,i表示词向量的第i维度

那接下来我们就根据公式进行位置编码的代码实现

代码实现

环境依赖的库

python 复制代码
import torch
import math
import numpy as np
import matplotlib.pyplot as plt

定义一个函数获取位置编码的信息

python 复制代码
def generate_word_embeding(max_len,d_model):
    # 初始化位置信息
    pos = torch.arange(max_len).unsqueeze(1)
    
    # 初始化位置编码矩阵
    result = torch.zeros(max_len,d_model)

    # 获得公式对应的值
    coding = torch.exp(torch.arange(0,d_model,2)*(-math.log(10000.0))/d_model)
    result[:,0::2] = torch.sin(pos*coding)
    result[:,1::2] = torch.cos(pos*coding)

    # 为了与原编码直接相加,格式为[B,seq_len,d_model],需要再增加一个维度
    return result.unsqueeze(0)

假设我们的max_len是100,d_model为20,那么pos的维度为100,1,result的维度为100,20,coding的维度为1,d_model/2,result:,0::2是指对result的每列从第0列开始每隔一列赋值,对应公式中的PE(pos,2i);同理,result:,1::2对应公式中的PE(pos,2i+1)

位置编码信息可视化

我们把得位置编码信息进行可视化从而得到更直观的感受

python 复制代码
d = 6
pos_code = generate_word_embeding(100,d)
print(pos_code.shape)
plt.plot(np.arange(100),pos_code[0,:,0:d])
plt.legend(['dim=%d'%p for p in range(d)])
plt.show()

把词的时序长度设置为6,显示对应时序上每一个维度的位置编码信息

可以看到每一个时序位置上对应每一个维度都对应一个三角函数的变换规律,在放进model中训练的后就能够通过学习获得位置对应的知识

欢迎大家讨论交流~


相关推荐
正在走向自律10 小时前
AI Agent 落地这一年:从“能跑起来”到“敢放出去”
大数据·人工智能·ai agent·智能体·mcp·a2a
不惑_10 小时前
理解启元,从论文开始,RT-2 55B 只有 1~3Hz,OpenVLA 7B 反而高 16.5%——三代 VLA 论文解读,动作表示才是分水岭
人工智能·论文解读
IT_陈寒10 小时前
Redis内存暴涨,没想到是AOF重写捣的鬼
前端·人工智能·后端
楚山之石10 小时前
【JCO】mpMRI 先行替代 TURBT 初始分期:BladderPath 随机试验让 MIBC 患者提前 45 天得到正确治疗
人工智能·学习·mri·医学影像
AI视频工具指南10 小时前
用 AI 能做哪些视频?按想交付的作品选做法
人工智能·aigc·音视频
武天旭11 小时前
AI安全--AI大模型的对抗样本攻击与防御解析
人工智能·深度学习·安全·机器学习
shijuejianceliu11 小时前
传统规则视觉与嵌入式AI智能相机的技术差异
人工智能·嵌入式硬件·视觉检测·相机
goujunwe11 小时前
GEO 内容的“可摘录性”打磨技巧:段落、表格、小标题怎么写,方便大模型提取独立答案块
大数据·人工智能
羲云网络12 小时前
GPT Image 2.6 接入指南:Flare、Sunburst 怎么选,编辑失败如何排查
人工智能·python·aigc·图像生成·acedatacloud
张张123y12 小时前
DSH 插件调试避坑:client.js 设置面板、热重载与高频报错排查表
开发语言·javascript·人工智能·开源·ecmascript·后端开发·ai agent