大语言模型中的MoE

news/2024/11/30 0:13:40/文章来源:https://www.cnblogs.com/smartloli/p/18577833

1.概述

MoE代表“混合专家模型”(Mixture of Experts),这是一种架构设计,通过将不同的子模型(即专家)结合起来进行任务处理。与传统的模型相比,MoE结构能够动态地选择并激活其中一部分专家,从而显著提升模型的效率和性能。尤其在计算和参数规模上,MoE架构能够在保持较低计算开销的同时,扩展模型的能力,成为许多LLM的热门选择。

2.内容

本篇内容主要介绍MoE架构的两个核心组件:专家(Experts)和路由器(Router)。这两个组件在典型的基于LLM的架构中发挥着关键作用。专家是负责执行特定任务的子模型,而路由器则负责决定哪些专家需要在给定任务中被激活,从而优化计算效率和模型表现。

 2.1 什么是专家混合

混合专家模型(MoE)是一种创新技术,通过将多个专门的子模型(即“专家”)集成进大型语言模型(LLM)中,显著提升了模型的性能和效率。

MoE架构的核心由以下两个部分构成:

  • 专家(Experts):每个前馈神经网络层都配备了一组专家,这些专家是模型中的独立子网络,每次计算时,只有一部分专家会被激活参与处理。专家通常是具备特定任务能力的神经网络。
  • 路由器(Router)或门控网络(Gate Network):该组件负责根据输入数据(如令牌)决定哪些专家会处理特定任务。路由器根据模型的输入动态地选择最适合的专家,从而提高计算效率。

通过这种结构,MoE架构不仅在保持较低计算成本的同时,能够处理更多样化、复杂的任务,也能够根据需求扩展模型规模,从而提升LLM的整体表现。

值得注意的是,MoE中的“专家”并非专注于某一特定领域,如“心理学”或“生物学”。相反,这些专家主要专注于学习词汇层面的句法结构,而不是领域知识。因此,每个专家的作用更偏向于捕捉语言的基本模式和结构,而非专业领域的深度理解。

更具体地说,MoE中的“专家”专注于在特定上下文中处理特定的令牌。路由器(门控网络)根据输入数据的特征,动态选择最适合处理该数据的专家。这种机制使得模型能够根据任务需求灵活地调用不同的专家,从而提高处理效率和准确性。

 每个“专家”并不是独立的完整大型语言模型,而是嵌入在LLM架构中的一个子模型组件。它们与其他专家协同工作,共同提升整个模型的处理能力和效率。

2.2 密集层

为了更好地理解专家的作用以及它们的工作原理,我们首先需要了解MoE所替代的传统架构——密集层(Dense Layers)。

混合专家模型(MoE)构建于大型语言模型(LLM)的基本组成部分之一——前馈神经网络(FFNN)之上。需要注意的是,在标准的解码器-only Transformer架构中,FFNN通常在层归一化后被应用到每一层中。这是LLM处理信息的核心方式之一,而MoE的引入旨在通过引入多个专家模型替代传统的密集层,提升模型的表达能力和计算效率。

 前馈神经网络(FFNN)使模型能够基于注意力机制提取的上下文信息,进一步处理并捕捉数据中的复杂关系。然而,FFNN的规模随着层数增加而迅速膨胀。为了能够学习这些复杂的关系,FFNN通常会在输入信息的基础上进行扩展,这可能导致计算开销的大幅增加。

 2.3 稀疏层

在传统的Transformer架构中,前馈神经网络(FFNN)被称为密集模型,因为它的所有参数(包括权重和偏置)都会被激活并用于计算输出,没有任何信息被忽略。仔细分析密集模型时,我们可以看到,输入信息会激活所有的参数,每个参数在计算中都会发挥作用,从而导致计算复杂度和资源消耗较大。

 与密集模型不同,稀疏模型只激活一部分参数,这种方式与混合专家模型(MoE)紧密相连。具体来说,我们可以将密集模型拆分为多个“专家”子模型,重新训练它们,并在每次任务中仅激活一部分专家进行计算。这种方法不仅能减少计算开销,还能提高模型处理特定任务时的效率。

 这种方法的核心理念是,每个专家在训练过程中专注于学习不同的信息。到了推理阶段,根据任务的具体需求,系统只会激活最相关的专家。这样,面对不同的问题时,我们能够选择最适合的专家来进行高效处理。

 2.4 专家学习的内容

