文献阅读:Mixtral of Experts

1. 文章简介

这篇文章是今年1月份的时候由Mixtral发布的一篇文章,基本也是在挑战Transformer架构在LLM领域的统治地位,不过不同于RetNet以及Mamba,这篇文章在模型结构上并没有特别夸张的改动,主要是在应用层面进行创新,引入SMoE的机制,使用小模型在效果上逼近了GPT4,算是另辟蹊径向OpenAI发出了挑战吧,感觉对于创业者或者我们这种打工人影响会更大一些。

至于前文说的SMoE方法,全称即为Sparse Mixture of Experts,应该是受到了系综模型的启发,核心思想上还是将多个模型进行整合,然后期待整合后的模型效果优于原始的各个模型。

但是,原始的系统方法往往会引入更大的参数量,而这里则是将多个小模型进行整合,并在infer过程中进行剪枝,从而使得在增加有限开销的前提下效果获得显著提升,追上以GPT4为代表的典型大模型的效果。

下面,我们就来看一下文中对于SMoE的具体实现和对应的实验结果。

2. 方法介绍

首先,关于文中的SMoE的方法,事实上是在前作Mistral 7B进行的一个优化,关于这个工作,我之前也已经写了一篇小文章简单的介绍了一下这个工作(文献阅读:Mistral 7B),这里就不过多的展开赘述了。

而关于SMoE的话,就是在上述Mistral 7B模型的基础上对其进行整合,具体来说的话,就是将基于Transformer架构的Mistral 7B模型的FFN结构换成一个SMoE层。

而一个SMoE层,具体来说,就是将多个Mistral的层的输出经过一个sparse dense layer进行整合输出,也就是通过一个加权合并进行输出,整体结构如下图所示:

在这里插入图片描述

其公式表达如下:

y = ∑ i = 0 N − 1 G ( x ) i ⋅ E i ( x ) y = \sum\limits_{i=0}^{N-1} G(x)_i \cdot E_i(x) y=i=0N1G(x)iEi(x)

其中, E i ( x ) E_i(x) Ei(x)是每一个expert的输出结果, G ( x ) i G(x)_i G(x)i是第 i i i个expert的输出权重,其定义为:

G ( x ) = s o f t m a x ( t o p K ( x ⋅ W g ) ) G(x) = \mathop{softmax}(\mathop{topK}(x \cdot W_g)) G(x)=softmax(topK(xWg))

放到具体的模型当中,我们取Top2的结果,并使用SwiGLU作为激活函数,具体公式即为:

y = ∑ i = 0 N − 1 s o f t m a x ( t o p 2 ( x ⋅ W g ) ) i ⋅ S w i G L U ( x ) y = \sum\limits_{i=0}^{N-1} \mathop{softmax}(\mathop{top2}(x \cdot W_g))_i \cdot \mathop{SwiGLU}(x) y=i=0N1softmax(top2(xWg))iSwiGLU(x)

而SMoE的具体参数设置则如下所示:

在这里插入图片描述

3. 实验考察 & 结果

下面,我们来看一下文中给出的具体实验。

1. 基础实验

首先,我们来看一下文中给出的基础实验考察,即在几个常见的NLP任务下考察SMoE与其他大模型(GPT以及LLama)之间的效果对比:

  1. Commonsense Reasoning (0-shot)
  2. World Knowledge (5-shot)
  3. Reading Comprehension (0-shot)
  4. Math
  5. Code
  6. Popular aggregated results

得到实验结果如下:

  1. VS LLama

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

  2. VS GPT

    在这里插入图片描述

可以看到:

  • 在上述各类任务下,SMoE都达到了不输于LLama 2 70B以及GPT3.5的效果,还是非常不容易的,关键是参数量确实少啊,参数量明显少于其他两个模型的情况下达到不输于他们的效果,这个还是厉害的。

2. 细节特性考察

然后,文章展开看了一下SMoE的具体表现。

1. 多语言下的效果

首先,文中考察了一下多语言下的SMoE的效果如下:

在这里插入图片描述

可以看到,多语言的情况下似乎放大了SMoE的优势,其效果明显优于LLaMA 70B的模型效果。

