这是我最喜欢的关于大语言模型(LLM)运作方式的演示之一。简单来说,它们就是通过一个“令牌接一个令牌”的方式来生成输出。每个新令牌的生成,都是基于输入内容和之前已经输出的所有内容所决定的概率。举个例子:
用户问:“天空是什么颜色?”
模型生成的输出链可能是这样的:
天空 [用户输入的问题是关于“颜色”的]
→ 是 [根据问题,模型推断出这是在做判断或回答]
→ 蓝色 [因为在训练数据中,提到“天空”时,“蓝色”出现的频率最高]如果你觉得这个过程有点像手机或者代码编辑器里的自动补全功能,那没错,本质上确实类似,只不过模型的结构要复杂得多。再深入一点:
有时候,模型生成的令牌链会陷入低概率的状态,导致句子看起来有点别扭或者不合逻辑。这时候模型可能会突然“变卦”,甚至自己纠正自己,看起来像是毫无目的地来回切换。比如,它可能会这样输出:
“是” [结论]
→ “[答案]” [解决方案,回顾前面的结论]
→ “否” [新的结论,和之前的结论相反]
→ “让我们再试一次” [试图解决令牌之间的冲突]
→ 然后从同样的输入重新生成一个新的令牌链
→ 这个过程可能会不断循环为什么会这样?为什么模型有时候会给出错误的答案?这其实是因为训练数据中存在一些误导信息。例如,关于“海马表情符号”的问题,训练数据中有很多人错误地提到了这个表情符号的存在。这些错误主要来自博客、社交媒体帖子等非权威来源。当然,也有一些文章专门讨论人们为什么会误以为有这个表情符号。而真正权威的来源——比如列出所有表情符号的Unicode官方文档,则明确表示没有这个“海马表情符号”。所以模型在判断时,面对的是一个非常微妙的概率分布:一堆不太靠谱的数据说“有”,而少数但更权威的数据说“没有”。这就导致模型在输出时,容易陷入“是”和“否”之间的拉扯,形成循环。总结一下:
在这个演示中,模型在生成每个新令牌时,都倾向于指向初始令牌的反面。这就违背了原本应该维持高概率、逻辑一致输出的目标。它从“是”到“[答案]”,再到“否”,再到“让我再试一次”,然后循环往复。这种现象,本质上是因为它训练时接触的数据本身就存在矛盾。免责声明:
这只是一个极度简化的解释,别把这篇文章的内容当成权威资料。看个乐呵,享受拉比托尔(Rabitt Hole)的奇妙旅程就好 😄 |