万有斥力 发表于 2025-3-30 05:30:20

LLM架构(1): Tokenizer

目录
概述
Tokenizer是什么?
Llama tokenizer的例子
使用Python剖析LLaMA Tokenizer文件
示例代码
输出结果
与tokenizer.model文件的直接检察对比
差异原因:Byte Pair Encoding (BPE)
概述

本文将连续更新大语言模子(LLM)的架构剖析。现在,大多数讨论将基于LLaMA架构展开,后续筹划探索怎样使用FPGA(现场可编程门阵列)实现LLaMA架构。以下是LLaMA架构的完整流程概览:
LLaMA架构流程图
(图片来源)
https://i-blog.csdnimg.cn/direct/d481dabbb68440c5af5624fd6cee5f4c.png
LLaMA架构的处理流程从Tokenizer(分词器)开始。Tokenizer作为整个架构的起点,负责将原始输入文本转换为模子可处理的数字ID序列。这一过程奠定了后续计算的底子。
Tokenizer是什么?

Tokenizer(分词器)是将用户输入(user input)转换为一组ID的过程。简单来说,它的作用是把自然语言(好比文字)映射成模子可以理解的数字标识。以LLaMA 3.2模子为例,它的词汇表(vocab)包含128,000个底子词汇,这些词汇是预训练好的,用于表示各种大概的输入内容。Tokenizer会根据这个词汇表,将输入的词语、字符或短语转换为对应的ID。
为什么要把输入转换成ID token 

在大语言模子(LLM)中,将输入文本转换成ID token是一个关键步骤,其原因紧张有以下几点:

[*]模子只能处理数字
计算机和神经网络无法直接理解自然语言(如中文、英文等文本)。它们依赖数值计算,因此需要将文本转换为数字情势。Tokenizer通过预定义的词汇表(vocab),将每个词、字符或子词单位映射为一个唯一的ID,方便模子处理。
[*]统一表示输入
自然语言包含大量变体(如巨细写、拼写差异、标点等)。通过Tokenizer将文本分解并映射为ID token,可以标准化输入,减少歧义。例如,“Hello”和“hello”大概被映射到同一个ID,从而简化处理。
Llama tokenizer的例子

以LLaMA 3.2的tokenizer.model文件为例(可在Hugging Face下载,因需要Meta认证,这里不直接提供),该文件包含了128,000个ID与词汇的对应关系。用VS Code打开这个文件,可以检察详细的词汇表内容。这128,000个ID构成了LLaMA的底子词汇库。
https://i-blog.csdnimg.cn/direct/9e1e88444196494b94314aca8e50e532.png
但风趣的是,在LLaMA的配置文件(config file)中,定义的模子架构显示词汇表巨细(vocab size)实际上是128,256,而不是128,000。这是因为除了底子的128,000个词汇外,还有额外的256个ID被用作特殊标记(special tokens)。这些特殊标记大概包括表示句子开头(<BOS>)、末了(<EOS>)等的符号。打开tokenizer.json文件,可以进一步检察这些特殊标记的定义和详细内容。
https://i-blog.csdnimg.cn/direct/f5b52aedfa7d47dd904437b33af570d8.png
https://i-blog.csdnimg.cn/direct/405fa5e7c088462f838f3db8abc0312d.png
使用Python剖析LLaMA Tokenizer文件

我们可以通过Python代码剖析LLaMA的tokenizer.model文件,以检察特定ID对应的token内容。例如,下面展示怎样使用Python提取ID 9900到9909对应的token,并分析其结果与直接检察tokenizer.model文件时的差异。
示例代码

以下代码基于tiktoken库,加载LLaMA 3.2(1B参数版本)的tokenizer.model文件并举行剖析:
import tiktoken

# BPE loading function
from tiktoken.load import load_tiktoken_bpe
# Loading the tokenizer from llama-3.2-1B
tokenizer_model = load_tiktoken_bpe("/kaggle/input/llama-3.2/pytorch/1b-instruct/1/tokenizer.model")

# Get the length of the tokenizer model
len(tokenizer_model)
# OUTPUT: 128000

# Get the type of the `tokenizer_model` object.
type(tokenizer_model)
# OUTPUT: dictionary

# Printing the first 10 items of tokenizer model
dict(list(tokenizer_model.items())) 输出结果

运行以上代码后,得到的输出是一个字典,键是ID(9900到9909),值是对应的token。例如:
Python输出:展示了ID 9900到9909对应的字节序列,如b'SGVsbG8'。
   {b'Conn': 9900,
b' thank': 9901,
b'xd': 9902,
b' hook': 9903,
b' documentation': 9904,
b'Parameters': 9905,
b'Hello': 9906,
b'vt': 9907,
b' articles': 9908,
b' west': 9909}
与tokenizer.model文件的直接检察对比

如果你直接打开tokenizer.model文件(好比用VS Code),会发现ID对应的词汇表内容与Python剖析结果有所不同。例如:


[*]在tokenizer.model中,ID 9906大概显示为原始的字节序列(byte sequence)。
[*]而在Python剖析中,ID 9906对应的值是b'SGVsbG8'。
tokenizer.model原始词汇表图:展示了文件中的原始表示,大概更靠近未解码的字节或符号情势。
https://i-blog.csdnimg.cn/direct/0fb59eb2052e4e29a58349720ca75eb6.png
差异原因:Byte Pair Encoding (BPE)

这种差异源于LLaMA Tokenizer使用了Byte Pair Encoding (BPE)技术。BPE将输入文本编码为字节序列,并通过合并高频字节对构建词汇表。在输出中,token通常以字节情势(b'')呈现,而不是直接的人类可读文本。
例如:


[*]ID 9906对应的b'SGVsbG8'实际上是Base64编码的字节序列。
[*]使用Base64解码并转换为ASCII后,可以发现'SGVsbG8'解码后就是普通的单词“Hello”。
https://i-blog.csdnimg.cn/direct/aace92fcb6934462bdb9750d1d13962b.png

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: LLM架构(1): Tokenizer