【Transformer】Tokenization

文章目录

    • 直观理解
    • 分词方式
      • 词粒度-Word
      • 字粒度-Character
      • 子词粒度-Subword(目前最常使用)
    • 词表大小的影响
    • 参考资料

直观理解

在理解Transformer或者大模型对输入进行tokenize之前,需要理解什么是token?

理工科的兄弟姐妹们应该都知道,计算机内部的所有数据,最终都是以二进制形式(0和1)表示。文本数据也不例外,需要被转换成计算机能够理解和处理的形式。但是,如果直接处理原始文本字符串会非常低效,因为每个字符都需要占用一定的存储空间。

那么聪明的科学家就想可以通过将文本压缩成更紧凑的表示形式(tokens)来减少存储和传输的开销,这就是Tokenization的过程。将文本处理成的紧凑表示形式,就是Token,也就是一系列离散的字符(单词,单词的一部分,或者是字母),这些符号可以进一步被编码成二进制形式。

举个例子:

假设我们可以把We love AI表示为WeloveAI这三个token,并分别表示为13, 456,7,以便于获取每个token的embedding表示。

  • 其中,将We love AI表示为WeloveAI这三个token的过程,就是tokenization过程,主要是对输入序列进行分词,获取tokens
  • 将不同的token表示为不同的整数序列,也就是每个token都有一个单独的token ID,这个过程叫做编码(encoding),比如我们可以用7来表示AI
  • 一般后面还会加上一层embedding层,将每个token ID用更高维度的embedding来进行表示

Tokenization的难点[1]:

经过上述分析,我们可以大概猜到tokenization的一些难点:

1. 切分的粒度:比如 北京大学 是作为一个词,还是“北京” + “大学”,还是“北” +“京” +“大” +“学”?

2. 切分导致的歧义:武汉市/长江/大桥 还是 武汉/市长/江大桥

3. 数字怎么处理:日期数字 03/09/2024,电话号码 17866666666等

4. 不同语言的特性:拉丁语系可以用空格来区分,但是中文没有空格

分词方式

常见的分词方式主要有三种:

  • 词粒度-Word
  • 字粒度-Character
  • 子词粒度-Subword

词粒度-Word

顾名思义,对于拉丁语系来说,每个单词,就是一个token,按照空格或者标点来分割即可。

但是对于中文来说,则需要专门进行分词,比如中文分词一般都用 jieba(结巴分词),哈工大的 LTP等。中文的分词可以抽象为一个序列标注问题,所以这些分词方法会使用词典索引,或者 HMM,双向 GRU 等模型来进行分词。

优点:

  • 符合人类的直觉,词的含义完备
  • 对于英文来说实现很简单

缺点:

  • 如何构造一份好的词典,包括内容和长度等因素都需要考虑。
  • OOV (Out of Vocabulary)问题,对于词典中没有词一般会分配一个统一来处理,信息丢失。
  • 同义词和误拼会被认为是不同的词。比如 do notdon't 虽然含义一样,但是最终的 id 不一样。类似的还有词的不同形态,比如 have, has, had, having 等。
  • 词典中的词没有任何关联,低频词不会得到充分的训练。

字粒度-Character

顾名思义,对于拉丁语系来说,每个字母或者标点符号,就是一个token。对于中文来说,每个汉字,就是一个token。

优点:

  • 实现简单,且词典较小。
  • 几乎没有 OOV (Out of Vocabulary)问题。

缺点:

  • 对于拉丁语系来说,单个字母是没有语义的。对于中文来说,一个字是有一定的含义,但是也很难学习到文本真正的语义信息。
  • 同时会让输入变得很长,极大影响训练和推理的效率。

子词粒度-Subword(目前最常使用)

基于Subword的分词方法,旨在实现基于Word和基于Character的方法的优点,同时最大限度地减少它们的缺点。基于Subword的方法采取中间立场,通过在单词中分割文本来尝试创建具有语义意义的标记,即使它们不是完整的单词。例如,标记 inged 具有语法意义,尽管它们本身不是单词。

Subword方法产生的词汇量小于基于Character方法中的词汇量,但大于基于Word方法中的词汇量。每个token内存储的信息量也是如此,介于前两种方法生成的token之间。

