Transformer结构--输入编码(BPE,PE)

在Transformer结构中,输入编码是模型处理文本数据的关键步骤,其中**BPE(Byte Pair Encoding,字节对编码)PE(Positional Encoding,位置编码)**是两种重要的编码方式,它们分别解决了分词和位置信息的问题。以下是对这两种编码方式的详细解析:

BPE(Byte Pair Encoding)

1. 背景与目的

  • 传统分词问题:在自然语言处理中,传统的分词方式(如基于空格或标点符号的分词)往往无法有效处理未知词(OOV,Out-of-Vocabulary)或稀有词。这些词在训练数据中未出现或出现频率极低,导致模型难以学习到它们的表示。
  • BPE的引入:BPE是一种数据压缩算法,最初用于文本压缩。在NLP中,BPE被用作一种子词(subword)分词算法,旨在将文本分解为更小的单元(子词),从而更有效地处理未知词和稀有词。

2. 算法原理

  • 初始化词表:BPE从一个基础词表开始,通常包含所有单个字符。
  • 迭代合并:BPE通过迭代地合并最频繁出现的字符对(或子词对)来扩展词表。每次合并后,新的子词被添加到词表中,而原始的字符对被替换为新的子词。
  • 终止条件:合并过程持续进行,直到词表大小达到预设的阈值或合并次数达到上限。

3. 优点

  • 处理未知词:BPE能够将未知词分解为已知的子词组合,从而允许模型学习到这些词的表示。
  • 灵活性:BPE可以根据不同的任务和数据集调整词表大小,以平衡分词粒度和模型性能。
    在这里插入图片描述

在这里插入图片描述

BPE代码

import tiktokendef main():print("Hello from hello-world!")# 获取编码enc = tiktoken.get_encoding("cl100k_base")# 编码文本tokens = enc.encode("tiktoken是OpenAI开源的一个快速分词工具。它将一个文本字符串(例如“tiktoken很棒!”)和一个编码(例如“cl100k_base”)作为输入,然后将字符串拆分为标记列表。-----aa aa aa bb bb bb cc cc aabbcc aabb ")print(tokens)  # 输出: [24912, 2375]# 解码文本text = enc.decode(tokens)print(text)  # 输出: hello worldif __name__ == "__main__":main()

PE(Positional Encoding)

1. 背景与目的

  • Transformer的局限性:Transformer模型基于自注意力机制,能够并行处理输入序列中的所有元素。然而,这种并行性导致模型无法直接捕捉到序列中元素的位置信息。
  • 位置编码的引入:为了解决这个问题,Transformer引入了位置编码(PE),为输入序列中的每个元素添加位置信息。

2. 实现方式

  • 正弦和余弦函数:Transformer使用正弦和余弦函数来生成位置编码。对于位置 p o s pos pos和维度 i i i,位置编码的值由以下公式给出:

    P E ( p o s , 2 i ) = sin ⁡ ( p o s 1000 0 2 i / d model ) PE(pos, 2i) = \sin\left(\frac{pos}{10000^{2i/d_{\text{model}}}}\right) PE(pos,2i)=sin(100002i/dmodelpos)
    P E ( p o s , 2 i + 1 ) = cos ⁡ ( p o s 1000 0 2 i / d model ) PE(pos, 2i+1) = \cos\left(\frac{pos}{10000^{2i/d_{\text{model}}}}\right) PE(pos,2i+1)=cos(100002i/dmodelpos)

    其中, d model d_{\text{model}} dmodel是模型的维度。

  • 添加到输入嵌入:生成的位置编码被添加到输入序列的词嵌入(word embedding)中,形成最终的输入表示。

3. 优点

  • 捕捉位置信息:位置编码允许Transformer模型捕捉到输入序列中元素的位置信息,从而更准确地理解序列的结构和语义。
  • 可学习性:虽然位置编码是预先计算的,但它与词嵌入一起被输入到模型中,允许模型在训练过程中学习到更优的位置表示。

BP代码

PyTorch提供了torch.nn.Embedding和自定义操作,可以更高效地实现PE:

