字节对编码 (BPE):提升语言处理的效率和有效性

原文地址:byte-pair-encoding-bpe-bridging-efficiency-and-effectiveness-in-language-processing

2024 年 4 月 12 日

介绍

在快速发展的自然语言处理 (NLP) 领域,对人类语言高效解析和理解的追求带来了重大创新。字节对编码(BPE)作为一种关键技术脱颖而出,特别是在机器学习和语言模型训练中。本文深入探讨了 BPE 的机制、其实际应用及其对 NLP 领域的深远影响。

1

技术背景

字节对编码(BPE)是一种数据压缩技术,最初是为压缩文本数据而开发的。但在自然语言处理(NLP)中,它仍被广泛用于标记化。在 NLP 中,BPE 被用于将文本分割成子词单元,这有利于处理词汇量和语言模型中的词汇量不足问题。

以下是 BPE 在 NLP 中的工作原理:

  1. 从词汇开始: 最初,词汇表由数据集中的每个独特字符或单词及其频率组成。
  2. 迭代合并词对: 算法会反复查找文本中出现频率最高的一对相邻符号(或字符),并将它们合并为一个新符号。然后将这个新符号添加到词汇表中。
  3. 重复直到达到标准:这一过程一直持续到预定的合并次数或达到所需的词汇量为止。
  4. 标记文本: 合并完成后,根据最终的合并集将文本标记为子词。这些子词可以是单个字符,也可以是完整的单词,具体取决于它们在文本中的出现频率。

BPE 的优势在于,它可以通过创建有效代表常见字符序列或单词的词汇来适应数据集。这使得它特别适用于词汇量较大的语言或具有专业术语的建模领域。

在机器学习中,尤其是在训练 GPT(生成预训练转换器)等语言模型时,BPE 有助于在不丢失重要信息的情况下缩小输入表示的大小。它平衡了字符级和单词级表示,使模型能更有效地处理罕见单词或名称。

了解 BPE 的机制

字节对编码(Byte Pair Encoding)最初是为数据压缩而设计的,现在被巧妙地重新用于 NLP 中的文本标记化。BPE 的核心算法是迭代合并数据集中最常见的字符对或序列,直到达到指定的词汇量。这一过程可将原始文本转化为子词单位,即可代表更复杂单词或短语的构件。BPE 的亮点在于其简单性和适应性;它能动态构建词汇,反映文本中序列的实际用法和频率,从而使模型适合其训练语料。

BPE 在 NLP 中的实际应用

BPE 在 NLP 中的应用主要是由于它能够平衡粒度和计算效率。在训练 GPT(生成式预训练转换器)等语言模型时,BPE 通过将文本分割成易于管理、有意义的单元,同时又不过分简化语言结构,发挥了至关重要的作用。这种分割使模型能够处理许多术语,包括罕见词和特定领域的行话,从而增强其预测能力和语言覆盖范围。

此外,BPE 的影响还超出了单个词的处理,影响到模型的整体性能。通过减少词汇量,从而降低模型的复杂性,BPE 可以缩短训练时间,降低内存要求。但是,这种效率并不是以有效性为代价的;BPE 使模型能够更好地理解语言的细微差别,捕捉文本中蕴含的形态和语义微妙之处。

BPE 对 NLP 的影响

字节对编码对 NLP 的影响是深远而多方面的。通过为词汇问题提供可扩展的解决方案,BPE 在推动最先进的语言建模方面发挥了重要作用。它为开发大规模、高性能的模型铺平了道路,以便理解和生成跨语言和跨领域的类人文本。

此外,BPE 还实现了先进 NLP 技术的普及。它能够利用有限的计算资源高效处理文本,这意味着更多的组织和个人可以利用尖端的语言模型进行各种应用,从自动翻译服务到上下文感知聊天机器人。

代码

使用字节对编码(BPE)实现一个完整的系统,包括合成数据集生成、特征工程、超参数调整、交叉验证,以及在单个代码块中进行结果解释和绘图,需要大量代码。不过,我将提供一个涉及这些方面的简化版本。

