在处理自然语言处理(NLP)任务时,特别是在使用大模型如Transformer架构的模型(例如BERT、GPT系列等)时,“token”是一个核心概念。
Tokenization是将文本分割成更小单元的过程,这些单元通常被称为tokens。Tokens可以是单词、子词(subwords)、字符或其他形式的语言单位。以下是关于大模型中token的一些关键点:
对于现代的大规模预训练语言模型(如BERT、RoBERTa、T5、GPT系列等),它们通常采用子词tokenization策略,这使得模型能够更好地处理词汇外的单词,并提高模型的表现力和泛化能力。
示例:使用Hugging Face的Transformers库进行Tokenization
以下是如何使用Hugging Face的transformers
库加载一个预训练模型及其对应的tokenizer,并进行tokenization的示例。
pythonfrom 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来标记输入序列的不同部分或执行特定的任务。例如:
[CLS]
:在BERT中,位于每个输入序列的开头,用于分类任务。[SEP]
:用于分隔两个句子或标记序列的结尾。[PAD]
:用于填充短序列至固定长度,以批量处理不同长度的序列。[MASK]
:在BERT的masked language modeling任务中,随机选择的一些tokens会被替换为这个标记。