如前所述,专家并非专注于学习某一完整领域的知识,而是专注于捕捉更细粒度的信息。因此,将它们称为“专家”有时会让人误解,因为这些专家并不具备传统意义上在某一领域的深度专业知识。

 

 在解码器模型中,专家似乎并未表现出相同类型的专业化。尽管如此,这并不意味着所有专家在作用上是相同的。一个很好的例子可以参考《Mixtral 8x7B》论文,其中每个令牌都被标注为其首选专家,从而展示了专家选择的多样性和灵活性。

 

上图还展示了专家们更倾向于关注句法结构,而非特定领域的知识。因此,尽管解码器中的专家没有明确的专业化,它们在处理某些类型的令牌时却表现出一致性和特定的应用模式。

2.5 专家架构

虽然将专家看作是密集模型中的隐藏层并将其拆分成若干部分进行可视化是一个有趣的方式,但实际上,专家通常是独立的、完整的前馈神经网络(FFNN)。每个专家在模型中扮演着独立的角色,执行特定的计算任务。

 由于大多数大型语言模型(LLM)包含多个解码器层,一个输入文本通常会在生成过程中经过多个专家的处理,每个专家负责不同的任务或处理不同的特征。这样,模型可以更有效地捕捉复杂的语言模式和语境信息。

 由于每个令牌可能会激活不同的专家,这导致模型在处理每个令牌时可能会选择不同的“路径”。这种动态选择使得模型能够灵活地根据不同的上下文需求进行优化。

 

 

更新后的解码器模块可视化将显示更多的前馈神经网络(FFNN),每个FFNN代表一个专家。这样,每个专家都拥有独立的计算路径,以便在处理不同任务时提供更具针对性的计算能力。

 3.路由

有了专家模型后,模型如何确定使用哪些专家呢?在专家之前,加入了一个路由器(或称门控网络),其作用是根据输入令牌的特征来决定激活哪个专家。路由器是一个前馈神经网络(FFNN),它会输出一组概率值,根据这些概率值来选择最适合当前任务的专家。

 

有了专家模型后,模型如何确定使用哪些专家呢?在专家之前,加入了一个路由器(或称门控网络),其作用是根据输入令牌的特征来决定激活哪个专家。路由器是一个前馈神经网络(FFNN),它会输出一组概率值,根据这些概率值来选择最适合当前任务的专家。

 

MoE层有两种实现方式:稀疏型和密集型混合专家模型。两者都依赖路由器来选择专家,但稀疏型MoE只激活少数几个专家,而密集型MoE则激活所有专家,只不过激活的比例和分布可能不同。这种设计使得模型在处理不同任务时可以灵活调节计算资源的分配。 

 例如,给定一组令牌,普通的MoE会将令牌分配给所有专家,而稀疏型MoE则只激活少数几个专家。在现有的LLM中,提到“MoE”时,通常指的是稀疏型MoE,因为它通过仅激活一部分专家来减少计算开销,这对于大型语言模型的高效运行至关重要。

 门控网络可以说是MoE中最为重要的部分,因为它不仅在推理时决定选择哪些专家,而且在训练过程中也起着关键作用。在最简单的形式下,输入(x)与路由器的权重矩阵(W)相乘,生成一个加权的输出,用于决定激活哪些专家。

 然后,我们对输出应用SoftMax函数,将其转化为每个专家的概率分布G(x)。这个概率分布决定了每个专家被选中的可能性,从而指导路由器选择最合适的专家进行处理。

 路由器根据概率分布选择最匹配的专家来处理给定的输入。最终,模型将每个选定专家的输出与相应的路由器概率相乘,并将所有结果相加,得到最终的输出。

 

 然而,这种简单的机制可能会导致路由器频繁选择相同的专家,因为某些专家的学习速度可能快于其他专家,从而使得它们在选择过程中占据主导地位。

这种不均衡的选择不仅会导致某些专家被频繁激活,而其他专家几乎没有机会参与训练,还会引发训练和推理阶段的问题。因此,我们希望在训练和推理过程中保持专家间的平衡,这就是所谓的负载均衡。负载均衡有助于避免某些专家过度拟合,提高模型的多样性和泛化能力。 

 4.小节

至此,我们的混合专家模型(MoE)之旅圆满结束!希望这篇文章能帮助你更好地理解这种创新技术的潜力。如今,几乎所有的模型架构都包含了至少一种MoE变体,MoE看起来将成为未来技术中的重要组成部分。

5.结束语

这篇博客就和大家分享到这里,如果大家在研究学习的过程当中有什么问题,可以加群进行讨论或发送邮件给我,我会尽我所能为您解答,与君共勉!

另外,博主出新书了《深入理解Hive》、同时已出版的《Kafka并不难学》和《Hadoop大数据挖掘从入门到进阶实战》也可以和新书配套使用,喜欢的朋友或同学, 可以在公告栏那里点击购买链接购买博主的书进行学习,在此感谢大家的支持。关注下面公众号,根据提示,可免费获取书籍的教学视频。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/843740.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ssh控制远程设备连接wifi

