在上一节,利用 BERT 模型将一个文本进行了 token 化。那你可能会问,是不是所有的模型将同一个文本 token 化之后,结果都一样呢?
当然不是。
这是因为不同的模型对文本进行 token 化时使用到的算法不一样。
在 BERT 中用到的是 WordPiece 算法,而 GPT 系列模型将文本进行 token 化时,使用的则是 Byte-Pair Encoding(BPE)算法,这两种算法虽然不是本专栏的重点,但后面也会专门来讲解一下。
下面来看一下如何使用 GPT2 模型来对文本进行 token 化,以及 GPT2 模型对文本 token 化之后的 token 序列和 BERT 输出的 token 序列有什么不同?
GPT2 如何对文本进行转换
GPT(Generative Pre-trained Transformer)大家应该都不陌生了,它是 OpenAI 开发的一系列自然语言处理模型,这些模型同样可以用于生成文本、语言理解和其他语言相关的任务。
GPT1 发布于 2018 年,也是 GPT 系列最早的一个版本,当时发布时,就以其巨大的参数量(在当时而言)出名了。
GPT2 发布于 2019 年,是在 GPT1 版本上的演进。
GPT3 发布于 2020 年,参数量达到了 1750 亿个。
在 2023 年火爆出圈的 chatGPT 是基于 GPT-3.5 版本而来的,这是 GPT3 的增强版本,专门优化了模型的语言生成和对话能力,后来 2023 年又出了 GPT4,据说现在OpenAI 正在秘密训练 GPT5,不过目前还没有见到官方报道。
这里有一个全程一站式的 Transformer 讲解和实战辅导,带你从零手写一个可对话的大模型,点击链接查看详情从零手写大模型实战
利用 GPT2 将文本 token 化
本节使用一个 GPT 早期版本(GPT2)来将一段文本进行 token 化,相关代码如下:
ini
from transformers import GPT2 token izer
# 加载模型和 token izer
token izer = GPT2 token izer.from_pretrained('GPT2')
# 初始文本
prompt = "I debug my code all day, and I am like a debugger."
encode_id = token izer.encode(prompt)
print(encode_id)
token s = token izer.convert_ids_to_ token s(encode_id)
print( token s)
上述代码运行完,会打印出 token 序列如下:
css
['I', 'Ġdebug', 'Ġmy', 'Ġcode', 'Ġall', 'Ġday', ',', 'Ġand', 'ĠI', 'Ġam', 'Ġlike', 'Ġa', 'Ġdebugger', '.']
可以看到,GPT2 输出的 token 序列与 BERT 输出的 token 序列并不一致,其中,每个单词前面的特殊符号表明这是一个新词的开始,用来将词与词进行区分。
你可以重点关注一下 debug 这个单词。在 BERT 中,debug被拆分为了de,bu和g三个子词,而在 GPT2 的输出中仍然是 debug,这便跟模型使用的算法有关。
同样,你也可以修改上述代码中的文本 text,看模型将其 token 化之后是什么样的。
我创建了一个《小而精的AI学习圈》知识星球,星球上有几十万字原创高质量的技术专栏分享,同时你也可以在星球向我提问。 点击这里,我们星球见! >>>
点击这里查看所有 AI 技术专栏