【NLP 59、大模型应用 —— 字节对编码 bpe 算法】

目录

一、词表的构造问题

二、bpe(byte pair encoding) 压缩算法

算法步骤

示例:

步骤 1:初始化符号表和频率统计

步骤 2:统计相邻符号对的频率

步骤 3:合并最高频的符号对

步骤 4:重复合并直至终止条件

三、bpe在NLP中的使用示例

1.第一步

2.第二步

3.第三步

四、tiktoken 分词工具

1.可视化网站

2.分词工具 解码序列

五、大语言模型处理中文时是分字还是分词?

六、bbpe(Byte-Level Byte Pair Encoding)


你和生生不息的河流,生动了我人生中的美好瞬间

                                                                        —— 25.4.11

一、词表的构造问题

为了nlp模型训练,词表(字表)是必要的

统计训练语料中的所有字符(或词)是一种做法,但是容易出现一些问题:

        1)测试数据中出现训练数据中没有的词

        2)词表过大

        3)对于不同语种,切分粒度不好确认(字 or 词)


二、bpe(byte pair encoding) 压缩算法

        BPE 最初是一种数据压缩算法,通过迭代合并数据中最频繁出现的字节对(Byte Pair),逐步构建一个编码表,将高频字节对替换为一个新的符号,从而减少数据中的重复模式,达到压缩目的。其核心逻辑是:通过统计数据中相邻符号的频率,不断合并高频符号对,生成更复杂的新符号,最终将原始数据转换为符号序列,减少数据冗余。

算法步骤

假设输入数据为字符串,初始符号为单个字符(或字节)

Suppose the data to be encoded is:

aaabdaaabac

The byte pair "aa" occurs most often, so it will be replaced by a byte that is not used in the data, such as "Z". Now there is  the following data and replacement table:

ZabdZabac
Z=aa

Then the process is repeated with byte pair 'ab", replacing it with "Y" : 

ZYdZYac
Z=aa
Y=ab

The only literal byte pair left occurs only once, and the encoding might stop here. Alternatively, the process could continue with recursive byte pair encoding, replacing "ZY" with "X":

XdXac
Z=aa
Y=ab
X=ZY

示例:

步骤 1:初始化符号表和频率统计

        将输入数据拆分为最小单元(如单个字符或字节),初始符号表为所有唯一字符的集合。

例如:

输入数据为 {"low", "lower", "newer", "widest"}

初始符号为 {"l", "o", "w", "e", "r", "n", "w", "i", "d", "s", "t"}

步骤 2:统计相邻符号对的频率

        遍历数据,统计所有相邻符号对(Bigram)的出现次数。

例如:

"lo" 出现 2 次("low" 和 "lower"),

"ow" 出现 1 次("low"),

"er" 出现 2 次("lower" 和 "newer"),

其他符号对频率依次统计。

步骤 3:合并最高频的符号对

        选择频率最高的符号对,将其作为新符号加入符号表,并在数据中替换所有该符号对为新符号。

例如:

若 "er" 是最高频对(频率 2),合并后新符号为 "er",

数据转换为 {"l ow", "l o er", "n ew er", "w i d e s t"}(注意空格表示符号间隔)。

步骤 4:重复合并直至终止条件

        重复步骤 2-3,直到达到预设的合并次数(如生成 1000 个符号)或无法继续合并(所有符号对频率为 1)。

例如:

最终符号表包含原始字符和合并生成的新符号(如 "lo", "er", "new" 等),数据被转换为符号序列。


三、bpe在NLP中的使用示例

1.第一步

Ⅰ、假设语料内容如下:

he had a cat

the cat is sitting on the mat

Ⅱ、统计字符集合:

['a', 'c', 'd', 'e', 'g', 'h', 'i', 'm', 'n', 'o', 's', 't']

Ⅲ、统计相邻字符同时出现的次数(字符中如有空格不算相邻)

he:3 (he, the*2)

ha:1 (had)

ad:1 (had)

ca:2 (cat*2)

at:3 (cat*2, mat)

th:2

is:1

si:1

it:1

ti:1

in:1

ng:1

on:1

ma:

Ⅳ、最高频的组合被视为一个新的字符,新的字符集合:

['a', 'c', 'd', 'e', 'g', 'h', 'i', 'm', 'n', 'o', 's', 't', 'X', 'Y'],X = he,Y = at


2.第二步

Ⅰ、假设语料内容如下:

he had a cat

the cat is sitting on the mat

Ⅱ、新词表:

['a', 'c', 'd', 'e', 'g', 'h', 'i', 'm', 'n', 'o', 's', 't', 'X', 'Y'],X = he,Y = at

