LLM 为什么需要 tokenizer?

2024-04-24 21:12
文章标签 需要 llm tokenizer

本文主要是介绍LLM 为什么需要 tokenizer?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 1. LLM 预训练目的
    • 1.1 什么是语言模型
  • 2. Tokenizer一般处理流程(了解)
  • 3. 进行 Tokenizer 的原因
    • 3.1 one-hot 的问题
    • 3.2 词嵌入


1. LLM 预训练目的

我们必须知道一个预训练目的:LLM 的预训练是为了建立语言模型。

1.1 什么是语言模型

预训练的语言模型通常是建立预测模型的,即预测下一个词的概率。

通常采用了基于自监督学习的方式进行预训练,其中最常见的方法之一是使用自回归模型。自回归模型的训练目标是根据输入的文本序列预测下一个词或字符。

给定一个文本序列 X = { x 1 , x 2 , . . . , x n } X = \{x_1, x_2, ..., x_n\} X={x1,x2,...,xn},自回归模型的目标是最大化条件概率:
P ( x t + 1 ∣ x 1 , x 2 , . . . , x t ) P(x_{t+1} | x_1, x_2, ..., x_t) P(xt+1x1,x2,...,xt)

其中 x t x_t xt 是输入序列中的第 t t t 个词或字符,而 x t + 1 x_{t+1} xt+1 是下一个要预测的词或字符。

在预训练阶段,通常使用了一种称为最大似然估计的方法,即通过最大化给定文本序列的条件概率来训练模型参数。因此,自回归模型的预训练目标可以表示为最大化以下似然函数:
max ⁡ θ ∑ t = 1 n − 1 log ⁡ P ( x t + 1 ∣ x 1 , x 2 , . . . , x t ; θ ) \max_{\theta} \sum_{t=1}^{n-1} \log P(x_{t+1} | x_1, x_2, ..., x_t; \theta) θmaxt=1n1logP(xt+1x1,x2,...,xt;θ)

其中 θ \theta θ 是模型参数, log ⁡ P ( x t + 1 ∣ x 1 , x 2 , . . . , x t ; θ ) \log P(x_{t+1} | x_1, x_2, ..., x_t; \theta) logP(xt+1x1,x2,...,xt;θ) 是给定模型参数 θ \theta θ 的条件概率的对数。

理解上面的内容非常重要!!

2. Tokenizer一般处理流程(了解)

LLM 的 Tokenizer 负责将原始文本转化为模型能够理解和处理的离散符号序列。以下是LLM Tokenizer 一般流程:

  1. 数据准备
    从已清洗的预训练数据集中选取适当样本,确保其语言丰富、多样且无明显噪声。

  2. 文本规范化
    (1)将文本转换为统一的字符集(如Unicode)。
    (2)转换为小写(如果适用)。
    (3)去除无关字符,如多余空白、制表符、换行符等。
    (4)进行拼写校正(可选,取决于是否期望模型在训练时学习拼写变体)。
    (5)对特定语言进行特定的规范化处理,如德语的连字符合并、汉语的简繁体转换等。

  3. Tokenization
    (1)词汇级Tokenization(适用于某些模型):如果使用基于词汇表的Tokenization,直接按照预定义的词汇表将文本切分为单词或短语。
    (2)Subword-level Tokenization(更常见于现代LLMs):使用如 WordPiece、Byte-Pair Encoding (BPE) 或 SentencePiece 等算法将文本分割成更细粒度的子词或子词序列。这些算法通过统计学方法自动生成词汇表,其中包含常见单词和代表罕见或未知词汇的子词组合,从而解决 OOV(Out-of-Vocabulary)问题。

  4. Token ID映射
    (1)为每个生成的 token 分配一个唯一的整数ID。
    (2)根据所选 Tokenization 方法构建词汇表(或子词表),其中每个 token 对应一个ID。
    (3)将 Tokenized 文本序列转换为相应的整数序列(token IDs),作为模型输入。

  5. 特殊Token处理
    (1)添加特殊tokens,如开始符号 [CLS]、结束符号 [SEP](对于Transformer架构模型),以及可能的 padding token [PAD] 和未知词 token [UNK]
    (2)开始和结束符号用于标识输入序列的边界,有助于模型理解上下文。
    (3)未知词token用于表示词汇表中未出现但在实际应用中遇到的词汇。
    (4)Padding token用于填充序列至固定长度,以便批量训练。

  6. 序列长度调整
    (1)根据模型的输入限制,对Token ID序列进行截断或填充,以保证所有输入序列具有相同的长度。
    (2)选择合适的截断策略,如按长度截断、按比例截断或基于重要性评分的动态截断。

  7. 数据存储
    将Tokenized并映射为ID的文本数据存储为二进制文件(如 .tfrecord.bin.hdf5),便于高效读取和训练。

