当前位置: 首页 > article >正文

大模型Tokenizer原理:深入理解BPE与WordPiece子词编码技术

大模型Tokenizer原理深入理解BPE与WordPiece子词编码技术在大型语言模型的技术架构中Tokenizer分词器是连接原始文本与模型输入的关键桥梁。不同于简单的按空格或标点分割一个优秀的分词器需要将文本切分为模型能够高效处理的Token序列同时尽可能保留语义信息。本文深入剖析当前大模型中最常用的两种子词分词算法——Byte Pair EncodingBPE和WordPiece从底层原理到代码实现进行全面讲解。BPE算法原理与训练过程BPE最初由Philip Gage在1994年提出用于数据压缩领域。其核心思想是通过迭代合并高频出现的字节对来构建符号表。这一思想被迁移到NLP领域后成为构建子词词汇表的标准方法。BPE训练的核心流程如下。首先将训练语料中的每个单词拆分为字符序列并在每个单词末尾添加特殊分隔符。同时统计每个单词出现的频率。例如单词higher会变为h i g h e r“单词low变为l o w ”。初始词汇表包含所有单个字符和特殊分隔符。接下来进入迭代合并阶段。在每次迭代中算法遍历所有相邻字符对统计它们在语料库中共同出现的总频率。选择频率最高的字符对作为合并规则加入词汇表并将语料库中所有该字符对合并为一个新符号。这个过程重复进行直到词汇表达到预设大小。假设语料库中有单词low出现5次“lower出现2次“new出现3次。在初始状态下字符序列分别为l o w”、“l o w e r和n e w”。经过若干次迭代后可能形成lo”、wer等子词单元这些子词能够组合表示原单词同时在统计意义上具有更高的出现频率。BPE的最终分词过程是确定性的。对于任意输入单词首先拆分为字符序列然后从左到右遍历贪心地应用已学到的合并规则。每次检查当前位置是否存在可合并的字符对如果存在则合并否则保持原样并移动到下一个位置。这种方法保证每个单词都能被分解为词汇表中的子词组合。WordPiece算法深度解析WordPiece是Google为语音搜索系统开发的分词技术后被BERT采用并广为人知。与BPE基于频率的贪心合并不同WordPiece采用基于概率的训练目标这导致了本质性的差异。WordPiece的训练目标是最大化训练语料的语言模型概率。给定一个单词序列完整的分词方案是将其切分为若干子词单元。设分词结果为(t1, t2, …, tn)则该分词方案的语言模型概率为各个子词条件概率的乘积P(分词) P(|t1) × P(t1|t2) × P(t2|t3) × … × P(tn-1|tn)每个条件概率P(ti|ti1)可以通过统计训练语料中子词对的出现频率计算得到P(ti|ti1) Count(ti, ti1) / Count(ti1)。在训练过程中WordPiece需要决定哪两个子词应该合并。不同于BPE直接选择最高频的字符对WordPiece评估的是合并后对语言模型概率的提升。具体来说对于候选合并对(A, B)计算合并前的联合概率贡献与合并后的联合概率贡献之差选择使整体似然提升最大的对。这个差异在实际应用中产生了明显区别。考虑单词unsupervisedBPE可能优先合并出现频率最高的字符对而WordPiece会考虑合并后对整体句子概率的影响。如果un和super在语料中有明确且独立的语义作用WordPiece可能选择保留它们而非强行合并。分词阶段也存在差异。BPE采用确定性的贪心匹配而WordPiece通常采用动态规划或类似Viterbi算法来寻找最优分词路径。具体而言对于输入单词从右到左或从左到右遍历所有可能的分词位置计算每种分词方案的概率选择概率最高的方案。BPE代码实现详解理解算法原理后通过代码实现可以更深入地掌握细节。以下是一个完整的BPE训练和分词实现。fromcollectionsimportCounter,defaultdictimportreclassBPE:def__init__(self,vocab_size10000):self.vocab_sizevocab_size self.vocab{}self.merges{}defget_stats(self,vocab):统计所有字符对的频率pairsCounter()forword,freqinvocab.items():symbolsword.split()foriinrange(len(symbols)-1):pairs[(symbols[i],symbols[i1])]freqreturnpairsdefmerge_vocab(self,pair,vocab):合并所有词汇中的指定字符对v_out{}bigramre.escape(pair[0] pair[1])patternre.compile(r(?!\S)bigramr(?!\S))forwordinvocab:w_outpattern.sub(.join(pair),word)v_out[w_out]vocab[word]returnv_outdeftrain(self,corpus): 训练BPE模型 corpus: 单词列表 # 初始化词汇表每个单词拆分为单字符vocabCounter()forwordincorpus:word_tokenslist(word)[/w]vocab[ .join(word_tokens)]1# 迭代合并whilelen(vocab)self.vocab_size:pairsself.get_stats(vocab)ifnotpairs:breakbest_pairmax(pairs,keypairs.get)vocabself.merge_vocab(best_pair,vocab)self.merges[best_pair]Trueself.vocab[best_pair]len(self.vocab)print(f合并{best_pair}词汇表大小:{len(vocab)})# 添加单字符到词汇表forcharinset(.join(corpus))):ifcharnotinself.vocab:self.vocab[char]len(self.vocab)deftokenize(self,text):对输入文本进行分词tokenslist(text)[/w]whilelen(tokens)1:# 寻找第一个可合并的位置pairs[(tokens[i],tokens[i1])foriinrange(len(tokens)-1)]# 找优先级最高的合并min_rankNonemin_pairNoneforpairinpairs:ifpairinself.merges:rankself.merges[pair]ifmin_rankisNoneorrankmin_rank:min_rankrank min_pairpairifmin_pairisNone:break# 执行合并new_tokens[]i0whileilen(tokens):ifilen(tokens)-1and(tokens[i],tokens[i1])min_pair:new_tokens.append(.join(min_pair))i2else:new_tokens.append(tokens[i])i1tokensnew_tokensreturn[tfortintokensift!/w] 这段实现展示了BPE的核心机制词汇表构建阶段的迭代合并和分词阶段的贪心应用。关键点在于使用空格分隔符来标记字符边界以及通过re.escape处理可能包含特殊字符的合并对。### WordPiece代码实现WordPiece的实现更加复杂因为它需要维护完整的词汇表并使用动态规划进行最优分词。 pythonclassWordPiece:def__init__(self,vocabNone):self.vocabvocabor{}self.unk_token[UNK]self.unk_id0deftokenize(self,text):对文本进行分词返回子词序列output_tokens[]fortokeninself._basic_tokenize(text):charslist(token)iftokeninself.vocab:output_tokens.append(token)continue# 尝试将单词切分为子词tokens[]start0whilestartlen(chars):endlen(chars)cur_substrNone# 从后向前寻找最长匹配whilestartend:substr.join(chars[start:end])ifstart0:substr##substrifsubstrinself.vocab:cur_substrsubstrbreakend-1ifcur_substrisNone:# 没有找到匹配返回UNKoutput_tokens.append(self.unk_token)breaktokens.append(cur_substr)startend output_tokens.extend(tokens)returnoutput_tokensdef_basic_tokenize(self,text):基础分词处理标点和空格importre# 简单实现按空格分词保留标点tokensre.findall(r\w|[^\s\w],text)return[t.lower()fortintokens] 实际应用中WordPiece词汇表通常由专门的工具如Google的sentencepiece或BERT的tokenization工具生成。词汇表中的子词带有特定前缀标记##表示这是词内延续。### 大模型中的Tokenizer选择不同大模型选择了不同的Tokenizer策略这些选择深刻影响了模型的能力边界。 GPT系列采用BPE的变体——ByteLevelBPE。关键改进是使用UTF-8字节而非Unicode字符作为初始单位。UTF-8中任何字符都可以表示为1-4个字节这意味着词汇表可以从256个基础字节开始训练。这种方法有两个优势理论上有无限的字符词汇表以及能够处理任意Unicode字符串而不会出现未知字符问题。GPT-4的词汇表包含超过10万个Token反映了其处理多语言和特殊符号的能力。 BERT采用WordPiece这与其预训练任务设计密切相关。BERT使用Masked Language Modeling需要将输入的一部分Token替换为[MASK]WordPiece的概率优化目标与此高度一致。此外BERT的词汇表中包含丰富的词根和词缀这有助于模型学习形态学特征。 SentencePiece是另一个值得了解的框架由Google开发并被T5等模型采用。SentencePiece将输入视为原始字节流可以直接训练BPE或Unigram模型无需预分词步骤。这种端到端的处理方式避免了不同语言的分词规则差异更适合多语言模型。### 分词对模型的影响理解Tokenizer的选择对实际应用至关重要。相同的文本经过不同Tokenizer会产生显著差异的Token序列长度。以神经网络Transformer大模型为例 使用较小词汇表的Tokenizer可能产生15-20个Token而使用更大词汇表的Tokenizer可能只需要8-12个Token。Token数量的差异直接影响计算成本与Token数的平方成正比、显存占用和推理延迟。 此外分词粒度影响模型对语义的理解能力。过粗的分词如按空格分词会导致严重的OOV问题过细的分词如纯字符级会显著增加序列长度削弱模型捕捉长距离依赖的能力。子词分词在两者之间取得了平衡通过数据驱动的方式学习适合目标语料的词汇表。---标签大模型、Tokenization、BPE、WordPiece、NLP