Ⅲ、统计相邻字符同时出现的次数(字符中如有空格不算相邻)

tX(t'he'):2(the * 2)

ha:1(had)

ad:1(had)

cY(c'at'):2(cat * 2)

is:1

si:1

it:1

ti:1

in:1

ng:1

on:1

mY(m'at'):1

Ⅳ、最高频的组合被视为一个新的字符,新的字符集合:

['a', 'c', 'd', 'e', 'g', 'h', 'i', 'm', 'n', 'o', 's', 't', 'X', 'Y', 'Z', 'M' ],Z = tX(t'he'),M = ha


3.第三步

依次循环,重复合并直至终止条件


四、tiktoken 分词工具

1.可视化网站

tokenization 可视化网站:https://www.aitokenizer.xyz/


2.分词工具 解码序列

import tiktokenencoding = tiktoken.get_encoding("cl100k_base")
print(encoding.encode("一切都会好的,我一直相信"))


五、大语言模型处理中文时是分字还是分词?

        答:既不是分字,也不是分词,是介于字与词之间的一种东西,我们称之为 token,大语言模型可以把一个字切分为多个token,也可能把多个字当成一个token,这些token本质上是由训练数据通过统计算法得到


六、bbpe(Byte-Level Byte Pair Encoding)

        BBPE(Byte-Level Byte Pair Encoding,字节级字节对编码)是一种分词算法,是BPE(Byte Pair Encoding)的进阶版本。它通过将文本分解为字节序列,并在字节级别合并高频连续字节对来构建词表,从而解决了BPE在多语言和特殊字符处理中的局限性。


        通过bpe算法,就可以在同一段文本中将不同语种的句子粘合在一起;而数字问题用bpe思想做时,就会导致一定数学计算的问题

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

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

相关文章

TMS320F28P550SJ9学习笔记15:Lin通信SCI模式结构体寄存器

今日初步认识与配置使用Lin通信SCI模式,用结构体寄存器的方式编程 文章提供完整工程下载、测试效果图 我的单片机平台是这个: LIN通信引脚: LIN通信PIE中断: 这个 PIE Vector Table 表在手册111页: 这是提到LINa的PI…

linux-设置每次ssh登录服务器的时候提醒多久需要修改密码

在 Linux 系统中,你可以通过设置 motd(Message of the Day)或 sshd 配置来在用户通过 SSH 登录时提醒他们密码即将过期。以下是具体步骤: 方法 1: 使用 motd 文件 motd 文件在用户登录时显示,你可以通过脚本动态生成内容,提醒用户密码过期时间。 编辑 /etc/motd 文件:…

matlab求和∑函数方程编程?

matlab求和∑函数方程编程? 一 题目:求下列函数方程式的和 二:代码如下: >> sum_result 0; % 初始化求和变量 for x 1:10 % 设…

electron桌面端开发-打开指定软件和文件

electron桌面端开发 现在越来越多的软件开发已经趋向于简单化,桌面端开发已经不在依赖之前的java、c等主流技术,目前基于node的开发越来越广泛。功能点也越来越多元化。 文章目录 electron桌面端开发前言一、打开文件的方式?二、exec使用步骤…

ShenNiusModularity项目源码学习(17:ShenNius.Admin.Mvc项目分析-2)

ShenNiusModularity项目的后台管理主页面如下图所示,该页面为ShenNius.Admin.Mvc项目的Views\Home\Index.cshtml,使用的是layuimini后台模板(参考文献2),在layuimini的GitHub主页中提供有不同样式的页面模版链接&#…

SpringBoot 与 Vue3 实现前后端互联全解析

在当前的互联网时代,前后端分离架构已经成为构建高效、可维护且易于扩展应用系统的主流方式。本文将详细介绍如何利用 SpringBoot 与 Vue3 构建一个前后端分离的项目,展示两者如何通过 RESTful API 实现无缝通信,让读者了解从环境搭建、代码实…

portainer.io篇

Portainer‌是一个轻量级的容器管理工具,支持Docker、Kubernetes、Docker Swarm、ACI和Nomad等多种平台。它提供了一个直观的Web界面,使用户能够轻松地管理和监控容器,包括创建、启动、停止、删除容器,以及查看容器的日志和配置信…

Dockerfile 文件常见命令及其作用

Dockerfile 文件包含一系列命令语句,用于定义 Docker 镜像的内容、配置和构建过程。以下是一些常见的命令及其作用: FROM:指定基础镜像,后续的操作都将基于该镜像进行。例如,FROM python:3.9-slim-buster 表示使用 Pyt…

Android Studio开发知识:从基础到进阶

