包阅导读总结
1. 混合专家模型、ACL 2024、研究进展、方法、动机
2. 本文介绍了 ACL 2024 中混合专家模型(MoE)的最新研究进展,包括相关论文的动机、方法和有趣发现,涵盖增加专家数量、动态路由、共享专家等方法,以及为提高效率和性能所做的各种探索。
3.
– 总体介绍
– ACL 2024 中关于混合专家模型的论文梳理
– 具体论文
– DeepSeekMoE
– 动机:专家不够分化和有冗余
– 方法:增加专家数量、拆分专家
– 现象:特定参数下性能出色,比其他模型激活更少参数有更好性能
– Harder Tasks Need More Experts
– 动机:简单任务和复杂任务所需专家数量不同
– 方法:基于阈值的动态路由
– 发现:推理时平均每个token激活专家数量不超2,下游任务效果好
– XMoE
– 动机:FFN存在计算浪费和冗余知识
– 分析:缩小专家效果、稠密训练和稀疏计算
– HyperMoE
– 动机:让专家互帮互助且不增加计算负担
– 方法:利用未选专家生成矩阵辅助计算
– Not All Experts are Equal
– 动机:节省空间和提高推理速度
– 方法:expert pruning 和 dynamic expert skipping
– 其他
– 多模态多任务学习存在任务干扰
– 专家分化可针对不同任务微调不同专家
思维导图:
文章地址:https://mp.weixin.qq.com/s/SXsG7B42q2hruNo7myzL2Q
文章来源:mp.weixin.qq.com
作者:大模型智能
发布时间:2024/8/14 15:16
语言:中文
总字数:5225字
预计阅读时间:21分钟
评分:88分
标签:混合专家模型(MoE),专家分化,动态路由,参数效率,大语言模型
以下为原文内容
本内容来源于用户推荐转载,旨在分享知识与观点,如有侵权请联系删除 联系邮箱 media@ilingban.com
最近 ACL 2024 论文放榜,扫了下,SMoE(稀疏混合专家)的论文不算多,这里就仔细梳理一下,包括动机、方法、有趣的发现,方便大家不看论文也能了解的七七八八,剩下只需要感兴趣再看就好。
下面是列表,顺序大抵是个人兴趣程度排序。
1. DeepSeekMoE: Towards Ultimate Expert Specialization in Mixture-of-Experts Language Models
2. Harder Tasks Need More Experts: Dynamic Routing in MoE Models
3. XMoE: Sparse Models with Fine-grained and Adaptive Expert Selection
4. HyperMoE: Towards Better Mixture of Experts via Transferring Among Experts
5. Not All Experts are Equal: Efficient Expert Pruning and Skipping for Mixture-of-Experts Large Language Models
6. Multimodal Instruction Tuning with Conditional Mixture of LoRA
1. Let the Expert Stick to His Last: Expert-Specialized Fine-Tuning for Sparse Architectural Large Language Models
2.2 方法
碎碎念:实际上,计算量还是有变化的。路由模块 原本从 N 个专家里面选择 1 个,现在要从 2N 里选择 2 个。如何快速计算专家的分数,如何快速排序,如何快速分发数据,还是有点讲究的。
碎碎念:实际上,正如文章所指出的,deepspeedmoe 在 22 年提出了这个设计。
有趣的现象:
-
在参数是 1.89B 时,DeepseekMoE 只用 0.24B 的参数,它的性能和 用上全部参数的 dense 模型不分伯仲。
-
和同样是 MoE 结构的 GShard 比,拆分专家可以使得模型激活更少的参数取得更好的性能。
2.1 动机
2.2 方法
举个例子,假如有场考试,我们的目标是拿到分数超过 60 分及格就好,那么为了速通考试,我们只需要挑选分值最大的题目做,做到总分超过 60,就可以尽快离场了。如果有个题目分值超过 60 分,那么只做一道题就行,这就是 top-1 了。
2.3 发现
-
在推理时,平均每个 token 激活的专家数量不超过 2 —— 应该损失函数的功劳吧。 -
在下游任务上,效果居然还比 top-2 好 —— 我猜测或许是训练初期每个 token 选了很多专家(>2,来自 Figure 3),间接让每个专家多训练了。 -
底层用到的专家更多,甚至会用 4 个,高层反而 1 个就够。 -
subtoken —— 那些 tokenize 之后的碎片 —— 需要的专家更多,还挺有趣,但不知道意味着什么。
3.1 动机
-
以前的工作发现,当 relu 是激活函数时,输出的向量有 80% 的元素是 0,这意味着第二个矩阵乘法有严重的计算浪费。 -
这个现象在 MoE 模型也存在,而且随着专家数量增大,浪费增加 —— 是不是有点像 deepseekmoe 的第一个动机。本文提出,参考以往工作,FFN 可以看成 memory network。浪费意味着有冗余的知识。类似于去图书馆,有很多没用的书。 -
然而, 缩小专家之后,每个 token 选几个专家呢?多了浪费,少了性能下降。
3.2 分析
-
缩的越小,效果越好,但是后面几乎没有增长。举个例子,缩小 8 倍时,只用先前一半的计算量,效果还更好。 -
其实,dense 模型,也可以当做混合专家来训练。具体来说,可以把 dense 模型看成仅有一个 FFN 的 MoE 特例,然后拆成好几个小专家,训练时把阈值设置为 1—— 也就是选择所有专家才能满足——从而稠密训练。测试时可以调低阈值,实现稀疏计算。结果发现,又快又好。有趣,建议推广。 -
拆的越小,relu,甚至 gelu 之后大于 0 的比例越大 —— 参数被更有效的利用了,符合动机。 -
一味的缩小不可取。这是因为专家数量越多,路由上花的时间显著增加,路由模块的加速或许也必要。
碎碎念:如果专家继续缩小下去,就变成一个专家只有一个向量了,这很像 Large Memory Layers with Product Keys, 19 NIPS,需要特殊方法来加速路由过程。
碎碎念:顺带一提,Adaptive Gating in Mixture-of-Experts based Language Models, 23 EMNLP 也是做动态路由的,但是只支持 top-1 和 top-2 的切换。
4.1 动机
碎碎念:咱不了解多任务学习,所以不好评价。就事论事,2)这一点还是挺有吸引力的。
4.2 方法
防止在细节中迷失,这里给出一句话摘要:根据没用上的剩下 7 个专家,生成出 2 个矩阵,然后把 token 和这两个矩阵相乘,得到一个输出向量。
-
每层的每个专家都有一个相对应的 expert embedding,标记为 ,维度是 。因为每层有 8 个专家,所有 8 个 。这个 是随机初始化的。 -
对于每个 token,它会选择一个专家,这意味着剩下有 7 个专家没用。这 7 个专家的 相加,为了省事,相加得到的向量还是标记为 。 -
用一个双层 MLP,把 处理一下,变成 ,叫做 selection embedding。 -
每一层还有一个 layer embedding,标记为 ,维度是 。 -
把 和 拼在一起,然后,i)和一个大矩阵相乘,得到 W_1,维度是 ,ii)和另一个大矩阵相乘,得到 W_2,维度是 。 -
好的,终于最后一步了,把输入 token,标记为 ,进行 的操作。
4.3 吐槽
5.1 动机
-
MoE 有很多专家,就算不用的话,那还是要占空间的。为了省空间,可以在部署前删掉! -
MoE 的专家不是同样重要。不重要的在推理时跳过,这样推理速度更快。
5.2 方法
5.3 效果
6.2 方法
-
lora 本来是 两个小矩阵 A、B合成 一个大矩阵 W,即 W=BA。 -
这里变成两个向量,a、b,通过外积合成出一个矩阵 W。
碎碎念:这种 vector 当做 moe 专家的做法,让我联想到了 Pushing Mixture of Experts to the Limit: Extremely Parameter Efficient MoE for Instruction Tuning, iclr 24,虽然记不太清了,隐约感觉挺像的。
7.1 动机
-
参数高效的微调 (PEFT)在 MoE 模型上还没有充分研究。
7.2 方法
-
那些使用了小专家的 MoE 模型(deepseek-moe, XMoE)的专家很分化。 -
因此不同的任务可以 finetune 不同的专家。
-
从这个任务中随机选择若干个 sample,用来拼接出长度 4096 的 32 个新 sample。 -
把这 32 个 sample 送到 MoE 模型里前向传播,同时记录些信息,用来给每层的每个专家打分。(打分方式有两种,等会讲。) -
根据打分,还有一个超参数 threshold,选择分数最高的那些专家,使得这些专家的打分之和大于 threshold。(熟悉的感觉) -
只微调这些专家的参数,其他固定不变 —— 个人理解,即便某个专家被激活了,但如果不在微调的专家列表里,就不会被梯度传播。
碎碎念:论文给第一种方法设置的阈值是 0.2, 第二种是 0.1。喂,这是不是也太小了啊。但是论文说,“The average number of experts used per task across layers ranges from 2 to 15 out of 66”,所以说,即便阈值只有 0.1,也需要至少 2 个专家才能达到?路由模块的置信度这么低?
7.3 实验
碎碎念:有一说一,如果用上 论文 2,3 的基于阈值的路由的话,本身路由模块已经进行了专家的相关度的筛选。是不是可以考虑结合一下呢?
扫描二维码添加小助手微信