首页 > 其他分享 >一起来聊聊大模型的token

一起来聊聊大模型的token

时间:2024-05-26 16:04:50浏览次数:16  
标签:模型 分词 空格 token 聊聊 world Hello

文章目录


前言

学习大模型的朋友肯定听说过大模型接口按token,自己编写代码的时候也经常看到token这个词,那它究竟是什么呢,我们一起来探究一下


一、token是什么

在大模型中,“token”通常指代文本中的最小单位,可以是一个单词、一个字符或其他子字符串。对于英语文本,通常以空格分隔的单词作为token。

下面是一个伪代码示例,描述了如何生成和计数token:

# 假设有一个字符串
text = "Hello, how are you?"

# 初始化一个空的token计数器
token_count = 0

# 将文本按空格分割成单词列表
words = text.split(" ")

# 遍历每个单词
for word in words:
    # 去除标点符号等非字母字符
    word = word.strip(",.?!")
    
    # 如果单词不为空,则增加token计数器
    if word:
        token_count += 1
        # 可以在这里对每个单词进行其他处理,例如进行词性标注等等

# 输出token计数结果
print("Token count:", token_count)

在上述伪代码中,文本被分割成单词列表,然后每个单词经过处理后计入token计数器。可以根据需要对每个token进行额外的处理或标注。最终输出token的数量。
在大模型(如GPT、BERT等)中,token 是一个更广泛的概念,不仅限于一个词。在这些模型中,token 可以是一个单词、一部分单词或一个标点符号。具体的划分方式依赖于模型使用的分词(tokenization)算法。

二、常用分词方法

  1. 空格分词(Whitespace Tokenization)

    • 最简单的方法,每个单词和标点符号之间的空格作为分隔符。
    • 例子:“Hello, world!” -> [“Hello,”, “world!”]
  2. 词汇分词(Word Tokenization)

    • 基于词汇表进行分词,每个词在词汇表中都有对应的token。
    • 例子:“Hello, world!” -> [“Hello”, “,”, “world”, “!”]
  3. 子词分词(Subword Tokenization)

    • 将单词分解为更小的子词或字符序列,常用的方法包括BPE(Byte Pair Encoding)和WordPiece。
    • 例子(BPE):“Hello, world!” -> [“He”, “##llo”, “,”, “world”, “!”]
    • 例子(WordPiece):“unhappiness” -> [“un”, “##happiness”]
  4. 字符分词(Character Tokenization)

    • 将每个字符作为一个token。
    • 例子:“Hello, world!” -> [“H”, “e”, “l”, “l”, “o”, “,”, " ", “w”, “o”, “r”, “l”, “d”, “!”]

三、GPT-3的分词方式

1. 代码示例

GPT-3 使用一种基于 BPE 的分词算法,能够将文本拆分为子词单位。这样可以更有效地处理常见词和罕见词,并在处理未知词时表现得更好。

from transformers import GPT2Tokenizer

# 使用 GPT-2 的分词器(GPT-3 使用类似的分词器)
tokenizer = GPT2Tokenizer.from_pretrained('gpt2')

# 输入文本
text = "Hello, world!"

# 分词
tokens = tokenizer.tokenize(text)

print(tokens)

输出示例:

['Hello', ',', 'Ġworld', '!']

在这个例子中,'Hello'',' 是单独的token,而 Ġworld 表示前面有一个空格的 world

2. Ġworldworld 的区别

大家肯定有疑问,上面的分词里有一个特别表述前缀是空格的用法Ġworld
Ġworldworld 在后续计算中是有区别的。在使用子词分词方法(如 BPE 或 WordPiece)时,分词器会将带有前缀的子词(如 Ġworld)和不带前缀的子词(如 world)视为不同的token。

1) 分词中的空格前缀

在 GPT-2 和 GPT-3 等模型中,子词分词器会用特殊的前缀(例如 Ġ)来表示子词的边界或空格。具体来说:

  • Ġworld 表示前面有一个空格的 world
  • world 表示没有空格的 world

示例:

from transformers import GPT2Tokenizer

# 使用 GPT-2 的分词器
tokenizer = GPT2Tokenizer.from_pretrained('gpt2')

# 分词示例
text1 = "Hello world"
text2 = "Helloworld"

tokens1 = tokenizer.tokenize(text1)
tokens2 = tokenizer.tokenize(text2)

print(tokens1)  # ['Hello', 'Ġworld']
print(tokens2)  # ['Hello', 'world']

在这个例子中,'Hello world' 被分成了 ['Hello', 'Ġworld'],而 'Helloworld' 被分成了 ['Hello', 'world']。虽然看起来 worldĠworld 都包含 world,但在模型内部,它们被视为不同的token。

2) 后续计算中的区别