引言 Android开发作为移动应用开发的主流方向之一,曾吸引了无数开发者投身其中。然而,随着市场饱和和技术迭代,当前的Android开发就业形势并不乐观,竞争日益激烈。尽管如此,掌握扎实的开发技能仍然是脱颖而出的关键。本…

大表查询的优化方案

‌单表优化‌: ‌字段选择‌:尽量使用TINYINT、SMALLINT、MEDIUMINT作为整数类型,而非INT;如果字段值非负,可以使用UNSIGNED。对于字符串字段,使用枚举或整数代替字符串类型,使用TIMESTAMP而非D…

常见MQ及类MQ对比:Redis Stream、Redis Pub/Sub、RocketMQ、Kafka 和 RabbitMQ

常见MQ及类MQ对比 基于Grok调研 Redis Stream、Redis Pub/Sub、RocketMQ、Kafka 和 RabbitMQ 关键点: Redis Pub/Sub 适合简单实时消息,但不持久化,消息可能丢失。Redis Stream 提供持久化,适合需要消息历史的场景,但…

DAPP实战篇:使用ethersjs连接智能合约并输入地址查询该地址余额

本系列目录 专栏:区块链入门到放弃查看目录-CSDN博客文章浏览阅读400次。为了方便查看将本专栏的所有内容列出目录,按照顺序查看即可。后续也会在此规划一下后续内容,因此如果遇到不能点击的,代表还没有更新。声明:文中所出观点大多数源于笔者多年开发经验所总结,如果你…

库magnet使用指南

Magnet 多线程控制库使用指南 目录 库功能概述环境配置核心类与接口基础使用示例代码生成工具高级功能与改进建议完整示例代码常见问题解答 https://blink.csdn.net/details/1872803?spm1001.2014.3001.5501 1. 库功能概述 Magnet 库提供以下核心功能: 多线程…

SpringCloud-快速通关(三)

SpringCloud-快速通关(一) SpringCloud-快速通关(二) SpringCloud-快速通关(三) SpringCloud-快速通关(三) 七、Seata - 分布式事务7.1、环境搭建7.1.1、简介7.1.2、环境搭建7.1.3、seata-server7.1.4、微服务配置7.1.5、测试7.2、事务模式7.2.1、AT模式7.2.2、XA模式…

STM32 TDS+温度补偿

#define POLAR_CONSTANT (513385) /* 电导池常数,可通过与标准TDS测量仪对比计算反推 */ #define TDS_COEFFICIENT (55U) /* TDS 0.55 * 电子传导率*/void TDS_Value_Conversion() {u32 ad0;u8 i;float compensationCoefficient;float compens…

数据分析实战案例:使用 Pandas 和 Matplotlib 进行居民用水

原创 IT小本本 IT小本本 2025年04月15日 18:31 北京 本文将使用 Matplotlib 及 Seaborn 进行数据可视化。探索如何清理数据、计算月度用水量并生成有价值的统计图表,以便更好地理解居民的用水情况。 数据处理与清理 读取 Excel 文件 首先,我们使用 pan…

离线环境下docker启动springboot项目

Docker linux 离线部署springboot 搭建dcoker环境 1. 首先在有网络的机器上下载Docker的离线安装包&#xff1a; - 访问 https://download.docker.com/linux/static/stable/x86_64/ - 下载对应版本的 docker-<version>.tgz 文件 2. 将下载的安装包传输到目标Linux机器上…

分布式专题-Redis Cluster集群运维与核心原理剖析

一. 哨兵集群与Redis Cluster 架构异同&#xff1a; redis单机内存不会超过10g&#xff0c;如果太大的话bgsave命令的话对单节点压力过大。 节点多了&#xff0c;之间的通信也会非常缓慢。 redis集群模式下对从节点是没有读取操作的&#xff0c;只在主节点进行读取操作。 哨…

使用 Node.js、Express 和 React 构建强大的 API

了解如何使用 Node.js、Express 和 React 创建一个强大且动态的 API。这个综合指南将引导你从设置开发环境开始&#xff0c;到集成 React 前端&#xff0c;并利用 APIPost 进行高效的 API 测试。无论你是初学者还是经验丰富的开发者&#xff0c;这篇文章都适合你。 今天&#…

智慧声防:构筑海滨浴场安全屏障的应急广播系

海滨浴场是夏季旅游的热门目的地&#xff0c;但潮汐变化、离岸流、突发天气、溺水事故等安全隐患时刻威胁着游客安全。传统的安全管理依赖人工瞭望和喊话&#xff0c;存在覆盖范围有限、响应速度慢等问题。“智慧声防”应急广播系统&#xff0c;通过智能化、网络化、多场景协同…