Subword方法使用以下两个准则:

  • 频繁使用的word不应拆分为Subword,而应作为一整个token标记

  • 不常用的word应该分成Subword,比如interdisciplinary,可以被分为interdisciplineary,那么就可以大概猜到其含义为 跨学科的

从上面这个例子可以看出,理想的Subword分词方法应该是把不常见的单词,按照词形变化、复数形式等拆分为不同的token,同时保留token之间的关系,这样就可以最大可能保留句法和语义相似性。因此,Subword方法在当今的大模型领域中非常常用的分词方法。比如,常见大模型使用的Subword方法如下:

  • GPT:Byte-level BPE
  • LLaMA: sentencepiece BPE
  • DeepSeek: Byte-level BPE
  • Qwen: Byte-level BPE
  • Yi: sentencepiece BPE

具体的Subword方法的讲解大家可以参考这篇博客:Tokenization — A Complete Guide

词表大小的影响

词表(vocabulary),通俗来说,是指我们提供给模型可以进行分词的字典,也就是模型能够理解和使用的词汇集合。具体来说,vocabulary通常包含成千上万个单词或词组,这些词汇是通过对大量文本数据的学习得到的。模型在学习过程中,会根据这些词汇出现的频率和上下文关系,来理解每个词汇的含义和用法。这样,当模型在处理新的文本或任务时,就能够利用它学到的vocabulary来生成合适的回答或文本。

不同大模型,使用的vocabulary的大小不一样,那么vocabulary的大小会有什么影响呢?

回答这个问题之前,我们首先理解两个概念:token压缩率和内存对齐:

  • token压缩率:模型将原始文本转换为token的过程中,token的数量相对于原始文本字符数量的比例,比如100个文本经过tokenization之后,压缩成了20个token,那么这个tokenizer的压缩率就是20%。这个比例反映了模型在处理文本时对信息的压缩程度。
  • 内存对齐:内存对齐是指将数据存储在内存中时,按照一定的规则来安排数据的位置,使得每个数据项的起始地址都是某个特定数值(通常是数据项大小的倍数)。例如,一个4字节大小的整数,它的起始地址最好是4的倍数。因为计算机硬件在读取内存时,通常会以固定大小的块(比如32位或64位)为单位来操作。如果数据没有对齐,即它的起始地址不是块大小的倍数,那么在读取这个数据时,可能需要额外的一次内存访问来拼凑出完整的数据,这样就会降低效率。

现在,我们来回答上述问题:[2]

  1. 数据量够大的情况下,vocabulary 越大,压缩率越高(即 token数/文本长度 越小),模型效果越好
  • 计算效率的提升:相同的文本,转换为token后越短越好。更高的压缩率代表了相同数量的token能够表达更多的信息,相同的信息 token 越短则训练效率更高
  • 有助于更好理解文本:更多的词汇能够减少 OOV (Out of Vocabulary)的影响, 训练的信息不会丢失,推理的时候泛化能力也更强。同时更多的词汇可以减少词汇分解后的歧义,从而更好地理解和生成文本
  • 更长的上下文:预训练阶段往往都有最大序列长度的限制,压缩率更高代表着能接收更长序列的token,也就可以看到更多的上下文。
  1. 太大的 vocabulary 需要做一些训练和推理的优化,所以要平衡计算和效果
  • 虽然 vocabulary 越大越好,但是也不能无限扩大。因为 vocabulary 变大后,Embedding 层变大,最后输出的 Head layer 也会变大。比如 Llama3 将 vocabulary 从 Llama2 的 32000 扩展到 128256,参数量就变大了,Llama2 还不到7B,但是 Llama3 有 8B了(当然这里面还有其他参数的改动)。参数更大,更占内存,而且输出的时候 softmax 也更大,计算就更慢。
  • 虽然大多数情况下 token 量的减少,整体上是算得更快的。所以也不能设置得过大,目前业界普遍设置在 10万 到 20万左右。比如 Qwen 的 词表大小为 152064,baichuan2为125696,llama3 为128256,deepseek 为 102400。多模态的会更大一些。
  1. 要考虑内存对齐
  • vocabulary 的大小一般要设置成 8 的倍数,在 A100 上则是 64 的倍数。(不同的GPU可能不一样)
  • 比如 qwen 的 readme 和 训练代码中 vocabulary 的数量不一样, readme 中为 151643,但是实际上代码里写的是 152064。这就是为了内存对齐。所以很多时候模型上的一些设置其实跟硬件息息相关。
  • 最终 Embedding 层和 Head Layer 最终都会转换成矩阵放到 GPU 的 Tensor Core 中计算。而根据英伟达的开发手册,矩阵运算最好根据 GPU 和计算类型满足如下的条件:
    图片来源:[2]

