推动专家混合模型的极限:用于指令调优的极端参数高效MoE

本文主要是介绍推动专家混合模型的极限:用于指令调优的极端参数高效MoE,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

人工智能咨询培训老师叶梓 转载标明出处

MoE是一种在特定子任务上具有专门化子模型(专家)的神经网络架构,这些子模型可以独立优化,以提高整体性能。然而,传统的MoE在大规模应用时面临挑战,因为需要在内存中存储所有专家。这不仅增加了内存的需求,而且在完全微调(full fine-tuning)时计算成本极高。为了克服这些限制,Cohere for AI的研究团队提出了一种极端参数高效的MoE方法。该方法通过将MoE架构与轻量级专家相结合,实现了在只更新不到1%的参数的情况下,与全参数微调相媲美的性能。这种方法不仅在未见任务上具有良好的泛化能力,而且不依赖于任何先验任务知识。

论文链接:https://arxiv.org/pdf/2309.05444

项目链接:GitHub - for-ai/parameter-efficient-moe

方法

研究者们将任务集划分为训练任务(Ttrain)和评估任务(Teval),即。基础预训练模型首先在训练任务上进行微调,然后在评估任务上的每个未见任务进行零样本评估。标准方法是微调所有模型参数,这导致计算和内存成本高。

研究者们将专家混合(MoE)架构推向参数效率的极端,使用参数高效微调(PEFT)方法。PEFT 方法通过限制权重更新至有限数量的参数,解决了在大规模完全微调大型语言模型(LLM)时出现的与更新大量参数相关的挑战。

(IA)3 方法:引入三个新向量 ​, ,,这些向量重新调整自注意力中的关键和价值激活,以及逐位置前馈层中的中间激活:其中Q,K,V 是自注意力的查询、键和值投影矩阵, 是预训练模型中前馈层的冻结权重。由于 (IA)3 只更新,它在参数效率上极为高效。对于3亿参数的 T5 模型,它仅更新了总参数的0.018%。

LORA 方法:优化了大型语言模型中密集层的低秩分解。对于预训练权重矩阵 和输入激活 ,LORA 将 W_0​ 分解为两个低秩矩阵: 其中 ​,秩。在微调期间,所有预训练权重都冻结,只更新A 和 B 矩阵。LORA 适配可以用于每个 Transformer 块中的所有线性层,包括自注意力的查询 Q、键 K、值 V 以及前馈层 W_1​ 和 W_2​ 的输出。与 (IA)3 不同,LORA 适配在参数使用上提供了更多的灵活性。

研究者们提出了一种极端参数高效的 MoE 框架,该框架利用轻量级“适配器”作为专家,建立在预训练密集模型之上。MoE 层由路由器网络R 和一组n 专家​ 组成,每个专家 E_i​ 是一个参数化函数。路由器网络通常由一个密集层和随后的 softmax 函数组成,这一层接收中间令牌表示 x 作为输入,并根据门控分数​ 组合每个专家的输出:

MoV 架构如图 2 左侧所示,MoV 架构的概览突出了软合并,其中只有向量和路由器针对每个多头注意力块进行更新。右侧提供了实现 MoV 层核心的 JAX 风格伪代码。

通过 MoV 和 MoLORA 方法,只更新一小部分参数,在训练和推理时都有多个实际好处,后者是 MoE 架构独有的。这些增益如下:

  • 训练效率:极端参数高效的 MoE 公式导致内存显著减少。在训练期间冻结大多数参数减少了计算模型参数梯度的计算开销,也减少了存储模型优化器状态的内存需求。
  • 推理效率:MoV 和 MoLORA 方法的固有结构模块化允许在推理时显著减少内存需求。对于传统的 MoE 模型,需要在内存中存储许多完整的前馈块(甚至是基于特定架构的模型的完整副本),这是一项昂贵的工作。而使用研究者们的方法,无论确切类型如何,除了轻量级参数高效专家外,只需要在内存中存储模型主干的单一副本。这导致推理时内存需求的显著减少。

想要掌握如何将大模型的力量发挥到极致吗?叶老师带您深入了解 Llama Factory —— 一款革命性的大模型微调工具。9月22日晚,实战专家1小时讲解让您轻松上手,学习如何使用 Llama Factory 微调模型。

