我去年夏天在Adobe Research(班加罗尔)实习时的工作是让开源的语言模型更好地适应给定的上下文。这意味着无论上下文内容如何,语言模型都必须遵循给定的上下文。
就算上下文说“爱因斯坦创造了引力了”
我尝试了一种方法,这种方法查看输入标记激活,并利用这些模式来识别上下文中出现的标记,并提升它们的权重,使其比其他标记更突出。这通常叫做“logit调整”。有时,logit调整可能会出错,导致低概率标记超越所有其他标记。
例如,假设上下文提到 Olympia(奥林匹亚)是首都。
显然地,没有任何变化,结果直接显示为西雅图。
转换后输出就成了“eek”。
这两个答案都不对。
我们先不细说这个转换的细节。你可以通过这个链接了解更多:
用DoLa让大模型更真实:对比解码(第一部分)但你可能已经猜到了:
我的输出变得一团糟。
示例输出 : Washington 的首都是 iseekek0q3n ee
我卡住了好一会儿,不知道该怎么办。
我首先尝试减少通过我所使用的方法增强令牌的幅度。虽然这样有助于减少输出的混乱,但我试图实现的上下文对齐变得不那么有效了。感觉就像是我不得不在上下文对齐和输出混乱之间找到一个平衡点。
但彻底解决了乱码问题,丝毫没有影响上下文的对齐,我尝试了接下来的方法后。
这个小把戏我只是过滤掉了低概率的词。
还让我能够优化输出的上下文对齐,这彻底解决了乱码输出的问题。
最终,我的方法在保持输出流畅且语法正确的前提下,略微提升了上下文的对齐。
“eek” 这个标记没有没过门槛,所以我们删除了这个标记。在转换之前,我们得到了正确答案,Olympia。
筛选功能这是在考虑过滤和logit转换后整体函数的样子。
假设 (qN(x)) 是我们要修改的逻辑分布。这里的修改是计算 (qN) 除以 (qM) 的对数,这可以视为某种改变了输出分布,使大型语言模型更“真实”的函数。
现在,处理过滤的过程是通过将概率值低于阈值的logits设置为负无穷来实现的。因此,像在“Washington”之后出现的“eek”这样的非常不可能出现的token会被移除。记住,在我们对logits应用softmax来得到概率分布时,我们使用的是指数函数。所以将任何logit设置为负无穷相当于将该token的概率设为零。
你可以在这里看看过滤阈值是怎么规定的。
基本上,阈值是下一个最有可能的标记的概率的一个比例。这取决于同样可能成为下一个标记的选项数量。这就是为什么我们不能使用固定的阈值,而是根据情况采用一定的比例。
这种特定形式的过滤函数在实践中非常重要,因为没有其他方法能像它那样有效。
这是一个相当有趣且简单的技术应用,它对大型语言模型 (LLM) 的输出质量有着长远的影响。具体来说,当应用某些变换时,这些变换通常只针对高概率的标记起作用,而低概率的标记则需要先消除,然后再调整分布。
我发现这些解码方法很令人兴奋,可以用来改变LLM的行为,但重要的是要认识到,对logits进行转换的方法也有其局限性。虽然这种方法在解决乱码输出方面可能效果不错,为了使输出更加流畅,所需的过滤阈值可能需要根据不同的提示进行调整。这使得制定一个通用的过滤标准变得很困难。
虽然过滤方法在大多数情况下有效,但很难证明它在所有情况下都适用——若想在商业应用中采用,可能需要更多信心。
如果你想了解另一种使用此过滤功能的方法,这篇博客可能会让你感兴趣。
让LLMs更加诚实:数学内容(第二部分)如果您还没读过第一部分,请在这里查看。关注我:LinkedIn|微博 (Twitter)|个人网站