程序员转行学习AI大模型:位置编码

原理

在前面编码器-解码器介绍中,我们发现,模型并没有记录时序相关信息,即没有感知不同词汇的位置顺序。这会引起一个问题,针对“我喜欢你”这句话,经过前面的 Embedding 处理后,再进入编码器-解码器处理,最后生成的内容,是和输入“你喜欢我”最后生成的内容是一样的,但我们知道,这两句是含义完全不一样的语句。

加入位置编码,可以解决这个问题。位置编码,通过给每个位置添加一个向量,这个向量包含了位置信息,然后把这个向量加到词汇向量上。

例如: 位置1向量:[0.1,0.2,0.3,...] 位置2向量:[0.4,0.5,0.6,...] 位置3向量:[0.7,0.8,0.9,...] “我喜欢你”,添加位置编码后: “我”在位置1:“我”的词向量 + 位置1向量 “喜欢”在位置2:“喜欢”的词向量 + 位置2向量 “你”在位置3:“你”的词向量 + 位置3向量 经过这样处理,Transformer就可以区分词的位置了。 

实现

在 Transformer 中,使用的正弦位置编码。

=== 正弦位置编码的详细解释 === 1. 参数: d_model: 8 max_len: 10 2. 位置索引: position: [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0] 3. 分母项: div_term: [1.0, 0.3162, 0.1, 0.0316] 解释: - div_term = 10000^(-2i/d_model) - i是维度索引(0, 2, 4, 6, ...) - 用于控制不同维度的频率 4. 位置编码矩阵: 形状: torch.Size([10, 8]) 数据: 位置0: [0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0] 位置1: [0.8415, 0.5403, 0.3129, 0.9499, 0.0998, 0.9950, 0.0316, 0.9995] 位置2: [0.9093, -0.4161, 0.5946, 0.8040, 0.1987, 0.9801, 0.0632, 0.9980] 位置3: [0.1411, -0.9900, 0.8120, 0.5835, 0.2955, 0.9553, 0.0948, 0.9955] 位置4: [-0.7568, -0.6536, 0.9516, 0.3073, 0.3894, 0.9211, 0.1263, 0.9920] ... 5. 解释: 公式: PE(pos, 2i) = sin(pos / 10000^(2i/d_model)) PE(pos, 2i+1) = cos(pos / 10000^(2i/d_model)) 含义: - pos: 位置索引(0, 1, 2, ...) - 2i: 偶数维度(0, 2, 4, ...) - 2i+1: 奇数维度(1, 3, 5, ...) 特点: - 偶数维度用sin - 奇数维度用cos - 不同维度有不同的频率 6. 可视化: 位置编码的每个维度: - 维度0: sin(pos * freq_0) - 维度1: cos(pos * freq_0) - 维度2: sin(pos * freq_1) - 维度3: cos(pos * freq_1) - ... 不同维度的频率: - 低维度: 高频率(快速变化) - 高维度: 低频率(慢速变化) 作用: - 不同维度捕捉不同粒度的位置信息 - 低维度捕捉局部位置 - 高维度捕捉全局位置 
=== 逐步演示位置编码的添加过程 === 1. 词向量: 形状: torch.Size([1, 3, 8]) 数据: 位置0: [0.1234, -0.5678, 0.9012, -0.3456, 0.7890, -0.1234, 0.5678, -0.9012] 位置1: [0.2345, -0.6789, 0.0123, -0.4567, 0.8901, -0.2345, 0.6789, -0.0123] 位置2: [0.3456, -0.7890, 0.1234, -0.5678, 0.9012, -0.3456, 0.7890, -0.1234] 2. 位置编码: 形状: torch.Size([3, 8]) 数据: 位置0: [0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0] 位置1: [0.8415, 0.5403, 0.3129, 0.9499, 0.0998, 0.9950, 0.0316, 0.9995] 位置2: [0.9093, -0.4161, 0.5946, 0.8040, 0.1987, 0.9801, 0.0632, 0.9980] 3. 添加位置编码后: 形状: torch.Size([1, 3, 8]) 数据: 位置0: [0.1234, 0.4322, 0.9012, 0.6544, 0.7890, 0.8766, 0.5678, 0.0988] 位置1: [1.0760, -0.1386, 0.3252, 0.4932, 0.9899, 0.7605, 0.7105, 0.9872] 位置2: [1.2549, -1.2051, 0.7180, 0.2362, 1.0999, 0.6345, 0.8532, 0.8746] 计算: 输出 = 词向量 + 位置编码 4. 总结: 步骤: 1. 获取词向量 2. 获取位置编码 3. 词向量 + 位置编码 结果: - 每个词的向量包含了位置信息 - Transformer可以区分不同位置的词 数据流动: 输入(1, 3, 8) ↓ Embedding ↓ 词向量(1, 3, 8) ↓ + 位置编码(1, 3, 8) ↓ 输出(1, 3, 8) 
classPositionalEncoding(nn.Module):'''位置编码模块'''def__init__(self, args):super(PositionalEncoding, self).__init__()# Dropout 层# self.dropout = nn.Dropout(p=args.dropout)# block size 是序列的最大长度 pe = torch.zeros(args.block_size, args.n_embd) position = torch.arange(0, args.block_size).unsqueeze(1)# 计算 theta div_term = torch.exp( torch.arange(0, args.n_embd,2)*-(math.log(10000.0)/ args.n_embd))# 分别计算 sin、cos 结果 pe[:,0::2]= torch.sin(position * div_term) pe[:,1::2]= torch.cos(position * div_term) pe = pe.unsqueeze(0) self.register_buffer("pe", pe)defforward(self, x):# 将位置编码加到 Embedding 结果上 x = x + self.pe[:,: x.size(1)].requires_grad_(False)return x 