相关文章:

大模型Tokenizer原理:深入理解BPE与WordPiece子词编码技术

大模型Tokenizer原理:深入理解BPE与WordPiece子词编码技术 在大型语言模型的技术架构中,Tokenizer(分词器)是连接原始文本与模型输入的关键桥梁。不同于简单的按空格或标点分割,一个优秀的分词器需要将文本切分为模型能…...

Xshell评估过期后,别急着重装!先试试这个注册表修复大法(附Win10/11通用步骤)

Xshell评估过期后的终极修复指南:深入解析注册表空间限制问题 当你看到"Xshell评估期已过"的提示时,第一反应可能是卸载重装。但如果你遇到了"The feature you are trying to use is on a network resource that is unavailable"这样…...

【MIMO通信】基于粒子群算法的蜂窝大规模 MIMO动态 AP选择附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…...

Windows进程模块枚举:绕过API,直接操作PEB_LDR_DATA结构(附完整C++代码)

Windows进程模块枚举:绕过API直接操作PEB_LDR_DATA的底层实践 逆向工程师和安全研究员经常需要在不触发常规API监控的情况下获取进程模块信息。传统方法如EnumProcessModules虽然方便,但在某些特殊场景下可能受限或暴露行踪。本文将深入探讨如何直接通过…...

