分词器(Tokenizer) | 有了分词器,为什么还需要嵌入模型

什么是tokenizer

Tokenizers
huggingface官方文档:https://huggingface.co/docs/tokenizers/main/en/index

tokenizer 是NLP 管道的核心组件之一。它们有一个非常明确的目的:将文本转换为模型可以处理的数据。模型只能处理数字,因此tokenizer 需要将我们的文本输入转换为数字。

你应该知道大模型的输入输出的单位是token,Token是使用Tokenizer(翻译为分词器)分词后的结果。Tokenizer是将文本分割成token的工具。

简单来说,Tokenizer 就是将连续的文本拆分成模型能处理的基本单位——Token 的工具,而 “token” 是模型理解和生成文本的最小单位。对于计算机来说,处理原始文本是非常困难的,因此我们需要一个中间层,把文字转换为一系列的数字序列(即,一个个离散的 token),这些 token 既可以是单个字符、词语,也可以是子词(subword)。而这个转换过程正是由 Tokenizer 完成的。

在传统的自然语言处理中,我们可能直接按照单词或字符来分割文本;而在大模型中,常见的方法则是采用子词级别(subword-level)的分割方式。这种方式既能保证足够细致(能够捕捉到拼写变化、罕见词等信息),又不会使得词表过大,进而影响模型的效率和泛化能力。

在中文中,token 通常是单个汉字(或者在某些情况下是常见词汇)

在英文中,token 通常是一个词或单词的一部分,平均而言大约 4 个字符或 0.75 个单词,但具体拆分方式依赖于采用的 tokenizer 算法

有了分词器,为什么还需要嵌入模型

尽管 Tokenizer 能够将文本转换为数值索引,但这些索引本身并不包含语义信息。嵌入模型的作用是为这些索引赋予语义,使得模型能够更好地理解和处理文本。

虽然Tokenizer 将文本转换为数值形式,但这些ID还不能直接用于训练大型语言模型(LLM)。在分词和ID化之后,通常还需要通过**嵌入模型(Embedding Model)**将ID映射为稠密的向量表示,这一步是训练LLM的关键部分。

Tokenizer 和嵌入模型是 NLP 流程中的两个关键组件,它们的关系如下:

  1. Tokenizer:将原始文本分割为单元,并映射为数值索引。
  2. 嵌入模型:将数值索引转换为语义丰富的向量表示。
  3. 下游任务:使用嵌入向量作为输入,完成分类、翻译、问答等任务。

典型流程:

  1. 输入文本:“I love NLP”。
  2. Tokenizer:[“I”, “love”, “NLP”] → [1, 2, 3]。
  3. 嵌入模型:[1, 2, 3] → [[0.1, 0.2, …], [0.3, 0.4, …], [0.5, 0.6, …]]。
  4. 下游任务:使用嵌入向量完成分类、翻译等任务。

嵌入模型的主要任务是将 Tokenizer 生成的数值索引转换为稠密的向量表示,这些向量能够捕捉单词、子词或句子的语义信息。

Tokenizer 和嵌入模型是 NLP 流程中的两个互补组件,它们共同作用,将原始文本转换为计算机可以理解和处理的格式。

总结:分词器-》embedding-》llm
tokenizer库其实就是接收原始数据集中的语料,然后按照一定的规则分开。分词的目的只有一个,那就是为后来的embeding做准备。

分词器为什么在transformers 里

在 transformers 库中,分词器(Tokenizer)是一个核心组件,因为它是将原始文本转换为模型可处理格式的关键步骤。transformers 库由 Hugging Face 开发,旨在为自然语言处理(NLP)任务提供统一的接口,支持多种预训练模型(如 BERT、GPT、T5 等)。

(1)文本预处理标准化
不同的预训练模型使用不同的分词方法(如 BERT 使用 WordPiece,GPT 使用 Byte Pair Encoding,T5 使用 SentencePiece 等)。

transformers 库通过分词器将这些不同的分词方法统一到一个接口中,用户无需关心底层实现细节。

(2)与预训练模型对齐
预训练模型在训练时使用了特定的分词器和词汇表。为了确保模型在推理或微调时表现一致,必须使用相同的分词器。

transformers 库中的分词器与预训练模型一一对应,确保输入格式与模型训练时一致。

(3)支持多种语言和任务
transformers 库支持多种语言和任务(如文本分类、机器翻译、问答等),分词器能够根据任务和语言自动调整分词策略。

(4)高效处理
分词器在 transformers 中经过高度优化,能够快速处理大规模文本数据。

以下是一个使用 transformers 分词器的示例:

from transformers import AutoTokenizer

# 加载预训练模型的分词器
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")

# 输入文本
text = "I love NLP!"

# 使用分词器处理文本
tokens = tokenizer.tokenize(text)  # 分词
input_ids = tokenizer.convert_tokens_to_ids(tokens)  # 转换为ID
encoded_input = tokenizer(text)  # 直接编码为模型输入格式

print("Text:", text)
print("Tokens:", tokens)
print("Input IDs:", input_ids)
print("Encoded Input:", encoded_input)

输出

