Transformer 通关秘籍2:利用 BERT 将文本 token 化

前面两节分别通过两个代码示例展示了模型将文本转换为 token 之后是什么样的,希望你可以对此有一个感性的认识。

本节来简要介绍一下将一个连续的文本转换为 token 序列的大致过程,这个过程被称为分词,也叫 tokenization。

在你没了解这方面的知识之前,如果让你实现一个类似的算法,你会如何来实现呢?我想你可能最先想到便是使用空格来进行分词。

Attention:全网最全的 AI 小白到 AI 大神的天梯成长学习路线,几十万原创专栏和硬核视频,点击这里查看:AI小白到AI大神的天梯之路

基于空格的分词

当然,这是一种最简单的分词方法。

它直接使用空格或者一些标点符号来切分文本。常用于处理那些单词之间以空格明显分隔的语言,如英语,这里给出一个基于空格的分词示例:

假设有下面一句话:

"I love learning new things about artificial intelligence and machine learning."

用空格分词后,就可以直接得到如下的 token 。

['I', 'love', 'learning', 'new', 'things', 'about', 'artificial', 'intelligence', 'and', 'machine', 'learning.']

这个很简单,也非常好理解。

这种分词方法可以用来处理一些简单的文本,但是在大型语言模型中几乎不会用到。因为太简单了,无法处理复杂的语境。

在大语言模型中,一般会使用更先进的分词方法,比如 BPE (Byte Pair Encoding)和 WordPiece 算法,这两个算法在前面两节展示 token 的时候曾经提到过,但未深入展开。

WordPiece/ BPE 的分词逻辑

WordPiece 是由 Google 开发的,后来被用在了 BERT 模型的分词过程中,而 BPE (Byte Pair Encoding,也叫字节对编码)最初是一种用于数据压缩的算法,后来才被应用到自然语言处理领域,GPT 系列的模型使用的便是 BPE 分词方法。

这两种方法对于文本的分词过程大致相同,下面通过一个例子来说明一下。

假设某文本中仅包含以下词汇:bug,debug,debugger。这里为了方便展示,假设以上词汇在文本中仅出现了一次,不考虑出现多次的情况。

首先,分词算法对以上单词进行拆分,拆分为独立的字符形式,如:

