2025-03-05
编程
00
请注意,本文编写于 53 天前,最后修改于 48 天前,其中某些信息可能已经过时。

目录

Token的基本概念
常见的Tokenization方法
在大模型中的应用
特殊Tokens
Token与性能的关系

在处理自然语言处理(NLP)任务时,特别是在使用大模型如Transformer架构的模型(例如BERT、GPT系列等)时,“token”是一个核心概念。

Tokenization是将文本分割成更小单元的过程,这些单元通常被称为tokens。Tokens可以是单词、子词(subwords)、字符或其他形式的语言单位。以下是关于大模型中token的一些关键点:

Token的基本概念

  1. Tokenization:这是将一段文本转换为一系列tokens的过程。不同的模型和库可能有不同的tokenization策略。
  2. Vocabulary:即词汇表,是一组预定义的tokens,用于表示输入文本中的元素。模型训练过程中会基于训练数据建立一个词汇表。
  3. UNK Token:未知标记(Unknown token),当输入文本包含不在词汇表中的词时,会被替换为这个特殊标记。

常见的Tokenization方法

  • Word-level Tokenization:每个token代表一个完整的单词。这种方法简单直接,但对未登录词(OOV, Out-Of-Vocabulary)处理不佳。
  • Character-level Tokenization:每个token代表一个字符。虽然能解决OOV问题,但对于长文本效率较低。
  • Subword Tokenization:介于单词级和字符级之间,通过算法(如Byte Pair Encoding (BPE) 或 SentencePiece)将单词分解为子词单元。这种方法既能有效处理OOV问题,又能保持较高的效率。

在大模型中的应用

对于现代的大规模预训练语言模型(如BERT、RoBERTa、T5、GPT系列等),它们通常采用子词tokenization策略,这使得模型能够更好地处理词汇外的单词,并提高模型的表现力和泛化能力。

示例:使用Hugging Face的Transformers库进行Tokenization

以下是如何使用Hugging Face的transformers库加载一个预训练模型及其对应的tokenizer,并进行tokenization的示例。

python
from transformers import BertTokenizer, BertModel # 加载预训练的BERT tokenizer和模型 tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') model = BertModel.from_pretrained('bert-base-uncased') # 输入文本 text = "Hello, how are you?" # 将文本转换为tokens tokens = tokenizer.tokenize(text) print("Tokens:", tokens) # 将tokens转换为input IDs input_ids = tokenizer.convert_tokens_to_ids(tokens) print("Input IDs:", input_ids) # 也可以直接从文本获得input IDs input_ids_direct = tokenizer.encode(text, add_special_tokens=True) print("Direct Input IDs:", input_ids_direct) # 使用模型获取输出 outputs = model(input_ids=torch.tensor([input_ids_direct])) last_hidden_states = outputs.last_hidden_state print("Last Hidden States Shape:", last_hidden_states.shape)

特殊Tokens

大多数预训练模型都会使用一些特殊的tokens来标记输入序列的不同部分或执行特定的任务。例如:

  • [CLS]:在BERT中,位于每个输入序列的开头,用于分类任务。
  • [SEP]:用于分隔两个句子或标记序列的结尾。
  • [PAD]:用于填充短序列至固定长度,以批量处理不同长度的序列。
  • [MASK]:在BERT的masked language modeling任务中,随机选择的一些tokens会被替换为这个标记。

Token与性能的关系

  • 序列长度:大多数模型对输入序列的最大长度有限制(例如BERT的最大长度为512)。超出此限制的部分可能会被截断,影响模型的效果。
  • 词汇量大小:更大的词汇表意味着更多的参数需要训练,但也可能减少OOV的问题。然而,过大的词汇表也可能导致模型复杂度增加,训练时间延长。