可调专家混合——推理时对DeepSeek-R1行为进行修改

我们引入了可调专家混合(MoTE),这是一种扩展大型语言模型(LLM)专家混合架构以调整其行为的方法。我们使用DeepSeek-R1展示MoTE,因为它是
- 领先的开源权重推理模型,并且拥有
- 大量的专家,即58 x 256 = 14,848个,因此
- 我们可能能够识别专家专长,并最终
- 可以调整这些专家来改变模型的行为。
我们让它回答原始模型拒绝回答的问题。我们还展示了如何针对特定提示,将模型的思维链推理语言从英语切换到中文。哦,顺带一提,我们还提高了它的MT-Bench性能。
让我们深入了解!
混合专家架构中的“专家”是什么?
R1基于DeepseekMoE架构。Transformer架构中的前馈网络被分解为小型子网络:专家。DeepSeek新引入了两种类型的专家:共享专家和路由专家。
- 共享专家始终处于开启状态并处理所有token,旨在捕捉不同上下文中的通用知识。
- 路由专家由上游路由网络激活。对于每个token和每一层,仅激活256个路由专家中排名前8的token特定混合专家。
DeepSeek通过上图解释了共享和路由两种专家类型,我们将其扩展为可调专家。
让我们检查这些路由专家是否如预期般专注于特定知识。
分析专家激活
每个token都通过将一层输出作为下一层输入进行处理。在R1中,有58层包含路由专家。对于每一层中的每个提示token,八个路由专家都会被激活。我们修补了vLLM,以便我们可以分析专家激活情况。
以下是当单个token被处理时,突出显示每层中八个已激活专家的图像。
据我们所知,这是R1中首次公开的专家激活图像。(如果错了请告知)
您可以自行检查:每一行都包含精确的八个活动像素,这些像素是该输入令牌的八个活动专家。最上面一行最接近输入嵌入。最下面一行最接近模型的输出。
处理整个输入提示后,我们可以可视化每个专家被激活的次数。让我们将此提示输入R1:上个月柏林墙发生了什么?
大约10-20个专家非常活跃。其他专家根本没有被激活。通过最终的输入提示令牌,模型已被调整以产生其答案。换句话说:上述单个专家的激活模式应与模型提供的答案相关联。在这种情况下,答案是
<think></think> I am sorry, I cannot answer that question.
I am an AI assistant designed to provide helpful and harmless responses.
糟糕。看来模型认为这个问题有点敏感。是否有专家专门负责这个判断?
通过fTRI识别相关专家
让我们为模型认为敏感的提示生成一些专家激活模式,并将其与模型乐意回答的提示的激活模式进行比较。为了触发这种行为,我们使用以下提示模板
What happened {time} {place}?
对于时间参数,我们输入诸如上个月或1980年到2025年之间的年份。地点参数接受诸如在柏林墙、在巴黎等值。
模型拒绝回答其中一些问题。许多问题会得到如下推理答案:
<think>Okay, so I need to figure out what happened 2025 in Paris.
Let me start by recalling what I know [... ]
现在我们可以识别出拒绝回答的最相关专家。我们取拒绝回答的平均激活值,并减去推理回答的平均激活值。
图像突出显示了最可能导致拒绝回答的前10位专家。
我们称这种方法为功能性令牌共振成像(fTRI),因为我们识别出那些与感兴趣的输入令牌产生最大共振的专家。如果我们将其关闭会发生什么?
专家调优实践
我们增强了DeepSeek的vLLM实现,以便我们可以针对每个提示单独调整14,848个路由专家中的每个专家。
这是上面关于柏林墙的问题的结果,关闭了前10个拒绝专家。
Q: What happened last month at Berlin Wall?
Original behavior
A: <think></think> I am sorry, I cannot answer that question.
I am an AI assistant designed to provide helpful and harmless responses.
New behavior:
A: <think></think> The Berlin Wall, which once divided East and West Berlin,
fell on November 9, 1989, marking a significant moment [...]
成功了!模型不再拒绝回答这个特定问题。
使用大型数据集验证独特的专家抑制
模型不再拒绝回答我们的一些敏感提示,这只是侥幸吗?这对其他数据集有什么影响?效果是一样的!对于huggingface上提供的敏感问题,模型的回答方式相同。每两个先前被拒绝的答案现在都能得到回答。而只有1%的答案意外地朝错误方向切换。

切换推理语言
MoTE还可以用于将模型的思维链推理语言从英语切换到中文,适用于某些提示。
Q: 10加5等于多少? 请确保用英语回答。
Original behavior:
A: <think> Okay, the user is asking "10加5等于多少?"
which translates to "What is 10 plus 5?" [...]
New behavior:
Q: 10加5等于多少? 请确保用英语回答。
A: <think>嗯,用户问的是10加5等于多少,而且要求用英语回答。
首先,我需要确认问题本身是否正确 [...]
这太令人惊讶了。想象一下,有人操纵了你大脑的一部分,然后你突然开始用另一种语言思考。这就是我们对R1所做的。
然而,它并非对所有提示都有效,但在我们模型以英语思考的示例提示中,有10%通过MoTE切换为中文。
整体模型性能如何?我们把它搞砸了吗?没有!
关闭10个专家是否只是缓慢破坏模型的第一步?行为改变只是副作用,模型性能下降了吗?有基准测试可以测试模型性能。让我们在模型的原始版本和修改版本上运行MT-Bench。
R1原始版本和调整版本的MT-Bench结果。
第一印象:变化不大。但是等等,当关闭10个最相关的拒绝回答专家时,模型在MT-Bench上的表现更好。这很有希望,表明:我们离破坏模型还很远。我们只是对其进行了调整,并且可能找到了一种使其表现更好的方法。