程序员转行学习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

AI 也能操控浏览器了?OpenClaw Browser Relay 接入指南

AI 也能操控浏览器了?OpenClaw Browser Relay 接入指南

目录 * 为什么需要 Browser Relay? * 浏览器模式 * 扩展中继模式(Extension Relay) * 踩坑记录 * 实战案例:AI 帮你干活 * 案例一:自动查资料 + 总结 为什么需要 Browser Relay? 兄弟姐妹们,有没有这些痛点: 😭 想自动化操作浏览器,但工具配置复杂、代码一大串还容易报错 😭 页面稍微变一下,脚本就失效,维护到头秃 😭 遇到登录态、Cookie、JavaScript 渲染的页面,直接歇菜 好消息来了! 🎉 OpenClaw Browser Relay 直接用 AI 控制浏览器!不用记 API、不用写复杂脚本,只要会说话(打字)就行!从此以后: 从此以后: ✅ “帮我去某某网站查个数据” —— AI 自动打开浏览器、登录、

PyTorch生成式人工智能(18)——循环神经网络详解与实现

PyTorch生成式人工智能(18)——循环神经网络详解与实现

PyTorch生成式人工智能(18)——循环神经网络详解与实现 * 0. 前言 * 1. 文本生成的挑战 * 2. 循环神经网络 * 2.1 文本数据 * 2.2 循环神经网络原理 * 3. 长短期记忆网络 * 3. 自然语言处理基础 * 3.1 分词 * 3.2 词嵌入 * 3.3 词嵌入在自然语言处理中的应用 * 小结 * 系列链接 0. 前言 我们已经学习了如何生成数字和图像等内容。从本节开始,我们将主要聚焦于文本生成。人类语言极其复杂且充满细微差别,不仅仅涉及语法和词汇的理解,还包括上下文、语气和文化背景等。成功生成连贯且语境适当的文本是一项重大挑战,需要深入理解和处理语言。 1. 文本生成的挑战 人类主要通过语言进行交流,能够生成语言文本的人工智能可以更自然地与用户互动,使技术变得更加易于使用。文本生成有广泛的应用,包括自动化客户服务回复、创作文章和电影剧本创作、帮助创意写作,

深度解析 MySQL 与 MCP 集成:从环境构建到 AI 驱动的数据交互全流程

深度解析 MySQL 与 MCP 集成:从环境构建到 AI 驱动的数据交互全流程

前言 在当前大语言模型(LLM)应用开发的浪潮中,MCP(Model Context Protocol)协议正在成为连接 AI 模型与本地数据设施的关键桥梁。本文将以 MySQL 数据库为例,详细拆解如何通过 MCP 协议让 AI 模型直接操作关系型数据库,涵盖从服务器发现、数据库架构设计、数据初始化、MCP 配置文件编写到复杂自然语言查询与写入的全过程。 第一部分:MCP 服务器的发现与配置获取 在进行任何数据交互之前,首要任务是确立连接协议与服务源。通过蓝耘 MCP 广场,开发者可以快速检索并获取所需的 MCP 服务器配置。 在搜索栏输入 mysql 关键字,系统会立即检索出相关的 MCP 服务器资源。如下图所示,搜索结果中清晰展示了 MySQL 对应的 MCP 服务卡片。 点击选中该 MCP 服务器后,

一文读懂AI圈爆火的Skills:是什么、怎么用

一文读懂AI圈爆火的Skills:是什么、怎么用

大家好,我是jobleap.cn的小九。 最近AI圈,Skills彻底火了。Github上相关仓库动辄斩获上万星标,比如含50多个Claude技能的仓库、Superpowers工作流项目,均已突破18K星。这股热度,堪比2023-2024年的Prompt模板热潮——彼时大家疯狂分享Prompt,现在则扎堆交流Skills。 不少人疑惑:Skills到底是什么?和Prompt、MCP有啥区别?我花了两天整理,用直白的案例和方法,带你搞懂Skills的本质与用法。 一、Skills到底是什么?先看两个实战案例 Skills直译是“技能”,核心是「给AI智能体(Agent)用的技能包」。光说定义太抽象,分享两个我们公司的实战案例,帮你直观理解它的价值。 案例1:AI选题系统,把2-3小时工作缩成一句话指令 做内容的都懂,选题是个“海量信息筛精选”的耗时活。以前我们每天要刷遍推特、Reddit、Github、知乎、小红书等近10个平台,筛选热点、判断价值、找切入角度,整套流程要2-3小时,严重挤占核心工作时间。 去年12月,