查看wifisudo nmcli device wifi连接wifisudo nmcli device wifi connect MERCURY_21B8 password 密码提示连接成功Device wlan0 successfully activated with 5c7d67b4-145d-4848-83cf-3b51795503fb

Kubeapps可视化管理Helm Chart包

目录一.基于helm部署kubeapps1.kubeapps介绍2.添加kubeapps的repo3.搜索kubeapps4.下载指定的kubeapps版本5.基于helm部署kubeapps6.访问kubeapps的WebUI二.通过kubeapps部署应用案例1 通过kubeapps查看已经部署的Chart2.通过kubeapps搜索Chart信息 一.基于helm部署kubeapps 1.…

剪映设置封面时候如何防止文字遮挡人物 All In One

剪映设置封面时候如何防止文字遮挡人物 All In One PS 图层叠加 / 前景后景 / 透明度 照片 人物抠图 + 画中画剪映设置封面时候如何防止文字遮挡人物 All In One 原理分析 PS 图层叠加 / 前景后景 / 透明度 照片 人物抠图 + 画中画 solutionsFilmora ???人物抠图 图层叠加 图…

聊一下怎么10分钟速水中危CVE

怎么在10分钟里速水一个中危CVE题目是真的。今天晚上刚接触关于CVE的审计和提交。只能说:牛逼的是真牛逼,水的是真水。 我接下来教你,怎么在10分钟里找到一个CVE的中危漏洞并且提交。然后你就可以去咸鱼接单了,一个一铂快 打开https://code-projects.org/ 随机找一个水项目…

2024-2025-1 20241403 《计算机基础与程序设计》第十周学习总结

学期2024-2025-1 学号20241403 《计算机基础与程序设计》第十周学习总结 作业信息这个作业属于哪个课程 <班级的链接>2024-2025-1-计算机基础与程序设计](https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP)这个作业要求在哪里 <作业要求的链接>2024-2025-1计…

《Django 5 By Example》阅读笔记:p388-p454

《Django 5 By Example》学习第 15 天,p388-p454 总结,总计 66 页。 一、技术总结 1.celery 我觉得书中这种用法太简单了。 2.flower 用于监控 celery。 # 安装 pip install flower # 启动 celery -A myshop flower --basic-auth=root:root # 访问 http://127.0.0.1:555…

java学习11.29

去年22级报销管理系统基本完成,出差报销申请撤销,审批功能基本完成

Kustomize 设计理念与使用说明

Kustomize 设计理念与使用说明 一、设计理念 Kustomize 的设计理念是基于"基础配置 + 补丁"的模式,这里解释一下为什么需要在 base 目录下创建基础配置:基础配置的重要性:base 目录下的配置是所有环境共享的基础配置 包含了服务最基本的定义和配置 确保了不同环境…

【评价指标】ROC曲线与AUC

一、前置知识 ​ 真阳性(TPR):正样本被正确分类个数与所有正样本的总数的比值 \[TPR = \frac{TP}{TP+FN} \]​ 假阳性(FPR):负样本被错误分类个数与所有负样本的总数的比值 \[FPR=\frac{FN}{FN+TN} \]​ 其中,TP表示正确分类的正样本,TN表示正确分类的负样本,FN表示错误分…

overleaf中使用中文

用的是这个博客里面的方法三,很方便。 https://blog.csdn.net/m0_52037292/article/details/109768317\usepackage{CJKutf8} \usepackage{CJKutf8}\begin{document}\begin{CJK*}{UTF8}{gbsn} 数学、中英文皆可以混排。You can intersperse math, Chinese and English (Latin …

20222409 2024-2025-1 《网络与系统攻防技术》实验五实验报告

1.实验内容 1.1 本周学习内容 本周学习了信息收集与渗透测试相关技术,主要包括Metasploit、nmap和Nessus的使用。Metasploit是渗透测试框架,能提供多种攻击模块,如远程代码执行、提权和后渗透功能(如键盘记录、文件操作等),可用于模拟攻击和漏洞利用; nmap被用于扫描目标…

gin, gorm快速入门

Gin Gin入门 gin的学习要点如何定义路由:包括参数路由、通配符路由 如何处理输入输出 如何使用middleware解决AOP问题在 Gin 里面,用 Engine 来监听一个端口,是一个逻辑上的服务器。 一个 Go 进程可以创建多个 Engine。 hello, world 使用步骤:在应用中引入 Gin 依赖:go g…