
LLM Tokenization LLM 分词#
from transformers import AutoModelForCausalLM, AutoTokenizer
# Load model and tokenizer
model = AutoModelForCausalLM.from_pretrained(
"qwen2.5-0.5B",
device_map="cuda",
torch_dtype="auto",
trust_remote_code=True,
)
tokenizer = AutoTokenizer.from_pretrained("qwen2.5-0.5B")
prompt = "Write an email apologizing to Sarah for the tragic gardening mishap. Explain how it happened.<|assistant|>"
# Tokenize the input prompt
input_ids = tokenizer(prompt, return_tensors="pt").input_ids.to("cuda")
# Generate the text
generation_output = model.generate(
input_ids=input_ids,
max_new_tokens=20
)
# Print the output
print(tokenizer.decode(generation_output[0]))这样就会获得一个输出,我们可以打印 input_ids 是什么
tensor([[ 7985, 458, 2551, 20419, 4849, 311, 20445, 369, 279, 34179,
59199, 63396, 391, 13, 81917, 1246, 432, 6932, 15757, 91,
77091, 91, 29]], device='cuda:0')利用如下脚本可以将其翻译成 human 可读的数据
for id in input_ids[0]:
print(tokenizer.decode(id))输出如下
Write
an
email
apolog
izing
to
Sarah
for
the
tragic
gardening
mish
ap
.
Explain
how
it
happened
.<
|
assistant
|
>显然分词器将单次拆解了, 有些保留了原本的的单次,但是很多并没有保留。
How Does the Tokenizer Break Down Text? 分词器如何分解文本?#
- 选择一种分词方法。流行的方法包括字节对编码(BPE)(GPT 模型广泛使用)和 WordPiece(BERT 使用)
- 做出一些分词器设计选择,例如词汇量大小以及使用哪些特殊标记。更多关于这方面的内容在“比较训练的 LLM 分词器”中
- 分词器需要在特定的数据集上进行训练,以建立它可以用来表示该数据集的最佳词汇表
工作机制大致如下

Word Versus Subword Versus Character Versus Byte Tokens 单词与子单词与字符与字节标记#
分词这里有四种类型
- Word tokens 词标记:完成的拆分单次,但是这样会有很多差不多的单词 pology、apologize、apologetic、apologist
- Subword tokens 子词标记:针对上面的 apolog 的标记,然后有后缀标记(例如,-y、-ize、-etic、-ist),这些标记与许多其他标记常见,从而产生一个更具表现力的词汇表。
- Character tokens 字符标记:拆分的更加稀碎,直接用原始字母来标记,这样对上下文长度的要求会更多
- Byte tokens 字节标记:将令牌分解为用于表示 Unicode 字符的单个字节,适合多语言的场景

Comparing Trained LLM Tokenizers#
这里比较了几种分词手段,就不做具体展开
Token Embeddings Token 嵌入#
A Language Model Holds Embeddings for the Vocabulary of Its Tokenizer#
在训练过程开始之前,这些向量像模型的其余权重一样被随机初始化,但训练过程会为它们分配使它们被训练来执行的有用行为的值。

from transformers import AutoModel, AutoTokenizer
# Load a tokenizer
tokenizer = AutoTokenizer.from_pretrained("qwen2.5-0.5B")
# Load a language model
model = AutoModel.from_pretrained("qwen2.5-0.5B")
# Tokenize the sentence
tokens = tokenizer('Hello world', return_tensors='pt')
# Process the tokens
output = model(**tokens)[0]直到这里就可以发现流程大致上如下

Word Embeddings Beyond LLMs#
Word2vec 算法#
该算法使用滑动窗口来生成训练示例。我们可以,例如,有一个窗口大小为 2,这意味着我们在中心词的每一侧考虑两个邻居。

那么这样就构成了两个概念

- skip-gram:选择相邻的单次
- negative Sampling:负采样
然后将所有的文本拆分成 Token,使用神经网络来训练这些 Token 的相关度