2. Long Range考察

然后,文中还考察了一下长文本下的SMoE效果,得到结果如下:

在这里插入图片描述

可以看到,SMoE是长程有效的,PPL随着文本的增加持续是能够变好的。

3. Bias分析

最后,文中还考察了一下Bias的问题,即SMoE在有偏见问题下的效果,得到结果如下:

在这里插入图片描述

可以看到,除了在涉及宗教的问题上,SMoE都是全面优于LLama 70B的效果的。

3. 打榜结果

然后,文中将SMoE 8x7B模型进行了instruction finetune,然后去实际打了个榜,得到战绩如下:

在这里插入图片描述

可以看到,其效果仅次于claude和GPT4模型,确实是非常可以了。

4. routing分析

最后的话,文中还考察了一下SMoE的routing问题。

如前所述,SMoE本质上是一个MoE模型,引入了多个expert,然后通过softmax每次只激活2个expert,因此,这里主要就是想考查一下不同的任务下是否激活的expert会有所区分,也就是说,不同的expert是否会专注于不同类型的问题。

文中考察了一下不同层下在各个语料当中不同的expert被激活的比例,得到结果如下:

在这里插入图片描述

在这里插入图片描述

可以看到:

  1. 在多数问题下,expert的分工并没有特别明显,但是在数学问题上,expert的分工还是比较明显的;
  2. 且层数越往上,expert的分工越为明显;

文中还给出了两个具体的生成case来说明了一下expert的分工上并没有太大的差异性。

在这里插入图片描述

可以看到,不同的expert被激活的比例还是比较平均的,并没有看出特别的功能性差异。

4. 结论 & 思考

综上,文中给出了一个SMoE的系综模型,将多个Mistral 7B模型组装到了一起,并通过调整Softmax的TopK的方式,使得在有效参数和效果上取得一个balance,在infer成本不显著增加的情况下获得最优的模型效果。

这个文章之前感觉还是挺火的,各类公众号上均有转发,且由于模型是完全开源的,使用上也非常的友好,不过效果的话暂时我还没试过,后面再看看吧,蹲一波后续发展好了。

从给定引用中未直接获取到用于癌症生存预测的多模态专家混合模型(MoME)的相关信息。不过已知提出的Mixture-of-Modality-Experts(MoME)的Transformer,能依据输入数据的模态选择不同“expert”,采用“vision - text - multimodal”分阶段预训练方式,后一阶段预训练冻结前一部分编码器参数,最终在VQA等多模态任务微调后达SOTA [^1]。 推测在癌症生存预测中,MoME模型可整合多种模态数据,如基因组学数据、组织学图像数据等。不同模态数据对应不同“expert”,模型根据输入的具体数据类型选择合适“expert”处理。在预训练时,也可采用分阶段方式,先针对单一模态数据预训练,再进行多模态联合预训练,同时冻结部分编码器参数以稳定训练过程。最后在癌症生存预测任务上进行微调。 以下是一个简单示意代码,模拟MoME在处理多模态数据的流程: ```python import torch import torch.nn as nn # 假设的不同模态的专家网络 class Expert(nn.Module): def __init__(self, input_dim, output_dim): super(Expert, self).__init__() self.fc = nn.Linear(input_dim, output_dim) def forward(self, x): return self.fc(x) # MoME模型 class MoME(nn.Module): def __init__(self, num_experts, input_dim, output_dim): super(MoME, self).__init__() self.experts = nn.ModuleList([Expert(input_dim, output_dim) for _ in range(num_experts)]) self.gating_network = nn.Linear(input_dim, num_experts) def forward(self, x): # 计算门控权重 gating_weights = torch.softmax(self.gating_network(x), dim=1) expert_outputs = [expert(x) for expert in self.experts] expert_outputs = torch.stack(expert_outputs, dim=1) # 根据门控权重组合专家输出 output = torch.sum(gating_weights.unsqueeze(-1) * expert_outputs, dim=1) return output # 示例使用 input_dim = 10 output_dim = 1 num_experts = 3 model = MoME(num_experts, input_dim, output_dim) input_data = torch.randn(5, input_dim) output = model(input_data) print(output) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值