让大模型输出更靠谱,我用了这个简单的小妙招就好了

2024/12/13 21:03:20

本文主要是介绍让大模型输出更靠谱,我用了这个简单的小妙招就好了,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

要是早些时候就知道这个技巧就好了。

我去年夏天在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的概率设为零。

你可以在这里看看过滤阈值是怎么规定的。

基本上,阈值是下一个最有可能的标记的概率的一个比例。这取决于同样可能成为下一个标记的选项数量。这就是为什么我们不能使用固定的阈值,而是根据情况采用一定的比例。

这种特定形式的过滤函数在实践中非常重要,因为没有其他方法能像它那样有效。

  • 一组概率最高的 token(例如,前 10 个概率最高的 token)
  • 一个固定的阈值(例如,0.1)
最终想法与局限性

这是一个相当有趣且简单的技术应用,它对大型语言模型 (LLM) 的输出质量有着长远的影响。具体来说,当应用某些变换时,这些变换通常只针对高概率的标记起作用,而低概率的标记则需要先消除,然后再调整分布。

我发现这些解码方法很令人兴奋,可以用来改变LLM的行为,但重要的是要认识到,对logits进行转换的方法也有其局限性。虽然这种方法在解决乱码输出方面可能效果不错,为了使输出更加流畅,所需的过滤阈值可能需要根据不同的提示进行调整。这使得制定一个通用的过滤标准变得很困难。

虽然过滤方法在大多数情况下有效,但很难证明它在所有情况下都适用——若想在商业应用中采用,可能需要更多信心。

如果你想了解另一种使用此过滤功能的方法,这篇博客可能会让你感兴趣。

让LLMs更加诚实:数学内容(第二部分)如果您还没读过第一部分,请在这里查看。

关注我:LinkedIn|微博 (Twitter)|个人网站



这篇关于让大模型输出更靠谱,我用了这个简单的小妙招就好了的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程