那么我们需要进一步深入了解为什么需要 Tokenizer!

3. 进行 Tokenizer 的原因

3.1 one-hot 的问题

首先我们根据上面内容知道 LLM 预训练的目的是为了得到语言模型,即预测下一个词的概率。那么假设有一个文本:

开始和结束符号用于标识输入序列的边界,有助于模型理解上下文

我们假设采用的 seq_length = 5,即可以建立如下预测模型: 开始和结束 -> 符始和结束符 -> 号

首先,计算机无法直接理解字符,我们需要将上面的字符转为计算机可以理解的数字,那么用什么方法呢?一种可行的方法是 one-hot,假设我们有一个字典包含 10 个字,那么 假设表示为 [1,0,0,0,0,0,0,0,0,0] 假设表示为 [0,1,0,0,0,0,0,0,0,0],直到把所有字表示出来。

这么做有没有什么问题呢?
(1)维度爆炸。当字典字数非常多时,one-hot 编码会导致特征空间的维度急剧增加。高维度数据不仅会占用大量的存储资源,而且可能导致计算复杂度增加,特别是在涉及到矩阵运算的模型(如线性回归、逻辑回归、支持向量机等)中,这可能会引发内存溢出问题,降低训练和预测的速度。
(2)稀疏性问题。one-hot 编码后的向量通常非常稀疏,即大部分元素为0。这种高度稀疏的表示方式可能不利于模型的学习,因为模型需要处理大量无信息的零值,降低了算法的效率。此外,某些算法(如基于梯度的优化方法)在处理稀疏数据时可能表现不佳。
(3)表达意义有限。目前 LLM 采用的模型一般都是 Transformer 模型,一个字是可以联系上下文,例如 使 这个字和 的关系比较紧密,可能达到 0.9,和其他字的关系可能只有 0.3。如果对于 one-hot 表示,那么无法表示上下文的这种关系。

3.2 词嵌入

那么我们如何将 one-hot 转为词嵌入矩阵呢?假设有一个 one-hot:
[ 0 0 1 0 0 0 0 1 0 1 0 0 ] \begin{bmatrix} 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 1 & 0 & 0 \\ \end{bmatrix} 000001100010
我们看下面这张图的变换:
在这里插入图片描述
我们矩阵相乘一个权重系数,最后得到的结果就是词嵌入矩阵,这里的权重系数在 pytorch 中就是常见的:

embedding = torch.nn.Embedding(num_idx, out_dim)
embedding.weight

那么我们在训练中就可以反向传播不断对这个权重系数进行优化!词嵌入至少具备以下几个优点:
(1)更低的维度
词嵌入通常将每个词映射到一个低维实数向量(如100维、300维甚至更高),远低于 one-hot 编码所需的维度(等于词汇表大小)。较低的维度不仅节省了存储空间,减少了计算资源消耗,还减轻了因维度增加导致的“维度灾难”,有利于模型的训练和泛化。

(2) 捕捉词义与语义关系
词嵌入在训练过程中(如通过 Word2Vec、GloVe 或 BERT 等模型)学习到的向量不仅编码了词的个体特征,还能捕捉到词与词之间的语义关系。相似或相关的词在向量空间中的距离会很近,如“猫”和“狗”的嵌入向量可能比它们与“桌子”的嵌入向量更接近。这种关系性的表示使得模型能够理解词汇间的语义相似性、类比关系、上下位关系等,这对于自然语言处理任务至关重要。

(3)解决稀疏性问题
与 one-hot 编码产生的极度稀疏向量不同,词嵌入向量通常是稠密的实数值向量。这种稠密表示保留了词汇的有用信息,避免了处理大量零值带来的效率损失,有利于模型学习和优化。同时,稠密向量在进行距离计算、相似度度量、聚类分析等操作时更为高效且更具解释性。

(4)平滑的连续空间
词嵌入向量位于一个连续的向量空间中,这使得模型可以对词汇的含义进行平滑插值和运算。例如,可以通过简单的算术操作(如加减法)来探索词汇间的语义关系(如“国王 - 男人 + 女人 = 女王”),这是 one-hot 编码无法做到的。连续空间也为迁移学习、词义消歧、词汇扩展等任务提供了便利。

