本系列将以 Flux-dev 为例,详细拆解各个部分的细节和重点。
Flux 整体框架图如下,来源于: 《Stable Diffusion 3「精神续作」FLUX.1 源码深度前瞻解读》
Tokenizer 是什么?
标记器(Tokenizer)是 NLP 管道的核心组件之一。它们有一个目的:将文本转换为模型可以处理的数据。模型只能处理数字,因此标记器(Tokenizer)需要将我们的文本输入转换为数字数据1。
特性 | CLIP Tokenizer | T5 Tokenizer |
---|---|---|
编码方式 | BPE | Unigram |
用途 | 更关注多模态任务 | 设计目标是通用的文本任务 |
实现工具 | 类似 GPT-2 的实现 | SentencePiece |
代码层面的异同
函数 / 作用 | CLIPTokenizer | T5TokenizerFast |
---|---|---|
add_tokens | 扩充词表 | 扩充词表 |
encode | 将文本编码 | 将文本编码 |
convert_tokens_to_ids | 类似 GPT-2 的实现 | SentencePiece |
T5TokenizerFast 的 add_tokens
- T5TokenizerFast 继承了 PreTrainedTokenizerFast 中的
add_tokens
, - 从下面的代码可以找到具体的 add_tokens。由于我们新加的 token 并不是 special_tokens(bos_token、eos_token等) ,所以直接 return self._tokenizer.add_tokens(new_tokens)
def _add_tokens(self, new_tokens: List[Union[str, AddedToken]], special_tokens=False) -> int:
if special_tokens:
return self._tokenizer.add_special_tokens(new_tokens)
return self._tokenizer.add_tokens(new_tokens)
# 位于 /path/lib/python3.12/site-packages/transformers/tokenization_utils_fast.py
- add_tokens 最终调用的 PreTrainedTokenizerFast 中继承的 PreTrainedTokenizerBase
def add_tokens(
self, new_tokens: Union[str, AddedToken, List[Union[str, AddedToken]]], special_tokens: bool = False
) -> int:
if not new_tokens:
return 0
if not isinstance(new_tokens, (list, tuple)):
new_tokens = [new_tokens]
return self._add_tokens(new_tokens, special_tokens=special_tokens)
def _add_tokens(self, new_tokens: Union[List[str], List[AddedToken]], special_tokens: bool = False) -> int:
raise NotImplementedError
# 位于 /path/lib/python3.12/site-packages/transformers/tokenization_utils_base.py
但 _add_tokens 方法是一个设计用于在具体的 tokenizer 类中实现的抽象方法,目的是将新的 token 添加到词汇表中。它的具体实现会根据不同的 tokenizer 类型而有所不同。
CLIP Tokenizer
CLIP(Contrastive Language–Image Pre-training)是一个多模态预训练模型,它通过大规模的图像和文本数据学习视觉概念和语言概念之间的关联。
在使用CLIP进行文本处理时,tokenizer(分词器)扮演着重要的角色,**它负责将文本字符串转换为模型可以理解的格式。**以下是 CLIP 中特殊 token 的含义:
-
bos_token
: 句子开始(Beginning of Sentence)标记。在处理文本时,这个标记通常被添加到每个句子的开始。 -
eos_token
: 句子结束(End of Sentence)标记。这个标记通常被添加到每个句子的末尾。 -
unk_token
: 未知(Unknown)标记。当tokenizer遇到它不认识的词汇时,会用这个标记来代替。 -
sep_token
: 分隔(Separator)标记。在某些模型中,这个标记用于分隔句子或句子对。 -
pad_token
: 填充(Padding)标记。在处理不同长度的文本时,这个标记用于填充较短的文本,以便它们具有相同的长度。 -
cls_token
: 类别(Classification)标记。在某些模型中,这个标记用于表示一个句子的开始,并且通常用于分类任务。 -
mask_token
: 遮罩(Mask)标记。在某些模型中,如BERT,这个标记用于表示被遮罩的词汇,这些词汇在模型训练中用于预测。 -
additional_special_tokens
: 额外的特殊标记。这些是除了上述标记之外,用户可以自定义添加的特殊标记,用于满足特定的需求。
在CLIP模型中,这些标记的具体使用可能会有所不同,但它们通常用于帮助模型理解和处理文本数据。例如,bos_token
和 eos_token
可以帮助模型识别句子的边界,而 pad_token
可以帮助模型处理不同长度的输入。
在使用CLIP或其他NLP模型时,正确设置和使用这些标记对于模型的性能至关重要。
https://huggingface.co/learn/nlp-course/zh-CN/chapter2/4#%E6%A0%87%E8%AE%B0%E5%99%A8%EF%BC%88Tokenizer%EF%BC%89 ↩︎