如何高效管理微信好友关系:WechatRealFriends单向好友检测工具详解

如何高效管理微信好友关系:WechatRealFriends单向好友检测工具详解 【免费下载链接】WechatRealFriends 微信好友关系一键检测,基于微信ipad协议,看看有没有朋友偷偷删掉或者拉黑你 项目地址: https://gitcode.com/gh_mirrors/we/WechatRea…...

基于Notion与Next.js构建现代化静态博客:零运维、高性能的CMS解决方案

1. 项目概述:一个基于Notion的现代化博客系统 如果你和我一样,既想拥有一个设计精美、功能现代的独立博客,又不想被繁琐的服务器运维、数据库管理和复杂的发布流程所困扰,那么 tangly1024/NotionNext 这个项目绝对值得你花时间…...

电网电压畸变也不怕:5分钟看懂SOGI-PLL如何让你的PWM整流器更稳定

电网电压畸变下的稳定之道:SOGI-PLL在PWM整流器中的实战解析 当电网电压出现谐波污染、频率波动或三相不平衡时,传统锁相环就像在暴风雨中航行的船只,难以保持稳定。而双二阶广义积分锁相环(DSOGI-PLL)则如同装备了先进稳定系统的现代舰艇&am…...

EMMA架构:多模态AI的统一表征与动态处理实践

1. 项目概述:重新定义多模态交互的边界 第一次看到EMMA架构的设计文档时,我正被一个跨模态检索项目折磨得焦头烂额。当时我们需要在医疗影像报告中同时处理DICOM文件和医生手写笔记,传统方案就像试图用螺丝刀吃牛排——工具和任务完全不匹配。…...

Rusted PackFile Manager:Total War模组制作的终极指南与高效解决方案