下面的 Python 代码演示了在合成数据集上的简化 BPE 流程,以及基本的模型训练和评估:

import numpy as np
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.linear_model import LogisticRegression
import matplotlib.pyplot as plt
from collections import Counter, defaultdict
# Synthetic dataset generation
words = ["hello", "world", "helloo", "word", "test", "testing", "tester"]
vocab = Counter(" ".join(words))
# BPE algorithm
def get_stats(vocab):pairs = defaultdict(int)for word, freq in vocab.items():symbols = word.split()for i in range(len(symbols)-1):pairs[symbols[i], symbols[i+1]] += freqreturn pairs
def merge_vocab(pair, v_in):v_out = {}bigram = ' '.join(pair)replacer = ''.join(pair)for word in v_in:w_out = word.replace(bigram, replacer)v_out[w_out] = v_in[word]return v_out
num_merges = 10
for i in range(num_merges):pairs = get_stats(vocab)if not pairs:breakbest = max(pairs, key=pairs.get)vocab = merge_vocab(best, vocab)
# Feature engineering: Encoding words as counts of BPE tokens
token_counts = Counter()
for word in words:for token in vocab:if token in word:token_counts[token] += 1
X = np.array([token_counts[word] for word in words])
y = np.array([len(word) > 5 for word in words])  # Simple target variable
# Data splitting
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Model training and hyperparameter tuning
model = LogisticRegression(C=1.0)  # Simple hyperparameter
model.fit(X_train.reshape(-1, 1), y_train)
# Cross-validation
scores = cross_val_score(model, X.reshape(-1, 1), y, cv=2)
print(f"Cross-validation scores: {scores}")
# Model evaluation
accuracy = model.score(X_test.reshape(-1, 1), y_test)
print(f"Test accuracy: {accuracy}")
# Plotting results
plt.scatter(X, y, color='blue', label='data')
plt.plot(X, model.predict(X.reshape(-1, 1)), color='red', label='model')
plt.xlabel('BPE token counts')
plt.ylabel('Word length > 5')
plt.title('BPE Tokenization and Logistic Regression')
plt.legend()
plt.show()
# Interpretation
print("The model's performance and the cross-validation scores indicate the effectiveness of BPE tokenization in feature representation.")

该代码包括

  • 用一小组单词生成合成数据。
  • 简单的 BPE 实现,迭代合并最频繁的字符对。
  • 基本特征工程,其中的特征是单词中 BPE 标记的计数。
  • 预测单词长度是否超过 5 的逻辑回归模型是一项占位任务。
  • 交叉验证和准确度评估。
  • 可视化模型与数据拟合的曲线图。

本示例经过高度简化,展示了如何将 BPE 集成到机器学习工作流程中。在现实世界中,你需要更大的数据集、更复杂的特征工程、广泛的超参数调整以及全面的模型评估。

2

上图是合成数据集的一个样本,显示了单词及其各自的长度。这种可视化方式有助于我们了解所处理数据的基本结构。

3

图中显示的两个数据点代表逻辑回归模型的结果,X 轴为 BPE 标记计数,Y 轴为二元目标变量(词长 > 5)。x 轴上的最小值在零附近,这可能表明 BPE 标记计数已被归一化或计数很低,这可能是由于词汇量很小或标记不常见造成的。

y 轴为二进制,长度为 5 或 5 以下的词为 0,长度为 5 以上的词为 1。图中显示了一个 y 值为 0 的数据点和一个 y 值为 1 的数据点,两者的 x 值均约为 0。代表逻辑回归模型的红线不明显,这可能是由于缩放问题或与其中一个坐标轴重叠。

结论

字节对编码是 NLP 效率和效果的完美结合。通过对文本标记化的创新方法,BPE 提高了语言模型的性能,并扩大了它们在语言和计算领域的适用性。在我们继续探索语言和技术前沿的过程中,BPE 证明了推动 NLP 进步的独创性和适应性。它的持续贡献无疑将塑造人机交流的未来,使其成为不断扩展的语言处理工具包中不可或缺的工具。

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

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

