image

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? 分词器如何分解文本?#

  1. 选择一种分词方法。流行的方法包括字节对编码(BPE)(GPT 模型广泛使用)和 WordPiece(BERT 使用)
  2. 做出一些分词器设计选择,例如词汇量大小以及使用哪些特殊标记。更多关于这方面的内容在“比较训练的 LLM 分词器”中
  3. 分词器需要在特定的数据集上进行训练,以建立它可以用来表示该数据集的最佳词汇表

工作机制大致如下

NeatReader-1744208823295

Word Versus Subword Versus Character Versus Byte Tokens 单词与子单词与字符与字节标记#

分词这里有四种类型

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

NeatReader-1744209013322

Comparing Trained LLM Tokenizers#

这里比较了几种分词手段,就不做具体展开

Token Embeddings Token 嵌入#

A Language Model Holds Embeddings for the Vocabulary of Its Tokenizer#

在训练过程开始之前,这些向量像模型的其余权重一样被随机初始化,但训练过程会为它们分配使它们被训练来执行的有用行为的值。

NeatReader-1744209319128

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]

直到这里就可以发现流程大致上如下

NeatReader-1744209378513

Word Embeddings Beyond LLMs#

Word2vec 算法#

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

NeatReader-1744207481771

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

NeatReader-1744207687703

  • skip-gram:选择相邻的单次
  • negative Sampling:负采样

然后将所有的文本拆分成 Token,使用神经网络来训练这些 Token 的相关度

NeatReader-1744207848257

实践: Embeddings for Recommendation Systems 推荐系统的嵌入#

comments powered by Disqus