Text: I love NLP!
Tokens: ['i', 'love', 'nlp', '!']
Input IDs: [1045, 2293, 17953, 999]
Encoded Input: {
    'input_ids': [101, 1045, 2293, 17953, 999, 102],  # 添加了[CLS]和[SEP]
    'token_type_ids': [0, 0, 0, 0, 0, 0],  # 用于区分句子(如BERT)
    'attention_mask': [1, 1, 1, 1, 1, 1]   # 用于标识有效token
}

在 transformers 中,每个预训练模型都有对应的分词器。例如:

  • BERT:使用 WordPiece 分词器。
  • GPT:使用 Byte Pair Encoding (BPE) 分词器。
  • T5:使用 SentencePiece 分词器。

通过 AutoTokenizer,用户可以根据模型名称自动加载对应的分词器,无需手动选择。

Hugging Face的Tokenizer

Hugging Face官方分词器:https://huggingface.co/docs/tokenizers/main/en/index
github:https://github.com/huggingface/tokenizers

Tokenizers 提供了当今最常用的分词器实现,专注于性能和多功能性。这些分词器不仅在研究中使用,还适用于生产环境,具有极快的训练和分词速度,能够在服务器CPU上在20秒内处理1GB的文本。

🤗 Tokenizers provides an implementation of today’s most used tokenizers, with a focus on performance and versatility. These tokenizers are also used in 🤗 Transformers.

在这里插入图片描述

huggingface的transform库包含三个核心的类:configuration,models 和tokenizer 。

from transformers import BertTokenizer

# 加载预训练的BERT分词器
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')

# 输入文本
text = "I love NLP."

# 分词并转换为ID
tokens = tokenizer.tokenize(text)
input_ids = tokenizer.convert_tokens_to_ids(tokens)

print("Tokens:", tokens)
print("Input IDs:", input_ids)

输出

Tokens: ['i', 'love', 'nlp', '.']
Input IDs: [1045, 2293, 17953, 1012]

大模型不同tokenizer训练效果对比

原文链接:https://zhuanlan.zhihu.com/p/717829515

训练大语言模型之前除了数据收集,还有一个重要的事情是tokenizer的选择,是选择开源的?还是自己根据自己的数据训练一个比较好?

分词器库选择

在这里插入图片描述

当前顶尖大模型所采用的 Tokenizer 方法与词典大小

原文链接:https://fisherdaddy.com/posts/introduce-llm-tokenizer/

在这里插入图片描述

在这里插入图片描述

闭源模型的具体分词细节往往属于商业机密,传闻deepseek的分词器也没有开源,有懂的小伙伴可以评论区留言- -~。

参考

分词器(Tokenizer)详解
参考URL: https://zhuanlan.zhihu.com/p/770595538
Huggingface详细教程之Tokenizer库
参考URL: https://zhuanlan.zhihu.com/p/591335566

### 创建自定义分词器以适配 BERT 模型 为了使 BERT 模型能够处理特定领域或数据集中的文本,创建一个自定义分词器是非常重要的。这可以通过使用 `Hugging Face` 的工具包并结合 `SentencePiece` 来完成。 #### 使用 SentencePiece 训练自定义分词器 首先,安装必要的库: ```bash pip install sentencepiece transformers ``` 接着,准备用于训练分词器的数据文件,并编写 Python 脚本来执行此操作: ```python import sentencepiece as spm from tokenizers import Tokenizer, models, pre_tokenizers, decoders, processors, trainers # 准备训练语料库路径 corpus_file = "path/to/corpus.txt" # 配置参数 model_prefix = 'custom_bert' vocab_size = 32000 character_coverage = 0.9995 # 对于中文、日文等字符覆盖度设置较高值 spm.SentencePieceTrainer.Train(f'--input={corpus_file} --model_prefix={model_prefix} \ --character_coverage={character_coverage}') ``` 上述脚本会基于给定的语料库生成两个文件:一个是 `.model` 文件,另一个是 `.vocab` 文件[^2]。 #### 将自定义分词器集成到 BERT 中 一旦有了训练好的分词器模型和词汇表,就可以利用这些资源构建一个新的 tokenizer 类实例并与 BERT 结合起来工作。下面是如何做到这一点的一个例子: ```python from transformers import BertTokenizerFast tokenizer = BertTokenizerFast( vocab_file='custom_bert.vocab', tokenizer_file=None, do_lower_case=False, unk_token="[UNK]", pad_token="[PAD]", cls_token="[CLS]", sep_token="[SEP]", mask_token="[MASK]" ) special_tokens = ["[UNK]", "[PAD]", "[CLS]", "[SEP]", "[MASK]"] trainer = trainers.WordPieceTrainer(vocab_size=25000, special_tokens=special_tokens) tokenizer.train(trainer) print(tokenizer.encode("这是一个测试")) ``` 这里需要注意的是,在初始化 `BertTokenizerFast` 实例时传入了之前由 `SentencePiece` 产生的词汇表文件名 (`custom_bert.vocab`) 和其他一些特殊的标记符作为参数。这样做之后,就成功地将自定义分词逻辑嵌入到了 BERT 所使用的分词过程中[^3]。 此外,还可以根据实际需求调整 BERT 的词汇配置来更好地支持下游任务的要求[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西京刀客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值