大语言模型中的两个核心概念:Token和Tokenizer

文摘   2024-07-25 20:50   新加坡  

引言:

在大语言模型迅速发展的今天,Token和Tokenizer这两个概念经常出现在技术讨论中。无论是谈论模型的输入输出长度,还是API的收费标准,甚至是一些看似简单的数值比较错误(如9.11和9.9的大小比较),都与这两个概念密切相关。很多用户可能有这样的体会:在ChatGPT的对话框里输入几轮对话之后,感觉GPT好像失忆了一样,忘记了之前的设定,这个现象也和Token的输入长度有关。

本文将深入探讨这两个概念,揭示它们在大模型中的重要作用。



一、 什么是Token?

Token在中文中可以翻译成"词元"。

在大语言模型领域,Token是处理和理解文本数据的基本单位。它可以是一个单词、一个字符,甚至是一个子词(subword)。总之,token就是文本中的最小有意义的单位,它们可以帮助我们把文本分解成更容易处理和分析的部分。

Token的类型可以分为以下几类:

  • 单词级Token:以单词为单位进行分割。例如,"Hello world"会被分割为"Hello"和"world"两个Token。
  • 字符级Token:以字符为单位进行分割。例如,"Hello"会被分割为"H"、"e"、"l"、"l"、"o"五个Token。
  • 子词级Token:介于单词和字符之间的粒度,常用于处理复合词或词缀, 通常是根据语料库中的词频和共现频率来自动划分。例如,"unhappiness"可能会被分割为"un"、"happi"、"ness"三个Token;还有一个例子,"transformer"可能会被划分成两个子词"trans"和"former",或者三个子词"t","rans"和"former",或者四个子词"t","r","ans"和"former"。

在不同语言中,Token的处理可能有显著差异:

  • 英语等使用空格分隔单词的语言,通常更容易进行单词级的tokenization。
  • 中文、日语等语言没有明显的词间分隔符,tokenization可能更倾向于字符级或子单词级。例如,在GPT-3.5和GPT-4中,"自然语言处理"可能会被处理成"自"、"然"、"语"、"言"、"处理"这样的Token序列。

一个有用的经验法则是,一个token通常对应于普通英文文本的大约4个字符。这相当于大约四分之三个单词(所以100个token约等于75个单词)。

值得注意的是,英文的token占用相对于中文是偏少的,所以我们经常建议把中文长prompt先翻译成英文,输出还是中文。假如想查看GPT是如何切分token的,可以到OpenAI的官方tokenizer网站进行尝试。https://platform.openai.com/tokenizer。

二、什么是Tokenizer?

Tokenizer在中文中可以翻译为"分词器"。这个术语指的是一种算法或程序,它的作用是将文本分割成一个个的Token,作为语言模型处理的输入或输出。

Tokenizer是将文本切分成多个tokens的工具或算法。它负责将原始文本分割成tokens序列。在大模型中,有多种不同类型的tokenizer,每种tokenizer都有其特定的应用场景和适用范围。

常见的Tokenizer类型包括:

  1. 基于字符的Tokenizer:将文本按照字符分割成token,适用于处理中文等没有空格分隔的语言。
  2. 基于词的Tokenizer:将文本按照语言的语法规则分割成单词。适用于大部分语言,但对于某些复合词语言效果可能不佳。
  3. 基于句子的Tokenizer:将文本按照句子进行划分。但是这种在实际应用中并不多见。
  4. 基于深度学习的Tokenizer:利用神经网络模型来学习文本字符串的最佳分割方式。这种方法通常使用大量的标注数据进行训练,从而让模型能够捕捉到文本中的复杂特征和规律。

在中文处理中,由于中文文本不是以空格分隔单词,tokenizer的作用尤为重要。中文分词器需要识别句子中的词语边界,这通常涉及到语义、上下文以及复杂的语言规则。

三、Token和Tokenizer的关系

Token与Tokenizer是密切相关的概念。Token作为文本的基本单位,是Tokenizer处理的对象。

Tokenizer根据特定的规则和算法将原始文本分割成Token序列,使得文本可以被进一步处理和分析。

在大语言模型的处理流程中,Tokenizer通常是作为预处理步骤的一部分。

在文本输入模型之前,需要先经过Tokenizer的处理,将文本转换成模型可以理解的Token序列。例如:

from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")

# 输入文本
text = "9.11"
input_ids = tokenizer(text, return_tensors="pt").input_ids

print("Token IDs:", input_ids)

在上述代码中,input_ids就是tokenizer处理后的tokens,但是其是以索引的形式存储的。

如果想要转换成可读的文本,需要查找词表的对应索引的词语,或者是调用tokenizer的API。

四、Tokenization面临的问题

Tokenization在大语言模型任务中具有重要作用,但在实际应用中仍面临一些问题,主要包括:

  1. 多种语言:世界上的语言种类很多,每种语言都有其独特的语法、词汇和表达方式。为每种语言设计一个有效的Tokenization策略是一项具有挑战性的任务。
  2. 一词多义:自然语言中的词汇具有多义性,一个单词可能有多个含义和用法。在Tokenization过程中,需要准确识别每个词汇的含义和用法,以便正确地将其分割成Tokens。
  3. 多种策略:目前有许多预训练模型可供选择,如BERT、GPT、RoBERTa等。这些模型在预训练过程中使用了不同的Tokenization策略,因此在实际应用中需要根据任务需求和文本特点选择合适的预训练模型,并进行相应的调整。

五、Token和Tokenizer的重要性

  1. 影响模型性能:合理的tokenization可以帮助模型更好地理解和生成文本,同时也能降低计算复杂度。
  2. 决定输入输出长度:Token数量直接决定了模型能处理的文本长度,这对于长文本理解和生成任务尤为重要。
  3. 影响API使用成本:很多大语言模型API的收费标准是基于token数量的,理解token可以帮助用户更好地控制使用成本。
  4. 对特定任务的影响:不同的tokenization方法可能会对某些大语言模型任务产生显著影响,如命名实体识别、情感分析等。
  5. 跨语言处理:在多语言模型中,tokenizer需要处理不同语言的特性,这对于构建truly全球化的AI系统至关重要。

六、小结

Token和Tokenizer是大语言模型中的两个核心概念,它们不仅影响模型的性能和效率,还直接关系到模型的实际应用。理解这两个概念,对于我们更好地使用和开发大语言模型至关重要。无论你是AI研究者、开发者还是普通用户,深入了解Token和Tokenizer都将帮助你更好地驾驭大语言模型这一强大工具。

在通往AGI之路里也有一个章节提到了token的概念解释,有兴趣的也可以去看一看,对更好地使用和开发大语言模型有很大帮助。

附链接:通往 AGI 之路 (https://waytoagi.feishu.cn/wiki/QPe5w5g7UisbEkkow8XcDmOpn8e )


蔡荔谈AI
AI科普 AI培训 超级个体 创业
 最新文章