● “bug” → (“b”, “##u”, “##g”)
● “debug” → (“d”, “##e”, “##b”, “##u”, “##g”)
● “debugger” → (“d”, “##e”, “##b”, “##u”, “##g”, “##g”,“##e”, “##r”)

##代表该字符与前面的字符在拆分之前是一个完整的词。

然后,将拆分后的词汇进行汇总,得到拆分后的词汇表为:(“b”, “##u”, “##g”, “d”, “##e”, “##r”)

接下来,对上述词汇表中的词进行合并:通过一定的合并算法,将上述已拆分的子词合并。

比如,你可以使用统计的方法,经过统计发现,##u 和 ##g 在原始文本中成对出现的频率很高,那么就优先将 ##u 和 ##g 进行合并。

合并之后,最初的词汇表就变成了(“b”, “##ug”, “d”, “##e”, “##r”)。

在此基础上,还可以进一步合并,比如还可以将 b 与 ##ug进一步合并得到 bug,将d 和 ##e 进一步合并得到 de。

从而最终合并完的词汇表可能为:(“bug”, “de”, “#ger”)。

这种分词的方法,可以理解为是一种将文本拆分然后通过一定的算法再进行合并的过程,也就是说拆了又合,但是合并完和拆之前一般是不一样的。
在这里插入图片描述

WordPiece 以及 BPE 算法的不同,便是“一定的合并算法”的不同。

WordPiece 需要计算子词与子词之间的相关性分数来进行合并,而 BPE 则是单纯计算子词之间成对出现的频率来进行合并的。

但不管怎么样,两者有类似的地方:都是要先将原始词汇进行拆分,然后再进行合并,得到最终得到的词汇表(这是一个包含所有 token 的表,也可以认为是 token 的集合或者字典)。

这种方法不仅能够处理一些没有见过的词汇(因为已经把它们分解为已知的子词单元),还能优化词表的大小,从而提高语言模型的性能和效率。

需要说明的是,以上仅描述了分词的大致过程,分词并非本专栏的重要内容,在本专栏的知识架构下,你只需要了解一些常见的分词过程即可。

如果对于分词算法的细节感兴趣,可以查看一下这篇文章,写的比较详细:https://www.zhihu.com/question/64984731/answer/3183726323。

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

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

相关文章

Optional的stream方法,flatMap, filter应用

Java 8引入的Optional和Stream彻底改变了我们处理空值和集合操作的方式。本文将深入探讨如何将二者结合使用,通过四个核心场景提升代码的健壮性和简洁性。 一、Optional构成的Stream:空值自动过滤 当处理Optional集合时,我们常需要过滤掉空…

参加李继刚线下活动启发:未来提示词还会存在吗?

上周六,我参加了李继刚老师组织的线下活动。 现场干货满满,尤其是关于 AI 时代提示词的价值、与 AI 沟通的艺术等话题,李老师的分享如同醍醐灌顶,让我对 AI 人机协作有了更深的理解。 将几点核心收获整理出来,与大家…

Python基础知识第二天:从格式化到流程控制

Python基础知识第二天:从格式化到流程控制 大家好!今天我们来梳理Python的一些重要基础知识,包括格式化输出、输入函数、运算符以及流程控制语句。 1. 格式化输出 Python提供了多种格式化输出的方式: # %d, %f, %s 格式化name &q…

GDB: coredump

前言:一句话如下使用 gdb [exec_file] [core_file] # or gdb -c [core_file] [exec_file] #-c指定转储的core文件 gdb -c core.5213 spp_uc_frequent_contact_ol_worker # 进入后输入bt查看调用栈 bt #显示所有帧栈 bt 10 #显示前面10个帧栈(感觉没啥用) bt …

21_js正则_表单验证

目录 正则 一、 正则的概念 二、创建正则方式 2.1 构造函数去创建正则 2.2 字面量去创建正则 2,3 test方法 三、正则修饰符 四、 正则的方法 lastIndex test方法 exec 五、字符串方法 replace match search split 六、正则表达式的构成 元字符-- 定位符 元字…

矿山自动化监测解决方案

1.行业现状 为贯彻落实《中共中央国务院关于推进安全生产领域改革发展的意见》《“十四五”矿山安全生产规划》(应急〔2022〕64号)、《国务院安委会办公室关于加强矿山安全生产工作的紧急通知》(安委办〔2021〕3号)等有关工作部署…

企业级知识库建设:自建与开源产品集成的全景解析 —— 产品经理、CTO 与 CDO 的深度对话

文章目录 一、引言二、主流产品与方案对比表三、自建方案 vs. 开源产品集成:技术路径对比3.1 自建方案3.2 开源产品集成方案 四、结论与个人观点 一、引言 在当今数据驱动的商业环境中,构建高质量的知识库已成为企业数字化转型的关键一环。本博客分别从…

【蓝桥杯】单片机设计与开发,温度传感器DS18B20

一、温度传感器概述 结构图 二、通信过程 三、onewire单总线协议概述 四、单总线的工作原理 黑粗线是单片机发送的,浅的是s18b20回应的 五、温度传感器的应用 六、onewire 七、课后习题

Python 在Word中查找并替换文本

在操作Word文档时,如果想要修正一处反复出现的拼写错误,统一文中前后不一致的术语,或者将文档中所有的旧联系方式更新为新号码。这时我们可以使用 Word中的查找替换功能,快速定位并批量处理文档中的特定文本,提升编辑效…

Python 笔记 (二)

Python Note 2 1. Python 慢的原因2. 三个元素3. 标准数据类型4. 字符串5. 比较大小: 富比较方法 rich comparison6. 数据容器 (支持*混装* )一、允许重复类 (list、tuple、str)二、不允许重复类 (set、dict)1、集合(set)2、字典(dict)3、特殊: 双端队列 deque 三、数据容器的共…

kill子进程后再wait可以吗?

在父进程中先使用 kill 函数终止子进程,之后再使用 wait 函数是可行的,下面从原理、使用示例、注意事项几个方面详细说明。 原理 kill 函数:其作用是向指定进程发送信号。当向子进程发送 SIGTERM(通常用于请求进程正常终止&…

ai-api-union项目,适配各AI厂商api

项目地址:alpbeta/ai-api-union 需求:实现兼容各大模型厂商api的流式对话和同步对话接口,本项目现兼容智谱、豆包、通义、通义版deepseek 设计 一个ChatController类对外暴露这两个接口,入参都为ChatRequest请求类,…

【QT】QT样式设计

QT样式设计 一、QT工程中添加资源文件1.资源文件:2. 添加步骤:3. 新增资源文件以及删除现有的资源文件4. 使用资源文件 二、QT中的qss语句(样式设计语句)1. 样式设计2.常见的qss语句示例代码: 一、QT工程中添加资源文件 1.资源文件&#xff…

Megatron-LM中的deepseek-v3实现

Megatron-LM:https://github.com/NVIDIA/Megatron-LM/tree/main 使用此仓库构建的著名的库也有很多,如: Colossal-AI, HuggingFace Accelerate, and NVIDIA NeMo Framework.Pai-Megatron-Patch工具是阿里人工智能平台PAI算法团队研发,ai-Megatron-Patch…

[mlr3] Bootstrap与交叉验证k-fold cross validation

五折交叉验证因其无放回分层抽样和重复验证机制,成为超参数调优的首选; 而Bootstrap因有放回抽样的重复性和验证集的不稳定性,主要服务于参数估计(置信区间的计算)而非调优。 实际应用中,可结合两者优势&am…

某大麦手机端-抢票

引言 仅供学习研究,欢迎交流 抢票难,难于上青天!无论是演唱会、话剧还是体育赛事,大麦网的票总是秒光。作为一名技术爱好者,你是否想过用技术手段提高抢票成功率?本文将为你揭秘大麦手机端抢票的核心技术…

最常使用的现代C++新特性介绍

现代 C泛指的是从 C11 之后的 C标准. 从 C11 开始, C标准委员会实行班车制, 没三年发布一个新版本, 如果一个功能在新版本发布之前已经准备好, 则可以加入该版本中, 否则延后到下一个版本. 语言核心 自 C11 开始, 语言语法层面加了许多语法糖, 还有增加了一些新语法.使得 C语…

SQL Server:当在删除数据库时因为存在触发器而无法删除

当在删除数据库时因为存在触发器而无法删除,你可以通过禁用触发器来解决这个问题。下面为你介绍在 SQL Server 里禁用和启用触发器的方法。 禁用数据库中所有表的触发器 你可以使用系统视图 sys.triggers 来查询数据库里所有的触发器,然后生成禁用这些…

【Linux篇】进程入门指南:操作系统中的第一步

步入进程世界:初学者必懂的操作系统概念 一. 冯诺依曼体系结构1.1 背景与历史1.2 组成部分1.3 意义 二. 进程2.1 进程概念2.1.1 PCB(进程控制块) 2.2 查看进程2.2.1 使用系统文件查看2.2.2 使⽤top和ps这些⽤⼾级⼯具来获取2.2.3 通过系统调用…

销售易vs纷享销客:制造行业CRM选型深度解析

“以客户为中心”,顾名思义就是指让客户贯穿企业市场、研发、生产、销售、服务全流程,以客户需求为导向进行经营。CRM作为企业数字化建设基础设施,在企业高质量发展进程中扮演着重要角色。在众多CRM解决方案中,腾讯旗下CRM销售易凭…