图片来源:[2]

参考资料

  • [1] https://note.mowen.cn/note/detail?noteUuid=waAeRtCgZXLO62f9RhUWa
  • [2] https://note.mowen.cn/note/detail?noteUuid=-PBW4yH2X9bLLRNL26VKp

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

无人机+应用综合实训室解决方案

随着无人机技术的飞速发展,其在航拍、农业、环境监测、物流运输等多个领域展现出巨大的应用潜力。为了满足职业院校及企业对无人机应用技术型人才的培养需求,唯众紧跟市场趋势,推出了全面且详尽的《无人机应用综合实训室解决方案》。本方案旨…

TeamTalk路由服务器

路由相关信令和协议设计 enum BuddyListCmdID {// ...... 暂时省略无关信令CID_BUDDY_LIST_USERS_STATUS_REQUEST 522,CID_BUDDY_LIST_USERS_STATUS_RESPONSE 523,// ...... 暂时省略无关信令 };message IMUsersStatReq{//cmd id: 0x020arequired uint32 user_id 1;repeat…

python 正则表达式“.*”和“.*? ”的区别

“.*”和“.*? ”的区别 点号表示任意非换行符的字符,星号表示匹配它前面的字符0次或者任意多次。所以“.*”表示匹配一串任意长度的字符串任意次。这个时候必须在“.*”的前后加其他的符号来限定范围,否则得到的结果就是原来的整个字符串。 “.*? &…

“软件即仪器”——全新架构 Xtreme Vision显微测量软件平台

“软件即仪器”,工业测量软件较为复杂,涵盖了软件架构、信号处理、图像处理、数值计算、空间几何、三维建模、3D渲染、并行计算、人机交互等多种交叉软学科,是测量仪器系统极为重要的组成部分,中图仪器一直致力于自主化工业测量软…

使用AI写WebSocket知识是一种怎么样的体验?

一、WebSocket基础知识 1. WebSocket概念 1.1 为什么会出现WebSocket 一般的Http请求我们只有主动去请求接口,才能获取到服务器的数据。例如前后端分离的开发场景,自嘲为切图仔的前端大佬找你要一个配置信息的接口,我们后端开发三下两下开…

使用 Spring Cloud 有什么优势?

使用 Spring Cloud 有什么优势? 1. 简化复杂性2. 服务发现与注册3. 负载均衡4. 冗余与容错5. 性能与部署6. 生态系统与社区 💖The Begin💖点点关注,收藏不迷路💖 在微服务架构的浪潮中,Spring Cloud凭借其简…

传统CV算法——基于Opencv的多目标追踪算法

基于 OpenCV 的跟踪算法有多种,每种算法都有其特定的应用场景和优缺点。以下是一些常见的基于 OpenCV 的目标跟踪算法: 1. BOOSTING 跟踪器 描述:基于 AdaBoost 算法的跟踪器。它是一种早期的跟踪算法,使用的是基于弱分类器的强…

【数据结构篇】~链表算法题2

链表算法题2 1.返回倒数第k个节点思路解析 2.链表的回文结构​思路解析1(空间复杂度不符合)解析2 3.相交链表​思路解析 1.返回倒数第k个节点 OJ链接 思路 有点像高中学的相对位移 利用快慢指针,开始时都指向头节点,然后让快指…

VMware虚拟机安装的Ubuntu,桥接方式静态ip,内网可以访问,ping外网不可用

1.环境说明 系统:Ubuntu 24.04 环境:VMware下桥接静态IP设置 2.问题:ping www.baidu.com报错 [~] ping www.baidu.com ping: www.baidu.com: Temporary failure in name resolutio…

php邮箱服务器怎么搭建?如何构建服务器?

php邮箱服务器配置教程指南?php邮件服务器如何搭建? 搭建一个稳定高效的php邮箱服务器,不仅可以提升邮件传输的效率,还能增强数据的安全性。那么,如何着手搭建这样一个服务器呢?AokSend将详细探讨php邮箱服…

【Go - 每日一小问 ,const 变量存储在哪里,堆还是栈上?】

答:都不是 , 在bss(未初始化数据区) 和 data(初始化数据区)上。 在内存布局上遵循一定规律,Go 进程的内存空间布局由高地址到低地址大致可分为以下几段: 栈(stack): 用户态的栈,栈的大小是固定的,其大小可以使用ulimi…

云服务器中查看Nginx报错日志及解决思路

目录 前言 一、查看nginx日志信息 二、我的解决思路 前言 线上报错不可怕,能找到对应日志,那这个报错就解决一大半了。 默认情况下,nginx日志文件存储在 /var/log/nginx/ 目录中,cd /var/log/nginx/ 一、查看nginx日志信息 …

【hot100篇-python刷题记录】【跳跃游戏 II】

R7-贪心算法 目录 方法1: 方法2: 很贪心啊,局部最优解就是全局最优解,要求到达nums[n-1]的最小步数,我们每一步都走最远。 方法1: class Solution:def jump(self, nums: List[int]) -> int:nlen(n…

畅游5G高速网络:联发科集成Wi-Fi6E与蓝牙5.2的系统级单芯片MT7922

这周末,除非外面下钞票,否则谁也拦不住我玩《黑神话悟空》(附:两款可以玩转悟空的显卡推荐) IPBrain平台君 集成电路大数据平台 2024年09月03日 17:28 北京 联发科一直以创新技术追赶市场需求…… “不努力向前游就会被海浪拍回岸边…” 芯片设计公司产品层出不穷,想要站…

vue3+ts 实现模板表格文件下载~

1、效果图&#xff1a; 2、创建点击事件&#xff0c;并发起请求&#xff0c;获取模板表格文件下载url地址。 //组件 <a-button class"btn btn_width" click"download"> 下载模板 </a-button>// 文件模板下载 import { getTemplate } from /ap…

Linux【1】基础

目录 cd ​编辑 Linux的粘贴是Ctrlshiftv&#xff0c;复制、剪切&#xff1a; pwd打印当前路径 cat 文件目录 读取 ↑ 可以调取之间输过的命令 mv A B 把文件名A改成B #掐头%去尾 touch 文件名 mkdir创建目录​编辑 删除rm 只能删除文件 终端命令格式 帮助 man命…

RK3588 13.0去掉SystemUI快速设置选项

Android13.0的SystemUI下拉菜单有很多快速设置选项&#xff0c;有些选项对我们设备来说是多余的&#xff0c;用户要求去掉无用的选项&#xff0c;只保留Internet Bluetooth Screen record 去掉之前&#xff1a; 去掉之后&#xff1a; 为了去掉这些快速设置选项&#xff0c;试…

大零售时代:开源 AI 智能名片、2+1 链动与 O2O 商城小程序引领融合新趋势

摘要&#xff1a;本文深入探讨了当今零售业态的发展趋势&#xff0c;指出在数据匹配的时代&#xff0c;人依然在零售中发挥着重要作用。通过对大零售理念的阐述&#xff0c;分析了跨行业跨业态融合的必然性&#xff0c;强调了业态融合的指导思想以及实现方式。同时&#xff0c;…

List 的介绍

目录 1. 什么是List 2. 常见接口介绍 3. List的使用 1. 什么是List 在集合框架中&#xff0c; List 是一个接口&#xff0c;继承自 Collection 。 Collection 也是一个接口 &#xff0c;该接口中规范了后序容器中常用的一些方法&#xff0c;具体如下所示&#xff1a; Iterab…

【电源时序测量】

安捷伦示波器电源时序测量 电源时序测量可以表征电源的启动、关闭、负载瞬态响应和纹波等关键参数。 1. 时序测量工具 安捷伦示波器配备了各种时序测量工具&#xff0c;包括&#xff1a; 测量光标&#xff1a;用于手动测量时间间隔和幅度。 自动测量&#xff1a;自动测量特定…