查看原文
其他

给LLM的输入token加权【2023Q4】

孔某人 孔某人的低维认知
2024-08-22

其实这并不是一个很反常的思路,在stable diffusion刚火的时候用户就已经在尝试给各种tag人工加权了。

但这种方式似乎很少被用于LLM,hugging face的transformers库也并未自带该功能。

1、token的加权方式

这里的加权是指为输入的每个token设置一个独立的权重,默认为1,这个权重会在attention的softmax的exp部分计算完之后乘入。起到对于指定的token范围强化(或者削弱)注意力的效果。它最大的好处在于只在inference阶段作用,无需调整训练过程。

如果我们把输入权重设置为正倍数,那么这约等于在输入prompt中将该部分重复多次。这两者仍有一些差异:

  • 多次重复的插入会影响输入token序列的位置编码。

  • 多次重复指令会在prompt中引入新的token排列细节模式,可能被LLM所感知。而这种模式所关联的相关性一般是我们所不希望的。

  • 多次重复指令会导致token的某种程度浪费。

目前LLM对于输入的token序列的排列细节(这里的细节是相对于语义来说)较为敏感的问题仍然尚未解决。在本场景下我们也要注意在通过加权增强语义的同时,也增强了对于排列细节的影响,而这是我们不希望看到的。最好是只强化语义,而不强化token排列细节。

如果是多次重复的方式,我们可以使用几种不同的表达方式,进行语义重复,而非token级别重复。但在token加权上则没有很自然的方式。可以采用:指令[w/3] 指令[w/3] 指令[w/3]的方式,其中三部分指令语义相同,但措辞方式有差异,w是原本我们希望设置的权重,这里由于不同的措辞方式而拆成了3分。在一些不是追求很完美的场景下,简单对一种措辞方式进行加权也是可以的。

目前已经发现LLM会自动利用前几个token去做一些其他用处,所以token调权的范围应该避开前几个token,在这里放一些空格来把system prompt推迟到后续位置就好。

当然在语义层面进行强调,例如“这对我很重要”等也是可以起到强化效果的,但本方法与此是正交的,可以同时使用。

2、用处

不少人对于对token序列加权这种方式的用处表示怀疑,毕竟现在用户连好的prompt写作手法都还没学会,哪会想到给输入加权?

但从LLM基座公司和应用开发者的角度,这个方式就有一个自然的用途:强化指令。无论是在system prompt,还是在应用的prompt模板中,开发者明确的知道自己想要强调什么。

考虑到现在模型的system prompt效果和指令遵从的成功率,这不失为一个值得一试的方式。

甚至都可以反过来:基座模型公司在训练时,给system prompt弱化的权重,这样得到的模型在接受正常权重的用户输入时,就相当于给system prompt做了强化。

当给LLM的输入在语义上有更复杂的结构时(例如类似对抗SQL注入的Prepared Statement等),基于这些结构更容易遇到需要强调的部分。LLM输入这种复杂结构方面的细节后续会再开文章单独讨论。

交流与合作

如果希望和我交流讨论,或参与相关的讨论群,或者建立合作,请私信联系,见 联系方式

希望留言可以知乎对应文章下留言

本文于2023.11.27首发于微信公众号与知乎。

知乎链接 https://zhuanlan.zhihu.com/p/669070518

个人观点,仅供参考
修改于
继续滑动看下一个
孔某人的低维认知
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存