加助理微信提供直播链接:amliy007,29.9元即可参加线上直播分享,叶老师亲自指导,互动沟通,全面掌握Llama Factory,关注享粉丝福利,限时免费CSDN听直播后的录播讲解。
LLaMA Factory 支持多种预训练模型和微调算法。它提供灵活的运算精度和优化算法选择,以及丰富的实验监控工具。开源特性和社区支持使其易于使用,适合各类用户快速提升模型性能。

实验 

实验设置:

  • 基础预训练模型:使用了不同大小的T5模型,参数量从770M到11B不等,包括T5 v1.1+LM适配。
  • 优化器:所有实验都使用Adafactor优化器进行微调,学习率设置为3×10−43×10−4。
  • 序列长度:输入序列长度设置为1024,目标序列长度设置为256。
  • 批量大小和训练步数:对于所有参数高效的MoE变体,使用32的批量大小在500K步内进行微调。

基线比较:

  • 与完全微调的模型(T0基线)和标准的参数高效微调方法((IA)3和LORA)进行比较。
  • T0基线:通过使用较大的批量大小和学习率进行微调,获得了更好的性能。具体来说,使用256的批量大小和1×10−31×10−3的学习率进行10K步的微调。
  • (IA)3和LORA:对于秩为4的(IA)3和LORA,使用相同的训练超参数,即学习率为3×10−43×10−4,批量大小为32,训练500K步。

评估指标:

  • 在8个未见数据集上测试了他们的方法和基线方法,这些数据集包括ANLI、HellaSwag、WinoGrande和5个Super Glue数据集,涵盖了指代消解、自然语言推理、多项选择问答、故事完成和词义消歧等不同任务。
  • 计算每个评估数据集在不同提示模板下的中位数准确率,并报告每个数据集的结果以及所有数据集的平均结果。

基础设施:

  • 所有实验都在TPU v4机器上进行,最多使用256个pod切片。
  • 使用SeqIO和T5X框架进行训练、评估和推理,这些框架支持跨TPU核心的数据和模型并行处理。

消融研究:

  • 路由输入: 令牌与句子嵌入的比较,探讨了任务表示形式的指令嵌入如何影响路由和下游泛化。
  • 路由策略: 软合并与离散top-k路由策略的比较,研究了在参数高效的MoE中哪种路由策略最有效。

研究者们首先将他们提出的MoE模型(包括MoV和MoLORA)与标准的PEFT方法((IA)3和LORA)进行了比较。这些比较是基于使用T5-3B作为基础模型的零样本(zero-shot)性能测试。表1展示了这些方法在不同任务上的平均中位数结果。

表1中数据显示,MoV和MoLORA在多个任务上相较于(IA)3和LORA显示出显著的性能提升。特别是,使用30个专家的MoV实现了相比其密集对应模型14.57%的性能提升。这一改进在所有未见任务上都是一致的,并且仅通过增加每个专家0.018%的参数更新实现。对于LORA,配备15个专家的MoLORA实现了平均中位数得分5.70%的提升,虽然这一提升相比MoV来说不那么显著,但仍然证明了混合学习的优势。

研究者们进一步比较了MoE方法与全参数微调(Full-FT)的性能。表1显示,即使是只更新0.32%的参数的MoV-10,也能达到与全参数微调相当的性能。当增加专家数量时,MoV和MoLORA甚至略微超过了全参数微调的性能。

研究者们探讨了MoE方法在不同规模的基础模型(从770M到11B参数)上的表现。图1(右图)展示了MoV在不同模型规模上与(IA)3和全参数微调的性能比较。结果显示,MoV在所有评估的模型规模上均保持比标准PEFT更高的性能,并与全参数微调取得了相当的结果。

研究者们还研究了专家数量对未见任务性能的影响。图4(中间图)展示了在所有模型规模上,增加专家数量通常会提高未见任务的性能。例如,在770M和11B参数的模型上,使用60个专家的MoV方法实现了最佳性能。

研究者们比较了MoV使用不同路由策略的性能。图4(右图)显示,软合并(soft merging)策略显著优于离散的top-k路由策略。这表明在极端参数高效的MoE设置中,软合并能够实现更优的性能。

为了理解专家如何在不同任务中被激活,研究者们分析了MoV中5个专家在最后解码器块的前馈层的平均路由概率。图5展示了不同任务(包括训练任务和未见评估任务)中专家的平均路由概率。结果表明,专家的专业化是内在的,并且可以从训练任务迁移到未见任务。