相关文章

华为校招机试 - 云服务计费(20240410)

在线OJ测试 题目详情 - 云服务计费 - HydroOJ​​​​​​​ 题目描述 编写一个程序为某云服务计算客户话单,输入为某云服务的计费日志和各种计费因子的计费单价的列表,计费日志内容包含 4 个字段: 时间戳客户标识计费因子计费时长 日志中…

Linux mkisofs命令教程:创建和编辑ISO文件(附实例详解和注意事项)

Linux mkisofs命令介绍 mkisofs是一个用于创建ISO 9660映像文件的实用程序。它可以从磁盘上的文件生成ISO 9660/JOLIET/HFS混合文件系统。这个文件系统能够生成Rock Ridge交换协议所规定的系统使用共享协议记录(SUSP)。这些记录用于在ISO 9660文件系统中…

C++ UML 类图介绍与设计

1 类图概述 UML(Unified Modeling Language),即统一建模语言,是用来设计软件的可视化建模语言。它的特点是简单、统一、图形化、能表达软件设计中的动态与静态信息。UML从目标系统的不同角度出发,定义了用例图、类图、对象图、状态图、活动图…

深拷贝总结

JSON.parse(JSON.stringify(obj)) 这行代码的运行过程,就是利用 JSON.stringify 将js对象序列化(JSON字符串),再使用JSON.parse来反序列化(还原)js对象;序列化的作用是存储和传输。&#xff08…

命令行操作

1、pwd(显示当前工作所在的目录) pwd 命令,是 Print Working Directory (打印工作目录)的缩写,功能是显示用户当前所处的工作目录。 2、ls(列出当前目录中包含的所有文件和子目录) ls 命令,list 的缩写,是最常见的目录操作命令,其主要功能是显示当前目录下的内容…

高级IO——React服务器简单实现

3.4Reactor服务器实现 1.connect封装 ​ 每一个连接都要有一个文件描述符和输入输出缓冲区&#xff0c;还有读、写、异常处理的回调方法&#xff1b; ​ 还包括指向服务器的回指指针&#xff1b; class connection; class tcpserver;using func_t std::function<void(s…

亚马逊云科技官方重磅发布GenAI应用开发学习路线(全免费)

今天小李哥给大家分享的是亚马逊云科技&#xff08;AWS&#xff09;最近官方发布的GenAI应用开发最佳学习路线&#xff0c;不仅内容非常全面更主要的是全部免费&#xff01;大家动动小手就能成为GenAI开发大&#x1f42e;&#xff01; 1️⃣这个GenAI开发学习路线包括什么&…

https://ac.nowcoder.com/acm/contest/78309

A-scx 的散文诗句_华中农业大学第十三届程序设计竞赛&#xff08;同步赛&#xff09; (nowcoder.com) #include<bits/stdc.h> using namespace std; #define int long long const int N3e56; const int inf0x3f3f3f3f; int a[N]; void solve() {int n;cin>>n;int …

遥感卫星:探索地球的科技之旅

遥感卫星是人类探索地球、理解地球、保护地球的重要工具&#xff0c;其发展历程承载了人类对地球的探索与认知的历程。从最初的概念到如今的高科技应用&#xff0c;遥感卫星技术的发展见证了人类科技的不断进步与创新。 初心萌芽&#xff1a; 遥感卫星的发展始于20世纪中叶&…

【计算机网络】(一)计算机网络概述

文章目录 【计算机网络】&#xff08;一&#xff09;计算机网络概述前言1.1 计算机网络在信息时代中的作用1.2 互联网概述1.2.1 网络的网络1.2.2 互联网基础结构发展的三个阶段1.2.3 互联网标准化工作 1.3 互联网的组成1.3.1 互联网的边缘部分1.3.2 互联网的核心部分 1.4 计算机…

C语言高质量编程之assert()和const

