提到token,不得不提tokenization(分词)。分词就是将句子、段落、文章这类型的长文本,分解为以字词(token)为单位的数据结构。
比方说,在句子 “我很开心” 中,利用中文分词得到的列表是{“我”,“很”,“开心”},列表中的每一个元素代表一个token。
不同的分词策略,会导致不同的token划分,比如ChatGPT,我们可以通过https://platform.openai.com/tokenizer这里看它的Token。
对于“ChatGPT is great!”这个字符串,就被编码为六个tokens:“Chat”、“G”、“PT”、“ is”、“ great”、“!”,如下图:
OpenAI官方给出了一个初略估算的方式:对于英文, 一个token差不多为3/4的一个单词 。
下图是官方的例子,可以看到特殊字符、一些单词都被拆成多个token了。
视觉场景Transformer的token
对于视觉场景Transformer,把每个像素看作是一个token的话并不现实,因为一张224x224的图片铺平后就有4万多个token,计算量太大了,BERT都限制了token最长只能512。
所以ViT把一张图切分成一个个16x16的patch(具体数值可以自己修改)每个patch看作是一个token,这样一共就只有(224/16)*(224/16)=196个token了。当然了,单单的切分还不够,还要做一个线性映射+位置编码等等。
如下图下面部分每个点是做上面部分图片拆分的token。
总结
token是指一个具有独立语义的最小单位,每个token都代表一个独立的单元,具有一定的语义含义,并且可以被模型处理。