最后,研究者们对MoE架构对超参数的敏感性进行了广泛的消融研究。他们发现,较大的批量大小更可能导致MoE模型坍塌为单一专家,而较小的学习率有助于稳定训练,防止快速、不平衡的更新抑制多样性,从而导致次优解决方案。

通过这些详细的分析,研究者们展示了他们提出的MoE模型在参数效率和性能上的显著优势,以及在不同设置下的有效性和鲁棒性。

这篇关于推动专家混合模型的极限:用于指令调优的极端参数高效MoE的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1120141

相关文章

Java中的StringBuilder之如何高效构建字符串

《Java中的StringBuilder之如何高效构建字符串》本文将深入浅出地介绍StringBuilder的使用方法、性能优势以及相关字符串处理技术,结合代码示例帮助读者更好地理解和应用,希望对大家... 目录关键点什么是 StringBuilder?为什么需要 StringBuilder?如何使用 St

SpringBoot请求参数接收控制指南分享

《SpringBoot请求参数接收控制指南分享》:本文主要介绍SpringBoot请求参数接收控制指南,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring Boot 请求参数接收控制指南1. 概述2. 有注解时参数接收方式对比3. 无注解时接收参数默认位置

MySQL重复数据处理的七种高效方法

《MySQL重复数据处理的七种高效方法》你是不是也曾遇到过这样的烦恼:明明系统测试时一切正常,上线后却频频出现重复数据,大批量导数据时,总有那么几条不听话的记录导致整个事务莫名回滚,今天,我就跟大家分... 目录1. 重复数据插入问题分析1.1 问题本质1.2 常见场景图2. 基础解决方案:使用异常捕获3.

Python使用getopt处理命令行参数示例解析(最佳实践)

《Python使用getopt处理命令行参数示例解析(最佳实践)》getopt模块是Python标准库中一个简单但强大的命令行参数处理工具,它特别适合那些需要快速实现基本命令行参数解析的场景,或者需要... 目录为什么需要处理命令行参数?getopt模块基础实际应用示例与其他参数处理方式的比较常见问http

Linux内核参数配置与验证详细指南

《Linux内核参数配置与验证详细指南》在Linux系统运维和性能优化中,内核参数(sysctl)的配置至关重要,本文主要来聊聊如何配置与验证这些Linux内核参数,希望对大家有一定的帮助... 目录1. 引言2. 内核参数的作用3. 如何设置内核参数3.1 临时设置(重启失效)3.2 永久设置(重启仍生效

SpringMVC获取请求参数的方法

《SpringMVC获取请求参数的方法》:本文主要介绍SpringMVC获取请求参数的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下... 目录1、通过ServletAPI获取2、通过控制器方法的形参获取请求参数3、@RequestParam4、@

Spring Boot项目部署命令java -jar的各种参数及作用详解

《SpringBoot项目部署命令java-jar的各种参数及作用详解》:本文主要介绍SpringBoot项目部署命令java-jar的各种参数及作用的相关资料,包括设置内存大小、垃圾回收... 目录前言一、基础命令结构二、常见的 Java 命令参数1. 设置内存大小2. 配置垃圾回收器3. 配置线程栈大小

如何高效移除C++关联容器中的元素

《如何高效移除C++关联容器中的元素》关联容器和顺序容器有着很大不同,关联容器中的元素是按照关键字来保存和访问的,而顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的,本文介绍了如何高效移除C+... 目录一、简介二、移除给定位置的元素三、移除与特定键值等价的元素四、移除满足特android定条件的元

基于Python实现高效PPT转图片工具

《基于Python实现高效PPT转图片工具》在日常工作中,PPT是我们常用的演示工具,但有时候我们需要将PPT的内容提取为图片格式以便于展示或保存,所以本文将用Python实现PPT转PNG工具,希望... 目录1. 概述2. 功能使用2.1 安装依赖2.2 使用步骤2.3 代码实现2.4 GUI界面3.效

SpringBoot利用@Validated注解优雅实现参数校验

《SpringBoot利用@Validated注解优雅实现参数校验》在开发Web应用时,用户输入的合法性校验是保障系统稳定性的基础,​SpringBoot的@Validated注解提供了一种更优雅的解... 目录​一、为什么需要参数校验二、Validated 的核心用法​1. 基础校验2. php分组校验3