
你理解的控制LLM幻觉的方法可能是错的
那什么是粗暴的控制LLM的幻觉的方法呢?
正常你们大家学到的应该是
temperature=0
top_k=1
top_p=0.1类似这种的但是这种是不是能解决幻觉呢?很显然在做的各位试过,应该是没什么效果的。为什么呢?
正常来讲,我们不是把生成next token的概率放到最大的那个token上了吗?
今天先回忆个概念LLM是靠什么来决定next_token生成的,
就是Logit,就是softmax你的前向计算的最后一层(这么表达不精确,但是你可以认为就算最后一层了)
过了output之后呢?要和词表做一个矩阵乘,得到一个logit,但是这个不能直接用,需要给softmax转换为对应词的概率,就是我刚才的公式
(不理解transformer架构的兄弟可以参考我以前的博文,草履虫也能学懂得Transformer系列
https://mp.weixin.qq.com/s/Qi9-SqTGk5yHkF0WQ1CdYQ?token=1866303267&lang=en_US
如果志在玩大模型,至少目前Transformer还是绕不开的基础)
1- 为什么temperature要设置低
温度采样是一种基本技术,可控制 token 选择的随机性。它的工作原理是在应用 softmax 函数之前缩放 logits(未归一化的预测分数)。
其中:P(xi)是选择 token ii的概率,Z i是选择token ii的 logit,T就是温度参数了
较低的温度(T < 1)使分布更加尖锐,倾向于高概率 token。较高的温度(T > 1)会使分布变平,增加选择较低概率 token 的机会。
2- TOP P 和K 呢?
这就不仔细讲了,TOP是核采样,就是排序计算累加概率,知道累加概率超过p剩下的就不要了,然后归一化,从里面选出来TOPK 不用说了把,选K个归一化。
一般的理解认为,如果把上述的设置都设置为最严格的,比如设置topK=0,TOP_P=1, 先把这两个参数废掉,然后temperature=0.0 就应该是绝对无幻觉的答案了,如文章开头说的,事实上是不行的,下面讲一下为什么?因为LLM还有两个比较关键的概念,当然你也可以说这俩概念是人为加上的,引入这些概念的就是entropix采样:
第一个注意力熵entropy:
理解语言模型中的熵
在语言模型的上下文中,熵衡量模型预测中的不确定性或随机性。它量化了概率分布在可能的下一个 token 上的分散程度。
其中 pi是第 i 个 token 的概率。
较高的熵值表示模型对下一个 token 不确定,概率分布在许多选项上。相反,较低的熵表示模型更有信心,概率集中在较少的 token 上。
注意力熵方差 (Varentropy)
熵方差(Varentropy),或熵的方差,衡量了在单个位置上,不同可能的 token 之间的信息内容(惊奇度)变化有多大。它提供了对模型不确定性和其对给定上下文的预测多样性的洞察。
熵方差的计算涉及以下步骤:
步骤 1:计算概率和对数概率
使用 softmax 计算当前位置上每个可能的 token 的概率,并计算它们的对数概率。
步骤 2:计算熵
计算当前位置概率分布的熵。
步骤 3:计算熵方差
对于每个可能的 token,计算其信息内容(负对数概率)与平均信息内容(熵)之间的平方差。用它们的概率加权这些差异并将它们加总。
熵方差在识别模型正在考虑惊奇度水平非常不同的 token 的情况时特别有用。高熵方差可能表明上下文复杂或模糊,模型的预测更加多样化或不确定。
在采样决策中的意义
熵和熵方差的组合在 Entropix 的采样策略中起着至关重要的作用。以下是它们如何影响决策过程:
- 低熵,低熵方差:表示高置信度和一致性。Entropix 在这些情况下可能会使用贪婪采样。
- 高熵,低熵方差:表明一致的不确定性。这可能会触发插入澄清(clarification insertion)或增加探索。
- 低熵,高熵方差:表示不同程度的置信度。Entropix 可能会采用探索采样来调查不同的可能性。
- 高熵,高熵方差:代表高度不确定性和不一致性。这种情况通常会导致使用调整参数的高不确定性采样。
在 Transformer 模型中,注意力通常以多头注意力(multi-head attention)的形式实现。这意味着注意力机制并行应用多次,允许模型同时关注输入的各个不同方面。
Transformer 模型中的每个注意力头计算一组注意力分数,确定在生成每个输出 token 时,要将多少注意力放在输入的不同部分。
注意力熵用于量化注意力在不同 token 上的不确定性或分散程度。
较高的注意力熵表示模型的注意力分散在许多 token 上,而较低的熵表示模型专注于少数特定的 token。
而如果分散在许多token上,也就是所谓的熵分散,代表模型此时根本不知道哪个token更合适
这个时候你比如temperature=0.0,你是选择了一个所谓概率最高的,但是你其实也限制了模型探索的能力,这也是幻觉可能产生的开始
注意力一致性 (Agreement)
注意力一致性衡量不同注意力头之间的注意力模式的一致程度。它通过将每个头的注意力分布与平均注意力分布进行比较来计算
较低的一致性表明不同的头正在关注输入的各个不同方面,这可能表明上下文复杂或模糊。
这是第二个引入幻觉的可能性,因为上下文的理解不确认
我们今天介绍的Entropix 使用这些基于注意力的指标来指导其采样决策。例如:
- 较高的注意力熵可能导致采样中增加探索。
- 较低的注意力一致性可能导致温度或 top-k 参数的调整。
所以大家基本就能看明白了,如果模型不确认哪个token最优,那就增加一些探索的可能性,比如对上下文模糊,那就动态调整模型的配置参数
交互强度 (Interaction Strength)
交互强度定义为 Transformer 模型中所有层、头和位置的注意力分数的绝对值的平均值。在数学上,它可以表示为:
L代表层数,H是注意力头,N是序列长度,Alhji就是第l层第h头种从位置i到位置j的注意力分数
较高的交互强度值表示序列中 token 之间存在更强的关系
交互强度在 Entropix 的自适应采样过程中起着至关重要的作用。它影响采样策略的几个关键方面:
- 温度调整:较高的交互强度可能导致温度升高,当 token 之间连接紧密时,促进更多样化的输出。
- Top-k 参数:交互强度用于动态调整 top-k 参数,从而根据 token 关系的强度允许更多或更少的候选 token。
- 探索与利用:在交互强度较高的场景中,采样策略可能会倾向于更具探索性的行为,以捕获 token 之间复杂的联系。
说白了,我token之间交互强度高,证明我们之间的注意力更高,需要输出更多元化,人话说就是更多探索路径,来捕捉复杂的注意力
下面是entropix的完整采样过程:
如上图所示
数据流和决策过程
Entropix 系统在文本生成过程中遵循特定的流程:
步骤 1:Token 生成
语言模型处理输入 token 并生成 logits 和注意力分数。
步骤 2:指标计算
指标计算器基于模型输出计算熵、熵方差、注意力熵、注意力一致性和交互强度。
步骤 3:策略选择
自适应采样器分析计算出的指标,并选择最合适的采样策略。
步骤 4:参数调整
根据选择的策略和指标,动态调整采样参数(温度、top-k、top-p、min-p)。
步骤 5:Token 采样
应用选择的采样策略来选择下一个 token。
步骤 6:迭代
从步骤 1 开始重复该过程,并加入新生成的 token。
采样策略
Entropix 采样方法的核心是其策略选择逻辑。该系统持续评估模型的输出指标,并为每个 token 生成步骤选择最合适的采样方法。
自适应采样
当 logits 的熵和熵方差没有落入极端类别时(与触发专门采样技术的场景不同),自适应采样策略就会启动。它旨在平衡探索和利用,适应当前的上下文和模型状态。
自适应采样过程
步骤 1:计算指标
首先,模型的 logits 和注意力分数中计算各种指标:
- Logits 熵和熵方差
- 注意力熵和熵方差
- 注意力一致性
- 交互强度
步骤 2:调整采样参数
基于这些指标,动态调整采样参数:
- 温度
- Top-p(核采样阈值)
- Top-k
- 最小概率阈值 (min_p)
步骤 3:生成多个样本
使用调整后的参数生成多个候选 token。样本数量是可配置的,默认为 12。(现在不是流行带搜索的中间过程吗,你可以理解为带搜索的token生成)。
步骤 4:样本评分
每个样本都根据两个因素评分:
- 来自模型 logits 的对数概率
- 从计算出的指标导出的置信度分数
步骤 5:选择最佳样本
得分最高的样本被选为最终输出 token。
生成多个样本后,每个样本都使用对数概率和置信度分数的组合进行评分:
def score_sample(sample):
log_prob = jnp.sum(jax.nn.log_softmax(logits) * jax.nn.one_hot(sample, logits.shape[-1]))
confidence_score = (
(1 - metrics["logits_entropy"]) * 0.1 +
(1 - metrics["attn_entropy"]) * 0.2 +
(1 - metrics["logits_varentropy"]) * 0.3 +
(1 - metrics["attn_varentropy"]) * 0.4 +
metrics["agreement"] * 0.5 +
metrics["interaction_strength"] * 0.6
)
return log_prob + confidence_score
此评分函数平衡了 token 的可能性(log_prob)和从各种指标导出的置信度度量。置信度分数中每个组件的权重可以根据经验结果进行调整。
现在回到最开始我们说的集中情况来分析:
1-如果熵和熵方差都非常低时,模型对其预测非常有信心。在这种情况下,使用贪婪采样,说白了模型知道它在干什么,它对自己的答案也足够确认,那就选择概率最高的,就是标准的logit。
2- 如果熵高,但是熵方差低,证明模型是不确定的,但是其不确定性是一致的,所以需要澄清,这个澄清就是以特殊token的形式。
如果插入了澄清token,那么下一个token就会动态调整temperature,用更高的温度拿到更大的多样性,来进行采样,找到最合理的token!
其实某种程度上有点像李飞飞的S1的wait token。
3- 另外如果,模型熵很低,证明它很确认,但是熵的方差高,就证明它本身就看到了很多不同的可能性,那采样的temperature就直接升高(基于交互强度指标)就可以了,top k当然也顺手就给升了。
4- 如果熵和熵方差都高,记忆是又不确定,又看到了好多的可能性,那就直接下猛药,但是其实和3的请款一样,也是升temperature,但是是基于熵方差的强度来调整temperature,而不是注意力一致性,另外此时因为熵升高,所以要降低top-p的参数来让它收敛。
这就是entropix的思路,通过动态的采样参数和澄清token来实现fitting化的采样保证模型的输出更合理化,更少幻觉,其实entropix的思路在OAI的o系列是有引入类似的概念的。
比如你们使用o系列api就会发现一个申请的问题,temperature和top p k都不允许设置
原因就是来自于这,所以大家理解了为什么temperature=0.0和有没有幻觉并没有本质联系的原因了吗?
本文转载自熵减AI,作者:周博洋