import torch
import mathclass PositionalEncoding(torch.nn.Module):def __init__(self, d_model, max_len=5000):super(PositionalEncoding, self).__init__()self.d_model = d_model# 创建位置编码矩阵pe = torch.zeros(max_len, d_model)position = torch.arange(0, max_len, dtype=torch.float).unsqueeze(1)div_term = torch.exp(torch.arange(0, d_model, 2).float() * (-math.log(10000.0) / d_model))pe[:, 0::2] = torch.sin(position * div_term)  # 偶数维度pe[:, 1::2] = torch.cos(position * div_term)  # 奇数维度pe = pe.unsqueeze(0)  # 添加batch维度,形状: (1, max_len, d_model)self.register_buffer('pe', pe)  # 注册为缓冲区,不参与训练def forward(self, x):""":param x: 输入张量 (batch_size, seq_len, d_model):return: 添加位置编码后的张量"""x = x + self.pe[:, :x.size(1)]  # 截取与输入序列长度匹配的PEreturn x# 示例:生成长度为10,维度为512的位置编码
d_model = 512
pe_layer = PositionalEncoding(d_model)
x = torch.zeros(32, 10, d_model)  # 假设batch_size=32, seq_len=10
x_with_pe = pe_layer(x)
print(x_with_pe.shape)  # 输出: torch.Size([32, 10, 512])

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/86806.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/86806.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Confluence-测试用例设计指导方法

测试经验知识库 典型的测试场景验证点各个项目有价值的经验和测试点 测试经验知识库 - 草稿测试用例执行量化指导建议 何时需要进行全量测试和如何定义和执行测试用例量的一些建议和标准 端对端(E2E)测试用例设计指导方案 在测试行业中,端到端…

浅析JVM

一、JVM运行流程 如图: JVM由四个部分构成: 1.类加载器 加载类文件到内存2.运行时数据区 写的程序需要加载到这里才能运行3.执行引擎 负责解释命令,提交操作系统执行4.本地接口 融合不同编程语言为java所用,如Java程序驱动打印…

多个 Job 并发运行时共享配置文件导致上下文污染,固化 Jenkins Job 上下文

基于 context.py 固化 Jenkins Job 上下文的完整方案,适用于你当前的工作流(Python Jenkins Pipeline),解决: 多个 Job 并发运行时共享配置文件导致上下文污染;读取环境变量或 JSON 文件时被其他 Job 修改…

简木易支付系统 功能齐全,对接接口超多

简木易支付系统,作为一款引领行业潮流的卓越支付解决方案,依托先进的 PHP MySQL 技术架构精心打造。在开发过程中,它巧妙运用了功能强大的 ThinkPHP8 框架,完美融合前端主流技术 Vue、Element 以及 Layuiadmin,共同铸…

【软考高项论文】信息系统项目的人力资源管理

摘要 本文围绕信息系统项目的人力资源管理展开论述。以我在2024年参与的为大型国有企业构建供应链管理系统项目为例,阐述了项目人力资源管理的主要流程,包括规划、组建、建设和管理团队四个过程,以及所运用的工具和理论。同时,分…

【EI会议征稿】东北大学主办第三届机器视觉、图像处理与影像技术国际会议(MVIPIT 2025)

一、会议信息 大会官网:www.mvipit.org 官方邮箱:mvipit163.com 会议地点:辽宁沈阳 主办单位:东北大学 会议时间:2025 年 9 月 27 日-9 月 29 日 二、征稿主题 集中但不限于“机器视觉、图像处理与影像技术”等其…

从零开始的云计算生活——第二十三天,稍作休息,Tomcat

目录 一.故事背景 二.Tomcat概述 1、Tomcat介绍 2、Tomcat历史 二、Tomcat原理分析 1、Http工作原理 2、Tomcat整体架构 3、Coyote连接器架构 4、Catalina容器架构 5、Jasper处理流程 6、JSP编译过程 7、Tomcat启动流程 8、Tomcat请求处理流程 三、Tomcat安装与配…

几种基于Doherty结构的GAN氮化镓功放设计方法介绍

功率放大器是现代无线通信系统中最重要的组件之一。理想情况下,它们能够以高线性度和高效率提供高输出功率。但通常在这三个关键的功率放大器性能参数之间需要进行权衡取舍,而且具有最高输出功率和线性度的放大器往往会牺牲效率。 在支持宽带宽和高数据…