位置编码类型

类型特点优点缺点使用模型
正弦位置编码固定公式不需要参数,可外推不能学习Transformer
可学习的位置编码可以学习效果可能更好需要参数,不能外推BERT、GPT
旋转位置编码相对位置适合长序列实现复杂LLaMA,GPT-NeoX
学习内容(Datawhale 开源学习项目):Happy-LLM

Read more

Claude Code本地化部署教程:零成本打造最强内网AI开发助手

Claude Code本地化部署教程:零成本打造最强内网AI开发助手

文章介绍了如何通过Ollama将Claude Code接入本地开源模型,实现不联网、不花钱、代码不出本地的开发环境。提供了详细配置教程,包括安装客户端、设置环境变量和启动本地模型。这种方式确保数据安全,无需订阅费用,可自由切换Qwen3、GLM等模型,为开发者提供了完全离线的AI辅助开发体验。 如果你是一个开发者,一定被Claude Code的能力震惊了。简单来说,它不仅仅是一个聊天框,而是一个能直接住在你的工作空间内的数字员工,能读懂你的源码、系统功能修BUG、写报告,互联网检索等,在授权的情况下,还能运行终端命令。 但是很多人担心隐私泄露,或者不想一直给Claude交昂贵的订阅费。今天,救星来了!通过Ollama可以把 Claude Code 这个“神级躯壳”接入本地运行的开源模型(如 Qwen3、GLM)。不联网、不花钱、代码不出本地,可谓是最强内网开发套装! 为什么又要本地跑Claude Code? * 数据安全:公司代码资产,怎么敢随便传输到云端?本地运行,物理隔离最安心。 * 告别订阅:

AMD显卡用户专属:零门槛部署本地AI大模型完全指南

AMD显卡用户专属:零门槛部署本地AI大模型完全指南 【免费下载链接】ollama-for-amdGet up and running with Llama 3, Mistral, Gemma, and other large language models.by adding more amd gpu support. 项目地址: https://gitcode.com/gh_mirrors/ol/ollama-for-amd 还在为无法在AMD GPU上运行本地AI大模型而烦恼吗?Ollama-for-amd项目正是为你量身打造的解决方案。这个开源项目专门增强了AMD GPU支持,让你轻松在本地部署Llama 3、Mistral、Gemma等主流大语言模型,充分释放AMD显卡的AI计算潜力。 问题一:我的AMD显卡真的能跑AI模型吗? 解决方案:确认硬件兼容性 首先需要了解你的AMD显卡是否在支持列表中。根据官方文档,以下系列显卡已通过充分测试: Linux系统兼容显卡 * Radeon

如何在Android Studio中使用Gemini进行AI Coding

如何在Android Studio中使用Gemini进行AI Coding

Android Studio 作为安卓APP开发领域长期以来的核心开发工具,其稳定性和功能性已得到广泛认可。而 Gemini 作为 Google 推出的原生 AI 编程辅助系统,则为开发者提供了智能化的协作支持。         在引入 Gemini 后,你不再需要频繁切换浏览器查文档、使用外部ai工具复制粘贴代码再回来调试 bug。它可以直接在 IDE 内理解你的项目结构、阅读你的代码上下文,生成函数、解释错误、甚至帮你优化逻辑或编写单元测试——这一切都发生在你熟悉的编辑器中,无缝衔接、无需离开代码界面。 Gemini in Android Studio官网链接         接下来我将介绍如何在在Android Studio中直接使用Gemini以及调用Gemini API。 一、如何在 Android Studio 中启用 Gemini 1. 更新到最新版本的 Android Studio Gemini 从 Android Studio Iguana(

从“写代码”到“说需求”:2026年AI辅助工具与大模型完全使用指南

从“写代码”到“说需求”:2026年AI辅助工具与大模型完全使用指南

一、写在前面:为什么你需要读这篇文章? 还记得几年前,我们写代码还在逐行敲键盘,遇到问题得去网上翻半天。 现在呢?AI能在几秒内生成整个函数,能帮你调试Bug,甚至能听懂你的口头描述直接写出代码。 2026年,AI辅助开发已经不再是“会不会用”的问题,而是“用得好不好”的问题。 但面对层出不穷的新工具——Cursor、Claude Code、OpenClaw,还有国内外一大堆大模型——很多人反而不知道怎么选了。 这篇文章是我花了整整一周时间,把这些工具全部上手试用后写的实战总结。 没有晦涩的技术黑话,全是白话文,保证你读完能知道: 这些工具到底是干什么的、怎么下载安装、实际用起来到底怎么样、哪个最适合你。 全文有点长,7000多字,建议先收藏。咱们按这个顺序聊: 1. AI编程工具三巨头:Cursor、Claude Code、OpenClaw 2. 国内外主流大模型:GPT、Gemini、Claude、DeepSeek、Kimi、