给LLM的输入token加权【2023Q4】
其实这并不是一个很反常的思路,在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