源码分析:MoE专家架构
相关链接:
手把手教你,从零开始实现一个稀疏混合专家架构语言模型(MoE)
MoE专家模型因为Mixtral的使用让大家又一次了解了这个架构,事实上这个架构起源于 1991 年的论文 Adaptive Mixture of Local Experts。这种思想旨在使用多个独立的网络组成一个监督模型,该模型中,每个独立的网络(也被称作专家网络)专注于训练样本中的不同数据。这个系统中,一个门控网络被训练来决定哪个专家被选中。
这和传统的机器学习模型中的Ensemble模型有点类似,都是结合了多个模型来处理任务,区别在于MoE的子模型是根据不同的任务建模,并且多了一个门控单元。
我的理解:MoE是如何体现在语言模型上的?可以理解为生成文本时,会根据上一段文本中的内容进行预测。在上一段文本中,每个Token都有一个专门的专家处理,来给出预测。
Pytorch实现简单的专家网络
这里用pytorch实现一个简单的专家网络。完成这个任务需要有几个部分:
- 需要一个Dataset。
- 需要一个DataLoader。
- 需要一个TopN函数,用来选择需要的专家网络。
- 需要一个单个的Expert网络。
- 需要一个完整的MoE网络。
- 需要一个损失函数和评估函数。
- 需要完整的训练过程。
Dataset与DataLoader
1 |
|
TopN函数
门控网络是一个线性层,它将输入的完整的Tensor转换为所有的专家网络数大小的张量,代表着每个专家的得分。随后取Top N个专家的Index。
1 |
|
专家网络
专家网络就是一个简单的神经网络:
1 |
|
MoE网络
我们假设这是一个分类任务,那么构建MoE网络需要如下参数:输出的Tensor,类别数量,专家数量,TopN。假如是文本预测任务,那么类别数量就是词表大小。
1 |
|
损失函数
1 |
|
训练模型
1 |
|
以下是一个Epoch的输出:
1 |
|
Mixtral MoE源码
同时附上了Transformer中Mixtral的MoE源码:
首先是Mixtral的单个专家模块,它将输入层经过一个被激活过的线性层,再经过两个线性层。
1 |
|
以下代码是MoE的模型构建:
1 |
|
2024/4/14 于苏州