Rusted PackFile Manager:Total War模组制作的终极指南与高效解决方案 【免费下载链接】rpfm Rusted PackFile Manager (RPFM) is a... reimplementation in Rust and Qt6 of PackFile Manager (PFM), one of the best modding tools for Total War Games. 项目地…...

Gofile多线程下载方案:突破限速瓶颈的高效文件传输实战指南

Gofile多线程下载方案:突破限速瓶颈的高效文件传输实战指南 【免费下载链接】gofile-downloader Download files from https://gofile.io 项目地址: https://gitcode.com/gh_mirrors/go/gofile-downloader 在数字化协作日益频繁的今天,从Gofile平…...

DLSS Swapper完整指南:3分钟免费解锁游戏画质与性能的终极方案

DLSS Swapper完整指南:3分钟免费解锁游戏画质与性能的终极方案 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 你是否曾在4K分辨率下玩游戏时,明明拥有强大的显卡,却因DLSS版本过旧而…...

如何快速掌握Balena Etcher:专业高效的镜像烧录工具完全指南

如何快速掌握Balena Etcher:专业高效的镜像烧录工具完全指南 【免费下载链接】etcher Flash OS images to SD cards & USB drives, safely and easily. 项目地址: https://gitcode.com/GitHub_Trending/et/etcher Balena Etcher是一款革命性的开源镜像烧…...

BarrageGrab:基于WebSocket直连架构的全平台直播弹幕实时采集技术栈

BarrageGrab:基于WebSocket直连架构的全平台直播弹幕实时采集技术栈 【免费下载链接】BarrageGrab 抖音快手bilibili直播弹幕wss直连,非系统代理方式,无需多开浏览器窗口 项目地址: https://gitcode.com/gh_mirrors/ba/BarrageGrab 在…...

LabVIEW调用Matlab脚本的两种方法,我为什么最终放弃了公式节点?

LabVIEW调用Matlab脚本的两种方法,我为什么最终放弃了公式节点? 作为一名长期在测试测量领域工作的工程师,我几乎每天都要和LabVIEW打交道。当项目需要复杂算法支持时,Matlab总是我的首选工具。但在实际工程中,如何优…...

视频字幕提取终极指南:如何用本地工具5分钟搞定87种语言

视频字幕提取终极指南:如何用本地工具5分钟搞定87种语言 【免费下载链接】video-subtitle-extractor 视频硬字幕提取,生成srt文件。无需申请第三方API,本地实现文本识别。基于深度学习的视频字幕提取框架,包含字幕区域检测、字幕内…...

从Element UI到Ant Design Vue:一行五列卡片布局在不同UI框架下的迁移指南

从Element UI到Ant Design Vue:一行五列卡片布局的跨框架迁移实战 在Vue技术栈的项目迭代中,UI框架迁移是许多团队都会面临的挑战。当我们需要将项目从Element UI迁移到Ant Design Vue时,保持原有布局的一致性成为关键任务之一。本文将以能源…...

Halcon仿射变换的“孪生兄弟”:vector_angle_to_rigid与手写矩阵,哪个更适合你的项目?

Halcon仿射变换的“孪生兄弟”:vector_angle_to_rigid与手写矩阵,哪个更适合你的项目? 在工业视觉项目中,刚体变换(旋转平移)是最基础也最关键的图像处理操作之一。Halcon作为机器视觉领域的标杆工具&…...

从“黑盒”到“白盒”:给Keil FLM文件做一次“体检”,排查下载失败难题

从“黑盒”到“白盒”:给Keil FLM文件做一次“体检”,排查下载失败难题 当你熬夜调试嵌入式系统,Keil突然弹出"Flash Download failed"的红色警告,那种感觉就像在马拉松终点线前被绊倒。FLM文件作为Keil与Flash芯片之间…...

战略级跨平台自动化驱动管理框架:Brigadier如何将Boot Camp部署时间缩短88%

战略级跨平台自动化驱动管理框架:Brigadier如何将Boot Camp部署时间缩短88% 【免费下载链接】brigadier Fetch and install Boot Camp ESDs with ease. 项目地址: https://gitcode.com/gh_mirrors/bri/brigadier 在当今混合操作系统环境中,企业IT…...

