【Flux 拆解(1)】CLIP 和 T5 的 Tokenizer 异同

本系列将以 Flux-dev 为例,详细拆解各个部分的细节和重点。

Flux 整体框架图如下,来源于: 《Stable Diffusion 3「精神续作」FLUX.1 源码深度前瞻解读》
在这里插入图片描述

Tokenizer 是什么?

标记器(Tokenizer)是 NLP 管道的核心组件之一。它们有一个目的:将文本转换为模型可以处理的数据。模型只能处理数字,因此标记器(Tokenizer)需要将我们的文本输入转换为数字数据1

特性CLIP TokenizerT5 Tokenizer
编码方式BPEUnigram
用途更关注多模态任务设计目标是通用的文本任务
实现工具类似 GPT-2 的实现SentencePiece

代码层面的异同

函数 / 作用CLIPTokenizerT5TokenizerFast
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 的含义:

  1. bos_token: 句子开始(Beginning of Sentence)标记。在处理文本时,这个标记通常被添加到每个句子的开始。

  2. eos_token: 句子结束(End of Sentence)标记。这个标记通常被添加到每个句子的末尾。

  3. unk_token: 未知(Unknown)标记。当tokenizer遇到它不认识的词汇时,会用这个标记来代替。

  4. sep_token: 分隔(Separator)标记。在某些模型中,这个标记用于分隔句子或句子对。

  5. pad_token: 填充(Padding)标记。在处理不同长度的文本时,这个标记用于填充较短的文本,以便它们具有相同的长度。

  6. cls_token: 类别(Classification)标记。在某些模型中,这个标记用于表示一个句子的开始,并且通常用于分类任务。

  7. mask_token: 遮罩(Mask)标记。在某些模型中,如BERT,这个标记用于表示被遮罩的词汇,这些词汇在模型训练中用于预测。

  8. additional_special_tokens: 额外的特殊标记。这些是除了上述标记之外,用户可以自定义添加的特殊标记,用于满足特定的需求。

在CLIP模型中,这些标记的具体使用可能会有所不同,但它们通常用于帮助模型理解和处理文本数据。例如,bos_tokeneos_token 可以帮助模型识别句子的边界,而 pad_token 可以帮助模型处理不同长度的输入。

在使用CLIP或其他NLP模型时,正确设置和使用这些标记对于模型的性能至关重要。


  1. 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 ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值