目录 编程中常见的错误 assert() const 编程中常见的错误 在编程中我们通常会遇到三种错误形式&#xff0c;分别是&#xff1a;编译型错误&#xff0c;链接型错误&#xff0c;运行时错误。 编译型错误&#xff1a; 在编译阶段发生的错误&#xff0c;绝大多数情况是由语法错误…

类 继承 (均未写完)

一、Fraction类&#xff08;分数&#xff09; class Fraction:def __init__(self, top, bottom):if bottom 0:print("Error:分子分母不能为0")else:n gcd(top, bottom)self.num top // nself.den bottom // n# 分数的输出def __str__(self):return str(self.num)…

Iterator接口用法详解(Java)

Iterator接口 Iterator 接口是 Java 集合框架中的一个核心接口&#xff0c;用于遍历集合中的元素。它定义了一种迭代器的行为&#xff0c;允许按顺序访问集合中的元素&#xff0c;而不需要暴露集合内部的结构。 当你使用 Iterator 接口遍历集合时&#xff0c;你实际上在使用设…

进阶级Python编程题(5)洛谷(不高兴的津津)和index函数的用法

题目描述 津津上初中了。妈妈认为津津应该更加用功学习&#xff0c;所以津津除了上学之外&#xff0c;还要参加妈妈为她报名的各科复习班。另外每周妈妈还会送她去学习朗诵、舞蹈和钢琴。但是津津如果一天上课超过八个小时就会不高兴&#xff0c;而且上得越久就会越不高兴。假…

利用Sentinel解决雪崩问题(二)隔离和降级

前言&#xff1a; 虽然限流可以尽量避免因高并发而引起的服务故障&#xff0c;但服务还会因为其它原因而故障。而要将这些故障控制在一定范围避免雪崩&#xff0c;就要靠线程隔离(舱壁模式)和熔断降级手段了&#xff0c;不管是线程隔离还是熔断降级&#xff0c;都是对客户端(调…

vue源码解析——v-if和v-for哪个优先级高,如何避免两者同时使用

首先&#xff0c;官方不推荐v-if和v-for在同一个元素上使用。其次&#xff0c;如果两者同时使用&#xff0c;v-if和v-for的优先级怎么确定&#xff1f;在vue2和vue3中这两者的优先级顺序不一样。vue2是v-for优先&#xff0c;条件不存在时也会渲染多个注释节点。在vue3中进行了改…

基于51单片机的无线病床呼叫系统设计—LCD1602显示

基于51单片机的无线病床呼叫系统 &#xff08;仿真&#xff0b;程序&#xff0b;原理图&#xff0b;设计报告&#xff09; 功能介绍 具体功能&#xff1a; 1.病人按下按键&#xff0c;LCD1602显示对应的床位号&#xff1b; 2.多人同时呼叫&#xff0c;显示屏同时显示&#xf…

文献阅读:Viv:在 web 上多尺度可视化高分辨率多重生物成像数据

文献介绍 「文献题目」 Viv: multiscale visualization of high-resolution multiplexed bioimaging data on the web 「研究团队」 Nils Gehlenborg&#xff08;美国哈佛医学院&#xff09; 「发表时间」 2022-05-11 「发表期刊」 Nature Methods 「影响因子」 47.9 「DOI…

第17天:信息打点-语言框架开发组件FastJsonShiroLog4jSpringBoot等

第十七天 本课意义 1.CMS识别到后期漏洞利用和代码审计 2.开发框架识别到后期漏洞利用和代码审计 3.开发组件识别到后期漏洞利用和代码审计 一、CMS指纹识别-不出网程序识别 1.概念 CMS指纹识别一般能识别到的都是以PHP语言开发的网页为主&#xff0c;其他语言开发的网页识…

Unix环境高级编程-学习-09-多线程之读写锁与条件变量(包含线程池的部分实现与测试验证)

目录 一、多线程相关文章链接 二、自由抒发 1、读写锁 2、条件变量 三、函数介绍 1、pthread_rwlock_init &#xff08;1&#xff09;声明 &#xff08;2&#xff09;作用 &#xff08;3&#xff09;参数 &#xff08;4&#xff09;返回值 &#xff08;5&#xff09;…