[LLM]Tokenizer灵魂十一问
首先附上一张图大概表示Tokenizer和LLM之间的关系:
(你可以把LLM直接看作是AI来理解下面的问答)
1. 为什么LLM不能拼写单词和计算字数?
因为Tokenizer。字符在输入LLM之前都会转成Token,而且一般不是一个字符转化成一个token,常常是多个字符(比如‘China’)在输入LLM时是作为一个token(比如‘[859]’),所以AI在输出分析的时候会把‘China’当作一个字符计算,这样就会错误的计算字数。
2. 为什么LLM不能做到一些超级简单的事,比如反向输出字符串?
一些字符串在LLM看来完全就是一个token(LLM并不理解字符串,它只认token),你让它反向输出一个字符串,在它看来就是让它反向输出一个单词,它会迷茫不理解一个单词还能怎么反向(镜像?不是)?所以就会出现输出一些乱码的情况。但是如果你这样说,第一步在每一个字符之间加入一个空格后输出,第二步反向打印输出后的字符和空格。这样LLM就会正确反向输出字符串。
3. 为什么LLM在非英语交流中表现的要差一些?
不仅仅是因为在训练LLM阶段的数据集大部分是英语导致的,在Tokenizer阶段的数据集包含的非英语数据内容不足也是一大原因。这就会导致同样的一句话,翻译成其他语言后就会使用更多的Token。见下面图中的中英文对照:
这样就会产生在同样的最大token可输入长度的情况下,英语相比其他语言就可以表达更多的信息,相应的LLM在给出输出反馈时英语也有着更详细的回答解释。
4. 为什么LLM在一些简单算术上都会出错?
算术就会涉及到数字,数字运算其实是在字符级别进行的,而数字字符在Token化时完全取决于是否会合并,Tokenizer的数字合并是带有一点随机性的,就是说同样的一个数字(112)有时候会合并成一个token,有时候会被拆成两个token,正是这种不一致导致一些算术运算的错误。
5. 为什么gpt2在python上会有那么多代码问题?
python是空格缩进表示代码段的,所以一段代码会有很多空格。而gpt2的Tokenizer会把所有的空格都表示成一个独立的不同的token(见下图),大大减弱了python的有效输入长度。
6. 为什么我的LLM在输入‘<|endoftext|>’会直接宕机?
见下图:
<|endoftext|>其实是一个特殊token,被用来识别一段内容的结束。在内容末尾会默认添加这个token表示这段内容结束了。不同的LLM有着不同的特殊token,有的会有多个特殊token。
7. 为什么会得到'trailing whitespace'这样奇怪的警告信息?
这通常发生在LLM的背景界面,在输入结束的最后添加一个空格符号,会引发这样的警告信息。因为在Tokenizer阶段空格通常作为字符的前缀一同编入一个token里,很少作为一个单独的token出现。
8. 为什么在我问一些关于‘SolidGoldmagikarp’的话会导致LLM暴走?
’SolidGoldmagikarp‘是一位Reddit用户发帖经常使用的一个名词,而gpt的Tokenizer的数据集在从网络上收集整理数据时,这个名词大量出现,导致Tokenizer专门为它生成了一个token来表示,而到了LLM的训练数据集这个token完全没有出现,因为Tokenizer的数据集和LLM的数据集是完全独立分开的,LLM在训练时向前向后传播,而这个token就像消失了一样,没有被激活,没有被更新。简单来说,LLM从来没有见过这个token,所以当我们在输入中提及这个token时,就会引发LLM的一些不可预料的行为。
这样的不稳定的token还有很多,感兴趣的朋友点击这里查看更多相关信息
9. 为什么在LLMs的数据集训练方面YAML格式更好一些,而不是JSON?
同样的内容yaml比json占用的token数要少,要更加高效,见下图:
在真正训练的时候需要根据多少多少token付费多少,对于涉及到资金的问题还是要尽最大努力让花的每一分都物有所值才好。
10. 为什么LLM不是一个端到端的语言模型?
如开头的Tokenizer和LLM的位置关系可知,我们的输入输出都是要经过Tokenizer处理的。输入的字符串会转成tokens传到LLM,同样LLM的反馈输出token序列,也会经过Tokenizer解码返回给我们。
11. 什么是最根本的受难源头?
Tokenization。现在已经有些人在研究如何去除Tokenization这一过程,希望我们也可以赶上。