雄安优秀网站建设方案旅游网站建设设计公司
2026/1/17 20:04:53 网站建设 项目流程
雄安优秀网站建设方案,旅游网站建设设计公司,广西seo搜索引擎优化,网站改版301是什么意思MOE#xff08;Mixture of Experts#xff09;也就是混合专家系统#xff0c;已经在LLM#xff08;Large Language Model#xff09;的结构中成为标配了。最近看到一篇手写MOE教程#xff0c;所学下来#xff0c;受益颇多。 MOE概述 MOE的核心思想就是通过多个神经网络…MOEMixture of Experts也就是混合专家系统已经在LLMLarge Language Model的结构中成为标配了。最近看到一篇手写MOE教程所学下来受益颇多。MOE概述MOE的核心思想就是通过多个神经网络构成多个“领域”的专家对输入进行一个判断让最“擅长”这个任务的专家处理这个任务。从而实现更高效、准确的处理任务。因此MOE模型的必要组成部分包含• 专家Experts模型中的每个专家都是一个独立的神经网络专门处理输入数据的特定子集或特定任务。通常一个Experts是一个前馈神经网络• 门控网络Gate Network门控网络的作用是决定每个输入应该由哪个专家或哪些专家来处理。通常它根据输入样本的特征计算出每个专家的权重或重要性然后根据这些权重将输入样本分配给相应的专家。门控网络通常是一个简单的神经网络其输出经过softmax激活函数处理以确保所有专家的权重之和为1。最近两年大家都可以看到AI的发展有多快我国超10亿参数的大模型在短短一年之内已经超过了100个现在还在不断的发掘中时代在瞬息万变我们又为何不给自己多一个选择多一个出路多一个可能呢与其在传统行业里停滞不前不如尝试一下新兴行业而AI大模型恰恰是这两年的大风口整体AI领域2025年预计缺口1000万人其中算法、工程应用类人才需求最为紧迫学习AI大模型是一项系统工程需要时间和持续的努力。但随着技术的发展和在线资源的丰富零基础的小白也有很好的机会逐步学习和掌握。【点击蓝字获取】【2025最新】AI大模型全套学习籽料可白嫖LLM面试题AI大模型学习路线大模型PDF书籍640套AI大模型报告等等从入门到进阶再到精通超全面存下吧而现在 LLM MOE 如此火热的原因主要在于• 提高模型性能通过将多个专家的预测结果进行整合MoE模型可以在不同的数据子集或任务方面发挥每个专家的优势从而提高整体模型的性能。在不同的任务中激活擅长的专家可以让模型可以更准确地对不同领域的任务进行处理。• 减少计算消耗与传统的密集模型相比MoE模型在处理每个输入样本时只有相关的专家会被激活而不是整个模型的所有参数都被使用。这意味着MoE模型可以在保持较高性能的同时显著减少计算资源的消耗特别是在LLM中这种优势更为明显。• 增强模型的可扩展性MoE模型的架构可以很容易地扩展到更多的专家和更大的模型规模。通过增加专家的数量模型可以覆盖更广泛的数据特征和任务类型从而在不增加计算复杂度的情况下提升模型的表达能力和泛化能力。这种可扩展性为处理大规模、复杂的数据集提供了有效的解决方案例如在处理多模态数据时MoE模型可以通过设置不同的专家来专门处理不同模态的数据实现更高效的多模态融合。Expert因为 MOE 网络对应着多个专家而通常来说专家的结构是一个前馈神经网络。因此我们首先需要实现一个普通前馈神经网络结构的专家。import torch import torch.nn as nn class MOE_basic(nn.Module): def __init__(self, input_size, hidden_size, output_size): super().__init__() self.fc nn.Linear(in_featuresinput_size, out_featureshidden_size) self.fc2 nn.Linear(in_featureshidden_size, out_featuresoutput_size) self.active nn.ReLU() def forward(self, x): x self.fc2(self.active(self.fc(x))) return x这个 FFN 专家先把输入向量从input_size维线性投影到更高的hidden_size维经 ReLU激活函数 进行非线性变换再线性缩回input_size维输出与输入同形状。通过这种“先扩后缩”的方式能够在更高维空间中学习复杂的特征交互。基础版本MOE基础版本的MOE思想非常的简单即首先将输入通过一个Gate NetWork获得每一个专家的权重weight然后将输入依次通过每一个专家最后将权重乘上专家的输出作为专家的”分析结果“然后将每个专家的结果相加即可。class simple_MOE(nn.Module): def __init__(self, input_size, hidden_size, output_size, num_experts): super().__init__() self.num_experts num_experts self.experts nn.ModuleList( [ MOE_basic(input_sizeinput_size, hidden_sizehidden_size, output_sizeoutput_size) for _ in range(num_experts) ] ) self.gate nn.Linear(in_featuresinput_size, out_featuresnum_experts) # x [batch, input_size] def forward(self, x): # shape: [batch, num_experts] experts_weight self.gate(x) # shape: [[batch, 1, output_size] * num_experts] experts_out_list [expert(x).unsqueeze(1) for expert in self.experts] # shape: [batch, num_experts, output_size] experts_out_list torch.cat(experts_out_list, dim1) # shape: [batch, 1, num_experts] experts_weight experts_weight.unsqueeze(1) # shape: [batch, 1, output_size] out experts_weight experts_out_list # shape: [batch, output_size] return out.squeeze(1)Sparse MoESparse MoE 开始就是大模型训练时所采用的结构了。回看基础版本的MOE让输入进过了每一个专家的计算然后采取了不同权重表示对不同专家的侧重程度。但是在大模型的训练架构中由于模型的参数量过大这种基础版本的MOE并没有减轻训练的负担。因此Sparse Moe相较于基础版本的MOE的区别是通过Router选择 topK 个专家然后对这 topK 个专家的输出进行加权求和。如果 topK 专家数量那么其实也退化成了基础版本的MOE具体结构如下图所示以 switch transformers 模型的 MOE 架构图作为演示首先是 Router对每个 token 通过 top-k 选择专家class MOE_router(nn.Module): def __init__(self, hidden_size, num_experts, top_k): super().__init__() self.num_experts num_experts self.gate nn.Linear(in_featureshidden_size, out_featuresnum_experts) self.top_k top_k # hidden_states :[batch* seq, hidden_size] def forward(self, hidden_states): routers_logits self.gate(hidden_states) # shape: [batch* seq, num_experts] routers_probs F.softmax( routers_logits, dim-1, dtypetorch.float ) # shape:[batch* seq, num_experts] router_weights, selected_experts torch.topk( routers_probs, self.top_k, dim1 ) # shape:[batch* seq,top_k], topk 返回选择的top-k的值和对应的索引 router_weights router_weights / router_weights.sum( dim-1, keepdimTrue ) # 归一化 router_weights router_weights.to(hidden_states.dtype) # 转换精度 # 生成专家掩码提升计算效率 experts_mask F.one_hot( selected_experts, num_classesself.num_experts ) # 选的是1没选的是0 shape:[batch* seq, top_k, num_experts] experts_mask experts_mask.permute(2, 1, 0) # (num_experts, top_k, batch* seq) return routers_logits, router_weights, selected_experts, experts_mask class spare_MOE(nn.Module): def __init__(self, input_size, output_size, hidden_size, top_k, num_experts): super().__init__() self.input_size input_size self.output_size output_size self.hidden_size hidden_size self.num_experts num_experts self.top_k top_k self.router MOE_router(self.hidden_size, num_experts, top_k) self.MOE nn.ModuleList([MOE_basic(input_size, output_size) for _ in range(num_experts)]) def forward(self, x): # x shape [batch, seq,hidden_size] print(x.shape) batch_size, seq, hidden_size x.size() # 合并强两个维度将所有token视为独立的输入这样每个专家可以独立处理每个token而不需要考虑它们属于哪个批次或序列 # [batch*seq, hidden_size] hidden_state x.view(-1, hidden_size) routers_logits, router_weights, selected_experts, experts_mask self.router(hidden_state) print(routers_logits.shape, router_weights.shape, selected_experts.shape, experts_mask.shape) final_hidden_states torch.zeros_like(hidden_state) for experts_idx in range(self.num_experts): experts_layer self.MOE[experts_idx] # 当前专家网络 # idx [top_k] # top_X [batch* seq] idx, top_x torch.where(experts_mask[experts_idx] 1) # 选出哪些token需要经过专家 current_state hidden_state.unsqueeze(0)[:, top_x, :].reshape(-1, hidden_size) # 专家处理*权重 current_hidden_state experts_layer(current_state) * router_weights[top_x, idx].unsqueeze(-1) final_hidden_states.index_add(0, top_x, current_hidden_state.to(hidden_state.dtype)) final_hidden_states final_hidden_states.reshape(batch_size, seq, hidden_size) return final_hidden_states, routers_logits然后是整个 Sparse MoE 的代码class spare_MOE(nn.Module): def __init__(self, input_size, output_size, hidden_size, top_k, num_experts): super().__init__() self.input_size input_size self.output_size output_size self.hidden_size hidden_size self.num_experts num_experts self.top_k top_k self.router MOE_router(self.hidden_size, num_experts, top_k) self.MOE nn.ModuleList([MOE_basic(input_size, hidden_size, output_size) for _ in range(num_experts)]) def forward(self, x): # x shape [batch, seq,hidden_size] print(x.shape) batch_size, seq, hidden_size x.size() # 合并强两个维度将所有token视为独立的输入这样每个专家可以独立处理每个token而不需要考虑它们属于哪个批次或序列 # [batch*seq, hidden_size] hidden_state x.view(-1, hidden_size) routers_logits, router_weights, selected_experts, experts_mask self.router(hidden_state) print(routers_logits.shape, router_weights.shape, selected_experts.shape, experts_mask.shape) final_hidden_states torch.zeros_like(hidden_state) for experts_idx in range(self.num_experts): experts_layer self.MOE[experts_idx] # 当前专家网络 # idx [top_k] # top_X [batch* seq] idx, top_x torch.where(experts_mask[experts_idx] 1) # 选出哪些token需要经过专家 current_state hidden_state.unsqueeze(0)[:, top_x, :].reshape(-1, hidden_size) # 专家处理*权重 current_hidden_state experts_layer(current_state) * router_weights[top_x, idx].unsqueeze(-1) final_hidden_states.index_add(0, top_x, current_hidden_state.to(hidden_state.dtype)) final_hidden_states final_hidden_states.reshape(batch_size, seq, hidden_size) return final_hidden_states, routers_logitsShareExpert Sparse MoEShareExpert SparseMoE 则是 Deepseek 所采用的一种 MOE架构。和上面的 Sparse MoE 的区别是ShareExpert Sparse MoE 增加了一组共享的专家模型。这些模型是所有输入的 token 共享的也就是说所有 token 都过这些共享专家模型然后每个 token 再经过Sparse Moe选出 top-k 个专家然后这 top-K 个专家和共享的专家的输出一起再加权求和。具体结构如下图所示下面的手写代码参考了 deepseek MoE 的思想有一定的简化但是可以方便理解训练过程。class shareExpert_MOE(nn.Module): def __init__(self, input_size, output_size, hidden_size, top_k, num_experts): super().__init__() self.spare_MOE spare_MOE(input_size, output_size, hidden_size, top_k, num_experts) self.share_MOE nn.ModuleList( [MOE_basic(input_sizeinput_size, hidden_sizehidden_size, output_sizeoutput_size) for _ in range(num_experts)] ) def forward(self, x): # spare_moe_out [batch, seq, hidden], routers_logits [batch* seq, num_experts] spare_moe_out, routers_logits self.spare_MOE(x) share_moe_out [ expert(x) for expert in self.share_MOE ] # [batch, seq, hidden] share_moe_out torch.stack(share_moe_out, dim0).sum(dim0) return share_moe_out spare_moe_out, routers_logits最近两年大家都可以看到AI的发展有多快我国超10亿参数的大模型在短短一年之内已经超过了100个现在还在不断的发掘中时代在瞬息万变我们又为何不给自己多一个选择多一个出路多一个可能呢与其在传统行业里停滞不前不如尝试一下新兴行业而AI大模型恰恰是这两年的大风口整体AI领域2025年预计缺口1000万人其中算法、工程应用类人才需求最为紧迫学习AI大模型是一项系统工程需要时间和持续的努力。但随着技术的发展和在线资源的丰富零基础的小白也有很好的机会逐步学习和掌握。【点击蓝字获取】【2025最新】AI大模型全套学习籽料可白嫖LLM面试题AI大模型学习路线大模型PDF书籍640套AI大模型报告等等从入门到进阶再到精通超全面存下吧

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询