HS2-HF_Patch:突破语言壁垒的《Honey Select 2》一站式增强解决方案

HS2-HF_Patch:突破语言壁垒的《Honey Select 2》一站式增强解决方案 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch 面对《Honey Select 2》日文界面…...

Obsidian Style Settings:让每个用户都能轻松定制专属笔记界面的终极指南

Obsidian Style Settings:让每个用户都能轻松定制专属笔记界面的终极指南 【免费下载链接】obsidian-style-settings A dynamic user interface for adjusting theme, plugin, and snippet CSS variables within Obsidian 项目地址: https://gitcode.com/gh_mirro…...

从老项目Qclaw解析网络流量处理:原始套接字、协议解析与性能优化

1. 项目概述与核心价值 最近在整理一个老项目,名字叫“Commutertrafficfarsi309/Qclaw-old”。乍一看这个标题,可能有点摸不着头脑,但拆解一下就能明白它的分量。“Commutertrafficfarsi309”像是一个特定用户或场景的标识,而“Qc…...

告别手动抄写:如何用Pix2Text智能识别图片中的文字、公式和表格

告别手动抄写:如何用Pix2Text智能识别图片中的文字、公式和表格 【免费下载链接】Pix2Text An Open-Source Python3 tool with SMALL models for recognizing layouts, tables, math formulas (LaTeX), and text in images, converting them into Markdown format. …...

别再让VCF文件为空!GATK4流程中bwa mem的-RG头文件设置详解与实战避雷

别再让VCF文件为空!GATK4流程中bwa mem的-RG头文件设置详解与实战避雷 基因组数据分析流程中,最令人沮丧的莫过于花费数天时间跑完GATK全套流程,最终得到的VCF文件却空空如也。这种看似"顺利运行"实则"无效产出"的问题&a…...

多GPU分布式SFT训练实战:Qwen2-7B调优指南

1. 本地分布式SFT实战:从零到多GPU调优 在上一篇文章中,我们使用trl库搭建了基础的监督式微调(SFT)实验环境。这次我们将挑战在单机多GPU环境下扩展训练规模,以Qwen2-7B模型为例,分享我在实际调优过程中积累的完整技术方案和避坑经…...

别再只会用SUM了!Excel多表汇总和跨列求和,用SUMIF(S)函数一键搞定

告别低效统计:用SUMIF(S)函数实现Excel高阶数据汇总 财务部的张琳最近遇到了一个头疼的问题——领导要求她汇总全年12个月的销售数据,并分别统计各区域"计划"与"实际"销售额的完成情况。面对电脑里密密麻麻的Excel文件,她…...

二手极路由4刷OpenWrt变身‘超级无线网卡’:防ARP攻击+稳定获取IPv6全流程

极路由4刷OpenWrt打造企业级安全网关:从防ARP攻击到IPv6稳定接入全解析 在智能家居和中小企业网络环境中,网络安全问题往往被严重低估。一台售价不到200元的二手极路由4增强版,经过OpenWrt系统改造后,可以变身为价值数千元企业级安…...

别再手动发邮件了!用Python的smtplib和email库,5分钟搞定邮件自动发送(附Gmail/QQ邮箱配置)

用Python解放双手:5分钟搭建高可靠邮件自动化系统 每天早晨9点准时发送日报,每周五下午3点自动推送周报,批量给客户发送个性化营销邮件...这些重复性工作正在吞噬职场人的宝贵时间。作为曾经每天手动发送30封邮件的过来人,我深刻…...

神经网络在车险赔付预测中的应用与实践

1. 项目概述:用神经网络预测车险赔付金额 去年帮朋友处理车险理赔时,我发现保险公司还在用传统的精算表格。这让我萌生了一个想法:能不能用神经网络来预测赔付金额?经过三个月的实战验证,这个模型的预测准确率比传统方…...

Qt交叉编译踩坑实录:从‘stdlib.h找不到’到Wayland DRM EGL支持

Qt交叉编译实战:Wayland支持与疑难问题深度解析 在嵌入式Linux开发中,Qt框架的交叉编译一直是开发者面临的挑战之一。当项目需要Wayland显示协议支持时,问题会变得更加复杂。本文将从一个实际项目案例出发,分享如何解决从基础环境…...