
这是对原始 Cognitive Fusion 的更新。我们计划对其进行微调以提升性能。
与 NeuralNovel 合作打造 🤝
模型规模是提升模型质量的最重要因素之一。在计算资源固定的情况下,训练一个更大的模型但步数更少,比训练一个更小的模型但步数更多效果更好。
混合专家模型(MoE)使模型能够以低得多的计算资源进行预训练,这意味着在与密集型模型相同的计算预算下,你可以显著扩大模型或数据集的规模。特别是,MoE 模型在预训练过程中应该能比其对应的密集型模型更快地达到相同的质量。
那么,MoE 究竟是什么?在 transformer 模型的语境下,MoE 由两个主要部分组成:
稀疏 MoE 层取代了密集的前馈网络(FFN)层。MoE 层具有一定数量的“专家”(例如,在我的“frankenMoE”中有 32 个),其中每个专家都是一个神经网络。实际上,这些专家通常是 FFN,但它们也可以是更复杂的网络,甚至本身就是一个 MoE,从而形成层级化的 MoE!
一个门控网络或路由网络,用于决定哪些令牌被发送到哪个专家。例如,在下图中,令牌“More”被发送到第二个专家,而令牌“Parameters”被发送到第一个网络。稍后我们将探讨,可以将一个令牌发送给多个专家。如何将令牌路由到专家是使用 MoE 时的关键决策之一——路由网络由可学习的参数组成,并与网络的其余部分同时进行预训练。在每一层,对于每个令牌,路由网络会选择其中两个组(即“专家”)来处理该令牌,并将它们的输出进行累加组合。

切换层 Switch Transformers 论文 中的 MoE 层
因此,总结一下,在 MoE 中,我们将 transformer 模型的每个 FFN 层替换为一个 MoE 层,该 MoE 层由一个门控网络和一定数量的专家组成。
尽管 MoE 相比密集型模型具有预训练高效和推理速度更快等优势,但它们也面临一些挑战:
训练:MoE 能够显著提高预训练的计算效率,但历史上它们在微调阶段难以泛化,容易导致过拟合。 推理:尽管 MoE 可能拥有大量参数,但在推理过程中仅使用其中的一部分。这使得其推理速度比具有相同参数数量的密集型模型快得多。然而,所有参数都需要加载到 RAM 中,因此内存需求较高。例如,对于像 Mixtral 8x7B 这样的 MoE,我们需要有足够的 VRAM 来容纳一个密集的 470 亿参数模型。为什么是 470 亿参数而不是 8 x 70 亿 = 560 亿?这是因为在 MoE 模型中,只有 FFN 层被视为独立的专家,模型的其余参数是共享的。同时,假设每个令牌仅使用两个专家,推理速度(FLOPs)就像使用一个 120 亿参数的模型(而不是 140 亿参数的模型),因为它计算 2 次 70 亿参数的矩阵乘法,但有一些层是共享的(这一点我们很快会详细说明)。
如果我们所有的令牌都只被发送到少数几个热门专家,那将导致训练效率低下。在正常的 MoE 训练中,门控网络会收敛到主要激活相同的少数几个专家。这会形成自我强化,因为受青睐的专家训练得更快,因此被选中的次数也更多。为了缓解这个问题,会添加一个辅助损失来鼓励给予所有专家同等的重要性。这种损失确保所有专家接收大致相等数量的训练样本。以下部分还将探讨专家容量的概念,它引入了一个专家可以处理的令牌数量阈值。在 transformers 中,辅助损失通过 aux_loss 参数公开。
MoE与“科学怪人MoE”的区别在于,此仓库中这类模型的路由层并非同步训练。