字节对编码 (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,一经查实,立即删除!

相关文章

C++ UML 类图介绍与设计

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

深拷贝总结

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

深度学习学习日记4.14 数据增强 Unet网络部分

数据增强 transforms.Compose([:这表示创建一个转换组合,将多个数据转换操作串联在一起 transforms.RandomHorizontalFlip():这个操作是随机水平翻转图像,以增加数据的多样性。它以一定的概率随机地水平翻转输入的图像。 transfo…

29、链表-删除链表的倒数第N个结点

思路: 首先找到倒数第N个结点 第一种方式 先统计链表的节点数,然后再次遍历len-N即可得到倒数第N个结点,然后将前一个节点的next指针指向next的下一个节点使用快慢指针,快指针先跑N个结点然后慢指针开始跑,等快指针到达尾节点后…

多因子模型的因子选取

经典的Alpha模型是一些多因子模型,用于预测Alpha模型的信息比率,从而来判断判断模型的好坏。这里我们所说的信息比率是相对收益率除以非系统性风险,所以当我们在进行因子选择的时候,我们一定不能选取系统性风险模型(例…

免费VPS云服务器汇总,最长永久免费使用

目前云服务器市场竞争很激烈,为了方便吸引上云,很多云计算服务商提供免费试用云服务器,下面给大家整理汇总一下免费VPS云服务器,最长永久免费使用! 一、雨云(优惠码:ABC) 活动地址:…

2D AI交互数字人:赋能文旅、金融、政务、教育行业数字化转型

AI交互数字人结合了语音合成、语音识别、语义理解、图像处理、机器翻译、虚拟形象驱动等多项AI核心技术,可以提供服务导览、业务咨询、语音互动交流、信息播报等智能服务。 其中,2D AI交互数字人是采集真人视频,通过AI训练,生成逼…

认识OpenEuler操作系统

引言 在信息技术日新月异的时代,开源软件已成驱动创新的核心动能,其中,OpenEuler作为一款冉冉升起的开源操作系统典范,凭借其对开源精神的坚守与技术创新的不懈追求,自亮相以来便引发了全球关注。本文将全方位深挖Open…

Xcode 15.0 新 #Preview 预览让 SwiftUI 界面调试更加悠然自得

概览 从 Xcode 15 开始,苹果推出了新的 #Preview 宏预览机制,它无论从语法还是灵活性上都远远超过之前的预览方式。#Preview 不但可以实时预览 SwiftUI 视图,而且对 UIKit 的界面预览也是信手拈来。 想学习新 #Preview 预览的一些超实用调试…

使用新一代一站式 AI Bot 开发平台扣子coze,搭建我的第一个AI Bot(前端魔法师) ,

目录 1.概述​ 2.功能与优势 3.使用扣子 4.人设与回复逻辑 5.添加插件 6.预览与调试 7.发布bot Store 8.环境大家体验(给大家内置了比较屌的插件) 9.推荐阅读: 1.概述​ 扣子是新一代一站式 AI Bot 开发平台。无论你是否有编程基础…

iOS------SDWebImage源码

一,简介 一个异步图片下载及缓存的库 特性: 一个扩展UIImageView分类的库,支持加载网络图片并缓存图片异步图片下载器异步图片缓存和自动图片有效期限管理支持GIF动态图片支持WebP背景图片减压保证同一个URL不会再次下载保证无效的URL不会…