在后续计算中(如词嵌入、模型输入等),Ġworldworld 会有不同的嵌入表示。这种区分有几个重要的作用:

  • 捕捉上下文信息:带有空格前缀的token可以帮助模型捕捉词语之间的边界和上下文信息。例如,Ġworld 表示它前面有一个空格,通常表示是一个新词的开始。
  • 处理连贯文本:当处理连续文本时,空格前缀可以帮助模型区分连续的词和单词内部的子词。例如,Helloworld(一个单词)和 Hello world(两个单词)在模型中会有不同的表示。
  • 词汇一致性:在生成文本或进行预测时,模型可以根据上下文更准确地选择带有或不带有空格前缀的token,以保持生成文本的连贯性和可读性。

示例:计算嵌入

在模型内部,每个token都会被映射到一个高维向量空间中,称为词嵌入。以下是如何在 PyTorch 中查看这些词嵌入的示例:

import torch
from transformers import GPT2Tokenizer, GPT2Model

# 初始化 GPT-2 模型和分词器
tokenizer = GPT2Tokenizer.from_pretrained('gpt2')
model = GPT2Model.from_pretrained('gpt2')

# 示例文本
text1 = "Hello world"
text2 = "Helloworld"

# 分词
tokens1 = tokenizer(text1, return_tensors='pt')
tokens2 = tokenizer(text2, return_tensors='pt')

# 获取词嵌入
with torch.no_grad():
    embeddings1 = model(**tokens1).last_hidden_state
    embeddings2 = model(**tokens2).last_hidden_state

print("Embeddings for 'Hello world':", embeddings1)
print("Embeddings for 'Helloworld':", embeddings2)

在这个示例中,'Hello world''Helloworld' 的词嵌入会有所不同,因为它们的token序列不同。

3. 为什么使用子词分词

  1. 处理未登录词:词汇表中没有的新词或拼写错误可以通过组合已有的子词来表示。
  2. 减小词汇表大小:相比单词分词,子词分词可以大幅减小词汇表的大小,同时覆盖更多的词形变化。
  3. 提高模型效率:子词分词平衡了模型在处理常见词和罕见词时的效率和性能。

总结

在大模型中,token 不一定是一个完整的词。它可以是一个词、一部分词、字符甚至是标点符号。这取决于所使用的分词方法。子词分词方法(如 BPE 和 WordPiece)在现代 NLP 模型中非常常见,因为它们能够高效地处理各种语言现象,同时保持词汇表的紧凑性。

带有空格前缀(如 Ġworld)和不带空格前缀(如 world)的token在模型中会被视为不同的实体,并且会有不同的词嵌入表示。这种区分有助于模型捕捉词语边界和上下文信息,从而提高对连续文本的处理能力和生成文本的质量。

标签:模型,分词,空格,token,聊聊,world,Hello
From: https://blog.csdn.net/kljyrx/article/details/139142199

