Files
happy-llm/docs/chapter5/5.3 训练 Tokenizer.md

81 lines
5.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 5.3 训练 Tokenizer
在自然语言处理 (NLP) 中Tokenizer 是一种将文本分解为较小单位(称为 token的工具。这些 token 可以是词、子词、字符甚至是特定的符号。Tokenization 是 NLP 中的第一步,直接影响后续处理和分析的效果。不同类型的 tokenizer 适用于不同的应用场景,以下是几种常见的 tokenizer 及其特点。
## 5.3.1 Word-based Tokenizer
**Word-based Tokenizer** 是最简单和直观的一种分词方法。它将文本按空格和标点符号分割成单词。这种方法的优点在于其简单和直接易于实现且与人类对语言的直觉相符。然而它也存在一些明显的缺点如无法处理未登录词OOVout-of-vocabulary和罕见词对复合词如“New York”或缩略词如“don't”的处理也不够精细。此外Word-based Tokenizer 在处理不同语言时也会遇到挑战,因为一些语言(如中文、日文)没有显式的单词分隔符。
示例:
```
Input: "Hello, world! There is Datawhale."
Output: ["Hello", ",", "world", "!", "There", "is", "Datawhale", "."]
```
在这个例子中,输入的句子被分割成一系列单词和标点符号,每个单词或标点符号都作为一个独立的 token。
## 5.3.2 Character-based Tokenizer
**Character-based Tokenizer** 将文本中的每个字符视为一个独立的 token。这种方法能非常精细地处理文本适用于处理拼写错误、未登录词或新词。由于每个字符都是一个独立的 token因此这种方法可以捕捉到非常细微的语言特征。这对于一些特定的应用场景如生成式任务或需要处理大量未登录词的任务特别有用。但是这种方法也会导致 token 序列变得非常长,增加了模型的计算复杂度和训练时间。此外,字符级的分割可能会丢失一些词级别的语义信息,使得模型难以理解上下文。
示例:
```
Input: "Hello"
Output: ["H", "e", "l", "l", "o"]
```
在这个例子中单词“Hello”被分割成单个字符每个字符作为一个独立的 token。这种方法能够处理任何语言和字符集具有极大的灵活性。
## 5.3.3 Subword Tokenizer
**Subword Tokenizer** 介于词和字符之间能够更好地平衡分词的细粒度和处理未登录词的能力。Subword Tokenizer 的关键思想是将文本分割成比单词更小的单位,但又比字符更大,这样既能处理未知词,又能保持一定的语义信息。常见的子词分词方法包括 BPE、WordPiece 和 Unigram。
### 1Byte Pair Encoding (BPE)
**BPE** 是一种基于统计方法通过反复合并频率最高的字符或字符序列对来生成子词词典。这种方法的优点在于其简单和高效能够有效地处理未知词和罕见词同时保持较低的词典大小。BPE 的合并过程是自底向上的,逐步将频率最高的字符对合并成新的子词,直到达到预定的词典大小或不再有高频的字符对。
示例:
```
Input: "lower"
Output: ["low", "er"]
Input: "newest"
Output: ["new", "est"]
```
在这个例子中单词“lower”被分割成子词“low”和“er”而“newest”被分割成“new”和“est”。这种方法有效地处理了词干和词缀保持了单词的基本语义结构。
### 2WordPiece
**WordPiece** 是另一种基于子词的分词方法,最初用于谷歌的 BERT 模型。与 BPE 类似WordPiece 通过最大化子词序列的似然函数来生成词典但在合并子词时更注重语言模型的优化。WordPiece 会优先选择能够最大化整体句子概率的子词,使得分词结果在语言模型中具有更高的概率。
示例:
```
Input: "unhappiness"
Output: ["un", "##happiness"]
```
在这个例子中单词“unhappiness”被分割成子词“un”和“##happiness”,其中“##”表示这是一个后缀子词。通过这种方式WordPiece 能够更好地处理复合词和派生词,保留更多的语义信息。
### 3Unigram
**Unigram** 分词方法基于概率模型通过选择具有最高概率的子词来分割文本。Unigram 词典是通过训练语言模型生成的可以处理多种语言和不同类型的文本。Unigram 模型会为每个子词分配一个概率,然后根据这些概率进行最优分割。
示例:
```
Input: "unhappiness"
Output: ["un", "happiness"]
Input: "newest"
Output: ["new", "est"]
```
在这个例子中单词“unhappiness”被分割成子词“un”和“happiness”而“newest”被分割成“new”和“est”。这种方法通过概率模型有效地处理了子词分割使得分割结果更符合语言使用习惯。
每种 Tokenizer 方法都有其特定的应用场景和优缺点,选择适合的 Tokenizer 对于自然语言处理任务的成功至关重要。
## 5.3.4 训练一个 Tokenizer
这里我们选择使用 BPE 算法来训练一个 Subword Tokenizer。BPE 是一种简单而有效的分词方法,能够处理未登录词和罕见词,同时保持较小的词典大小。我们将使用 Hugging Face 的 `tokenizers` 库来训练一个 BPE Tokenizer。