(5)适用于深度学习模型
词嵌入是深度学习模型(如神经网络、循环神经网络、Transformer 等)处理自然语言文本的首选表示方式。它们可以直接作为输入层的输入,或者进一步通过嵌入层进行微调。词嵌入的低维、连续且富含语义信息的特性非常适合深度学习模型的层次化、非线性学习机制,能够有效提取和利用词汇的深层次语义特征。

这篇关于LLM 为什么需要 tokenizer?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/932855

相关文章

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

业务中14个需要进行A/B测试的时刻[信息图]

在本指南中,我们将全面了解有关 A/B测试 的所有内容。 我们将介绍不同类型的A/B测试,如何有效地规划和启动测试,如何评估测试是否成功,您应该关注哪些指标,多年来我们发现的常见错误等等。 什么是A/B测试? A/B测试(有时称为“分割测试”)是一种实验类型,其中您创建两种或多种内容变体——如登录页面、电子邮件或广告——并将它们显示给不同的受众群体,以查看哪一种效果最好。 本质上,A/B测

[论文笔记]LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scale

引言 今天带来第一篇量化论文LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scale笔记。 为了简单,下文中以翻译的口吻记录,比如替换"作者"为"我们"。 大语言模型已被广泛采用,但推理时需要大量的GPU内存。我们开发了一种Int8矩阵乘法的过程,用于Transformer中的前馈和注意力投影层,这可以将推理所需

LLM系列 | 38:解读阿里开源语音多模态模型Qwen2-Audio

引言 模型概述 模型架构 训练方法 性能评估 实战演示 总结 引言 金山挂月窥禅径,沙鸟听经恋法门。 小伙伴们好,我是微信公众号《小窗幽记机器学习》的小编:卖铁观音的小男孩,今天这篇小作文主要是介绍阿里巴巴的语音多模态大模型Qwen2-Audio。近日,阿里巴巴Qwen团队发布了最新的大规模音频-语言模型Qwen2-Audio及其技术报告。该模型在音频理解和多模态交互

Vue2电商项目(二) Home模块的开发;(还需要补充js节流和防抖的回顾链接)

文章目录 一、Home模块拆分1. 三级联动组件TypeNav2. 其余组件 二、发送请求的准备工作1. axios的二次封装2. 统一管理接口API----跨域3. nprogress进度条 三、 vuex模块开发四、TypeNav三级联动组件开发1. 动态展示三级联动数据2. 三级联动 动态背景(1)、方式一:CSS样式(2)、方式二:JS 3. 控制二三级数据隐藏与显示--绑定styl

使用WebP解决网站加载速度问题,这些细节你需要了解

说到网页的图片格式,大家最常想到的可能是JPEG、PNG,毕竟这些老牌格式陪伴我们这么多年。然而,近几年,有一个格式悄悄崭露头角,那就是WebP。很多人可能听说过,但到底它好在哪?你的网站或者项目是不是也应该用WebP呢?别着急,今天咱们就来好好聊聊WebP这个图片格式的前世今生,以及它值不值得你花时间去用。 为什么会有WebP? 你有没有遇到过这样的情况?网页加载特别慢,尤其是那

插件maven-search:Maven导入依赖时,使用插件maven-search拷贝需要的依赖的GAV

然后粘贴: <dependency>    <groupId>mysql</groupId>    <artifactId>mysql-connector-java</artifactId>    <version>8.0.26</version> </dependency>

js基础需要注意的点

1 js中单引号和双引号都能创建字符串,但是html的元素属性规定必须用双引号,所以js优先用单引号定义字符串。

作为刚从事Java开发的小白,需要掌握哪些技能

作为一个刚踏入Java开发世界的小白,面对各种技术和工具,你可能会觉得有点不知所措。但是别担心,我会给你一个简单清晰的路线图,让你可以有条不紊地掌握基本技能,逐步成长为一名Java开发者。 1. 扎实的Java基础 Java的基础是你迈向高级开发的重要基石,建议从以下几个方面着手: 语法和基础概念:比如变量、条件语句、循环、方法、数组、面向对象编程(OOP)等等。这些基础如同建房子的地基,越

xml数据作为表单参数在网络传递也需要用urlencode处理

xml数据作为表单参数在网络传递也需要用urlencode处理。才能确保数据被正确的传递和解析。需要加深对数据在web上传递的理解。