相关文章

  • [学习分享]基于matlab的新安江模型_01_模型介绍与蓄满产流
    写在前面的  最近笔者刚完成水文预报这门课的课程设计,课程设计要求根据课本自行实现新安江模型,完成径流模拟。现在课程设计已经基本全部做完,自己感觉做的也还不错,同时也因为蛮喜欢水文预报这门课的,所以想再对课程设计的整个过程做个整理分享出来,也希望能够帮助到一些困惑于......
  • [书生·浦语大模型实战营]——第三节:茴香豆:搭建你的 RAG 智能助理
    0.RAG概述定义:RAG(RetrievalAugmentedGeneration)技术,通过检索与用户输入相关的信息片段,并结合外部知识库来生成更准确、更丰富的回答。解决LLMs在处理知识密集型任务时可能遇到的挑战,如幻觉、知识过时和缺乏透明、可追溯的推理过程等。提供更准确的回答、降低推理成......
  • 重排模型DLCM
    论文名:LearningaDeepListwiseContextModelforRankingRefinement背景在搜索场景下,给定一个查询q,q和d特征的向量表示x(q,d),rank阶段的loss可以表示为:其中:Q是query的集合,D是doc集合,f是rank模型函数可以看到,传统的rank模型是一种point-wise的建模方法,没有考虑不同doc之间......
  • 在微服务架构中使用token exchange主要的优势
    在微服务架构中使用tokenexchange有以下几个主要的优势:服务解耦:微服务之间通过tokenexchange进行解耦,每个服务只需关注自身的功能实现,而不需要关心其他服务的具体实现细节。这样可以提高系统的灵活性和可扩展性。安全性:通过tokenexchange进行服务间的认证和授权,可以......
  • 2024年5月大语言模型论文推荐:模型优化、缩放到推理、基准测试和增强性能
    前一篇文章总结了关于计算机视觉方面的论文,这篇文章将要总结了2024年5月发表的一些最重要的大语言模型的论文。这些论文涵盖了塑造下一代语言模型的各种主题,从模型优化和缩放到推理、基准测试和增强性能。大型语言模型(llm)发展迅速,跟上这些领域新颖的研究将有助于引导模型的持续......
  • 一种多行业AI大模型应用系统架构图
    一种多行业AI大模型应用系统架构图在线下载地址:https://www.processon.com/diagraming/663aca77c6097856afd4d9ba一种适用于多行业AI大模型应用系统架构图,共分为七层:1、模型应用,2、模型服务平台、3、行业模型、4、模型训练5、模型选择,6、行业数据,6、部署方式;通过对AI模......
  • 如何选择一个最强大模型-看最硬核排名了!
    ChatbotArena由伯克利大学主导团队LMSYSOrg发布了一个针对大语言模型的基准平台ChatbotArena。该平台采用匿名、随机的方式让不同的大模型产品进行对抗评测,基于国际象棋等竞技游戏中广泛使用的埃洛等级分系统,通过用户投票产生,系统每次会随机选择两个不同的大模型机器人和......
  • 大语言模型LLM 相关知识汇总
    大型语言模型(LLM)在设计和应用时需要遵守一系列的道德和法律标准,以确保不会输出不当内容。以下是一些LLM通常不应该对外输出的内容类型:个人隐私信息:包括但不限于个人身份信息(PII),如姓名、地址、电话号码、电子邮件地址、社会安全号码等。敏感数据:任何可能涉及国家安全、商业......
  • 网络模型-策略路由配置
            在实际网络应用中,策略路由也是一种重要的技术手段。尽管在考试并不注重策略路由,但是实际上应用较多建议考生除了掌握基本的静态路由协议IProute-static,动态路由协议RIP、还要掌握如何配置策略路由。策略路由的基本原理:根据ACL定义的不同数OSPF的基础配置外,据......
  • 昇腾开发全流程 之 MindSpore华为云模型训练
    前言学会如何安装配置华为云ModelArts、开发板Atlas200IDKA2,并打通一个训练到推理的全流程思路。在本篇章,首先我们开始进入训练阶段!训练阶段A.环境搭建MindSpore华为云模型训练Step1创建OBS并行文件登录华为云->控制台->左侧导航栏选择“对象存储服务OBS”......