前端打印计算单位 cm、mm、px

A4 纵向 宽:21cm,210mm,793.698px 高:29.7cm,297mm,1122.520px A4 横向 宽:29.7cm,297mm,1122.520px 高:21cm,210mm,793.698px …

c# sugersql 获取子表数据排序

在C#中使用Sugar ORM(一个流行的.NET ORM框架)获取子表数据并进行排序,可以通过以下几种方式实现: 1. 使用HasMany或HasOne配置 首先,确保你在配置实体时已经正确设置了HasMany或HasOne关系。例如,假设你…

【nRF52832】【环境搭建 3】【如何新建一个纯单片机开发的工程】

1. 前言 笨叔,又要开始扯淡了!!! 不感兴趣的同学,可以跳过了!!! 笨叔之前在大学里面, 刚接触单片机时。就被 windows 平台 例如 keill 5 、IAR 等一堆开会环境差点劝退。 当时也是坚持咬牙一点点摸索过来的。刚摸索明白,觉得单片…

Spring-loC与DI

目录 1 loC控制反转思想 2 DI依赖注入 3 loC详解 3.1 存储Bean (1)Controller (2)Service (3)Repository (4)Component (5)Configuration &#xf…

职业本科单片机与嵌入式技术实训室建设设想

一、引言 在当今数字化与智能化飞速发展的时代,单片机与嵌入式技术作为信息技术领域的关键支撑,广泛应用于工业控制、智能家居、物联网、汽车电子等众多行业,成为推动产业升级和创新发展的核心驱动力。职业本科教育旨在培养适应生产、建设、…

传统消防演练与 VR 消防演练的区别有哪些

演练形式:传统消防演练往往依托真实的场地,像空旷的广场、废弃的建筑物或是专门的消防训练基地等。参与者能触摸并使用实实在在的消防设备,例如干粉灭火器、二氧化碳灭火器、消防水带等。在演练时,会通过点燃模拟火源、释放烟雾等…

【零基础学AI】 第6讲:数据可视化基础

本节课你将学到 理解数据可视化在AI中的重要作用 掌握Matplotlib的基本架构和核心概念 学会创建各种类型的图表(线图、柱状图、散点图、饼图等) 掌握图表美化和自定义技巧 完成销售趋势图表制作实战项目 开始之前 什么是数据可视化? 数据可…

基于SSM+JSP 的旅游管理系统

【旅游景点管理系统】【送文档】|SSM | JSP 【运行开发环境】 jdk1.8 idea mysql maven tomcat 【技术栈】 Spring SpringMVC mybatis JSP 【项目功能】 两个角色;管理员功能有游客管理、轮播图管理、景点管理、景点类型管理;普…

系统 | 电脑重置 图文教程

背景: 换内存条,换完,声卡网卡崩盘,分析原因可能是未断电操作(什么光感自动断电 还是手动的香),网卡由于代理没关,关完即可。声卡一直没好,电脑店说是硬件问题;自行排查了…

MyBatis深度面试指南

一、MyBatis核心解析:半ORM框架的底层真相 1. 本质与工作流 半ORM定义: 对象映射:通过ResultMap将ResultSet自动转为Java对象(省去JDBC手动映射)。SQL控制:开发者需手动编写SQL,框架不自动生成(与Hibernate核心区别)。工作流四步: 解析mybatis-config.xml → 构建Sq…

使用Docker部署mysql8

1、拉取mysql8的镜像: 1 [rooti-zgn6som8 ~]# docker pull mysql:8.0 2、创建配置和数据文件夹并修改权限: 1 2 3 4 mkdir -p /data/mysql8/conf mkdir -p /data/mysql8/data chmod -R 755 /data/mysql8/ 3、配置一个自定义的配置文件my.cnf: 1 …

Vue3—插槽solt

默认插槽 父组件 <Sidebar><div>{{ strData }}</div></Sidebar> let strData ref(我是你爸爸真伟大&#xff0c;养你这么大);//定义插槽数据子组件 <slot>没有数据&#xff0c;我先默认显示一下 loading。。。。。。。</slot>父组件提供…