专家混合(MoE)大语言模型:免费的嵌入模型新宠

专家混合(MoE)大语言模型:免费的嵌入模型新宠

今天,我们深入探讨一种备受瞩目的架构——专家混合(Mixture-of-Experts,MoE)大语言模型,它在嵌入模型领域展现出了独特的魅力。

一、MoE 架构揭秘

(一)MoE 是什么?

MoE 是一种包含多个被称为“专家”子网的架构,每个子网专注于不同的数据任务或方面。其优势显著,在保持甚至提升模型质量的同时,能够以比相同或更大规模的传统模型更少的计算量进行预训练。例如,Mixtral 8x7B 在众多评估数据集上就超越了 LLaMA 2 70B。

在基于变压器的 MoE 架构中,主要有两个关键组件。一是 MoE 层,它取代了变压器架构中的前馈网络(FFN)层。每个 MoE 层包含若干专家(如上图示例中有 4 个专家),每个专家由简单的 FFN 层构成。需要注意的是,变压器的其他组件,如自注意力层,在不同专家间共享相同权重,这使得 MoE 的权重数量并非简单的累加。像 Mixtral 8x7B 的权重并非 8x7 = 56B,而是 47B,原因就在于此。

另一个重要组件是门控网络(gating network)或路由器(router)。它负责接收输入令牌,并为每个令牌选择最相关的专家。比如,在示例中,路由器左侧会选择第二个专家来处理“more”令牌,而对于“Parameters”令牌则选择第一个专家。通常,门控网络会选择与给定令牌最相关的 top - k 个专家,并将令牌发送给选定的专家(如 Mixtral 8x7B 选择 top - 2 专家)。

其选择过程是通过将输入单词令牌与门控网络权重进行点积运算,再应用 softmax 函数来计算专家的重要概率,从而依据概率选取 top - k 相关专家。具有这种门控网络的 MoE 被称为稀疏 MoE。

(二)MoE 如何作为嵌入模型工作?

在深入探讨 MoE 作为嵌入模型的工作原理之前,先来回顾一下嵌入(embeddings)的相关知识。在深度学习模型中,嵌入是输入数据的内部表示,蕴含语义和浓缩的数据信息。通常,我们会提取神经网络的最后隐藏状态作为嵌入。一般而言,基于编码器的模型在提取嵌入方面表现出色,因为它们能够通过双向注意力捕捉语义,而仅解码器模型常使用因果注意力,只能与前一个单词令牌交互,无法像编码器 - 解码器模型那样捕获丰富的语义(如上下文信息)。

以往人们普遍认为解码器模型不能用于嵌入提取,但研究发现 MoE 中的路由权重为解码器嵌入提供了补充信息。MoE 每层的路由权重反映了对输入令牌的推理选择,包含了隐藏状态嵌入可能丢失的输入语义信息。从数学公式上看,如公式 (g) 为 softmax 函数,(H) 表示隐藏状态,我们通过连接所有 MoE 层的路由权重来避免丢失模型的推理选择。

为了充分利用路由权重和解码器嵌入,研究者提出了 MoE 嵌入(MoEE)方法以形成更全面的嵌入表示。MoEE 主要有两种类型:

  • 基于连接的组合(MoEE(concat)):此方法较为简单,直接将路由权重和解码器嵌入进行连接,如公式所示。它能够保留每个路由权重捕获的独特信息,同时使下游任务能够利用组合后的表示。
  • 加权和集成(MoEE(sum)):该方法对由路由权重和隐藏状态(HS)嵌入计算出的相似度分数进行加权求和,记为 MoEE(sum)。其中,(\alpha) 是一个超参数,用于控制路由权重的贡献。在计算每对的相似度分数后,还需计算其与真实相似度之间的等级相关性(如 Spearman 等级相关性)。这种方法适用于比较两个句子的任务,如语义文本相似度任务。

在实际应用中,MoEE(concat) 较为易用。并且,研究者还利用 PromptEOL 技术来增强 MoEE。PromptEOL 技术通过提示特定模板来约束大语言模型预测下一个令牌中的语义信息,如在嵌入任务中使用的特定提示。从性能表现来看,MoEE 结合 PromptEOL 能够比有监督和自监督方法取得更好的效果。虽然其在排行榜上并非最新的最优结果,但它的价值在于无需进一步训练就能在嵌入任务中获得不错的结果。

二、MoEE 与 BERTopic 的实践应用

在这部分,我们将展示如何从预训练的 MoE 大语言模型中提取嵌入,并结合 BERTopic 使用 20 - news - group 数据集进行主题聚类。

(一)环境准备

我们采用 Python 3.10 的 conda 环境,在 Ubuntu 20.04 系统上进行实验,显卡配置为 cuda 12.4,16 GB VRAM。需要注意的是,下载模型权重可能需要 32 GB 内存。具体的环境搭建命令如下:

conda create -n moee python=3.10 -y
conda activate moee
pip install transformers torch bitsandbytes bertopic accelerate

由于 MoE 模型通常需要较高的 VRAM,我们需要使用 bitsandbytes 这个量化包来节省 VRAM 内存。同时,还需克隆官方 GitHub 仓库:

git clone https://github.com/tianyi-lab/MoE-Embedding.git

(二)利用 MoEE 进行主题聚类

这里我们以 OLMoE - 1B - 7B 模型为例,它在 16 GB VRAM 上运行推理较为可行。首先加载模型:

kwargs = {
    "base_model": 'allenai/OLMoE-1B-7B-0924',
    "normalized": False,
    "torch_dtype": torch.bfloat16,
    "mode": "embedding",
    "pooling_method": "mean",
    "attn_implementation": "sdpa",
    "attn": "bbcc"
}
config = {
    'embed_method': 'prompteol',
    'emb_info': 'MoEE'
}
embedding_model = MOEE(model_name_or_path='allenai/OLMoE-1B-7B-0924', **kwargs)

接着,计算 20 - news - group 数据集的嵌入并传递给 BERTopic:

from sklearn.datasets import fetch_20newsgroups
docs = fetch_20newsgroups(subset='all', remove=('headers', 'footers', 'quotes'))['data']
dataset = MyDataset(docs)
dataloader = DataLoader(dataset=dataset, batch_size=8)
embeddings = None
for batch in tqdm(dataloader):
    with torch.no_grad():
        embedding = embedding_model.encode(batch, **config)
        if embeddings is None:
            embeddings = embedding[0]
        else:
            embeddings = np.vstack((embeddings, embedding[0]))
torch.cuda.empty_cache()

在计算嵌入时,我们使用 torch.utils.data.DataLoader 作为迭代器,并对每个批次的文档进行编码。需要注意的是,传递给 BERTopic 的嵌入必须是 np.asarray 类型。

如果要使用自己的 MoE 模型,需要实现从每个 MoE 层获取路由权重的功能,而对于隐藏状态嵌入,则可以利用 HuggingFace 变压器函数,在推理时只需传递 output_hidden_states=True 参数即可。

完成嵌入计算后,就可以运行主题建模了:

umap_model = UMAP(n_neighbors=15, n_components=5, min_dist=0.0, metric='cosine')
hdbscan_model = HDBSCAN(min_cluster_size=15, metric='euclidean', cluster_selection_method='eom', prediction_data=True)
vectorizer_model = CountVectorizer(stop_words="english")
ctfidf_model = ClassTfidfTransformer()
representation_model = KeyBERTInspired()
topic_model = BERTopic(
    embedding_model=embedding_model,
    umap_model=umap_model,
    hdbscan_model=hdbscan_model,
    vectorizer_model=vectorizer_model,
    ctfidf_model=ctfidf_model,
    representation_model=representation_model
)
topics, probs = topic_model.fit_transform(docs, embeddings)

通过默认设置,我们得到了 42 个主题,从随机抽取的样本来看,能够很好地捕捉语义。同时,通过主题聚类可视化,我们可以清晰地看到不同主题之间的关联,如红色圆圈标记的主题 0 与计算机相关,其附近的主题也与机械相关词汇(如图形、数字、打印机等)有关。

这种方法表明,我们无需额外训练就能获得不错的嵌入效果。尽管与当前最优的有监督模型相比,在质量上还有提升空间,但这一研究成果无疑为无训练的嵌入提取方法的进一步改进迈出了重要一步。

以上就是今天的全部内容,如果您对人工智能技术感兴趣,欢迎关注我们的公众号,获取更多精彩内容!

[参考文献]

[1] Ziyue Li, Tianyi Zhou, YOUR MIXTURE - OF - EXPERTS LLM IS SECRETLY AN EMBEDDING MODEL FOR FREE (2024), Arxiv

[2] Omar S., et.al., Mixture of Experts Explained (2023), Hugging Face

[3] William Fedus, Barret Zoph., et.al., Switch Transformers: Scaling to Trillion Parameter Models with Simple and Efficient Sparsity (2021), Arxiv

[4] Ting Jiang, et.al., Scaling Sentence Embeddings with Large Language Models (2023), Arxiv

本文由mdnice多平台发布

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

cursor试用出现:Too many free trial accounts used on this machine 的解决方法

文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons:JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram,自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 ? 5 IDEA必装的插件&…

若依 ruoyi-vue HandlerInterceptor 拦截器 文件接口自定义权限

文件资源添加自定义权限 package com.huida.framework.config;import com.huida.framework.interceptor.FileInterceptor; import com.huida.framework.interceptor.RequestInterceptor; import org.springframework.beans.factory.annotation.Autowired; import org.springfr…

网络安全-web渗透环境搭建-BWAPP(基础篇)

01--所需系统环境: 虚拟主机系统部署(vmware,虚拟主机创建、虚拟主机网络配置(桥接,便于网络中多个主机都能访问虚拟主机)、虚拟软件功能,快照、克隆、镜像文件加载,ova文件制作&am…

【计算机网络】课程 实验四 配置快速生成树协议(RSTP)

实验四 配置快速生成树协议(RSTP) 一、实验目的 1.理解快速生成树协议RSTP的工作原理。 2.掌握如何在交换机上配置快速生成树。 二、实验分析与设计 【背景描述】 某学校为了开展计算机教学和网络办公,建立了一个计…

API架构风格的深度解析与选择策略:SOAP、REST、GraphQL与RPC

❃博主首页 &#xff1a; 「码到三十五」 &#xff0c;同名公众号 :「码到三十五」&#xff0c;wx号 : 「liwu0213」 ☠博主专栏 &#xff1a; <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 &#xff1a…

目标检测文献阅读-DETR:使用Transformer进行端到端目标检测

目录 摘要 Abstract 1 引言 2 DETR结构 2.1 Backbone 2.2 Encoder 2.3 Decoder 2.4 FFN 3 目标检测集合预测损失 3.1 二分图匹配损失 3.2 损失函数 总结 摘要 本周阅读的论文题目是《End-to-End Object Detection with Transformers》(使用Transformer进行端到端目…

服务器双网卡NCCL通过交换机通信

1、NCCL变量设置 export CUDA_DEVICE_MAX_CONNECTIONS1 export NCCL_SOCKET_IFNAMEeno2 export NCCL_IB_DISABLE0 #export NCCL_NETIB export NCCL_IB_HCAmlx5_0,mlx5_1 export NCCL_IB_GID_INDEX3 export NCCL_DEBUGINFOGPUS_PER_NODE4MASTER_ADDR192.168.1.2 MASTER_PORT600…

B树及其Java实现详解

文章目录 B树及其Java实现详解一、引言二、B树的结构与性质1、节点结构2、性质 三、B树的操作1、插入操作1.1、插入过程 2、删除操作2.1、删除过程 3、搜索操作 四、B树的Java实现1、节点类实现2、B树类实现 五、使用示例六、总结 B树及其Java实现详解 一、引言 B树是一种多路…

数据分析思维(八):分析方法——RFM分析方法

数据分析并非只是简单的数据分析工具三板斧——Excel、SQL、Python&#xff0c;更重要的是数据分析思维。没有数据分析思维和业务知识&#xff0c;就算拿到一堆数据&#xff0c;也不知道如何下手。 推荐书本《数据分析思维——分析方法和业务知识》&#xff0c;本文内容就是提取…

微信小程序用的SSL证书有什么要求吗?

微信小程序主要建立在手机端使用&#xff0c;然而手机又涉及到各种系统及版本&#xff0c;所以对SSL证书也有要求&#xff0c;如果要小程序可以安全有效的访问需要满足以下要求&#xff1a; 1、原厂SSL证书&#xff08;原厂封&#xff09;。 2、DV单域名或者DV通配符。 3、兼…

手动安装 Maven 依赖到本地仓库

文章目录 手动安装 Maven 依赖到本地仓库1. 下载所需的 JAR 文件2. 安装 JAR 文件到本地仓库3. 验证安装4. 在项目中使用该依赖 手动安装 Maven 依赖到本地仓库 遇到的问题&#xff1a; idea导入一个新的工程&#xff0c;发现pom文件中的一些依赖死活下载不下来&#xff0c;这…

VSCode Live Server 插件安装和使用

VSCode Live Server是一个由Ritwick Dey开发的Visual Studio Code扩展插件&#xff0c;它提供了一个带有实时重载功能的本地开发服务器。在VSCode中安装和使用Live Server插件进行实时预览和调试Web应用程序。这将大大提高前端开发效率&#xff0c;使网页设计和开发变得更为流畅…

UART串口数据分析

串口基础知识详细介绍&#xff1a; 该链接详细介绍了串并行、单双工、同异步、连接方式 https://blog.csdn.net/weixin_43386810/article/details/127156063 该文章将介绍串口数据的电平变化、波特率计算、脉宽计算以及数据传输量的计算。 捕获工具&#xff1a;逻辑分析仪&…

Internet协议原理

文章目录 考试说明Chapter 0: 本书介绍Chapter 1: Introduction And Overview 【第1章&#xff1a;引言与概述】Chapter 2: Overview Of Underlying Network Technologies 【第2章&#xff1a;底层网络技术的回顾】Chapter 3: Internetworking Concept And Architectural Model…

DeepSeek-V3 通俗详解:从诞生到优势,以及与 GPT-4o 的对比

1. DeepSeek 的前世今生 1.1 什么是 DeepSeek&#xff1f; DeepSeek 是一家专注于人工智能技术研发的公司&#xff0c;致力于打造高性能、低成本的 AI 模型。它的目标是让 AI 技术更加普惠&#xff0c;让更多人能够用上强大的 AI 工具。 1.2 DeepSeek-V3 的诞生 DeepSeek-V…

linux之自动挂载

如果想要实现自动挂载&#xff0c;应该挂在客户端&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 客户端&#xff1a; [rootlocalhost ~]# yum install nfs-utils -y &#xff08;下载软件&#xff09; [rootlocalhost ~]# systemctl start nfs-utils.servic…

RHCSA知识点汇总

第0章&#xff1a;Linux基础入门 0.1 什么是计算机 计算机的组成&#xff1a; 控制器&#xff1a;是整个计算机的中枢神经&#xff0c;根据程序要求进行控制&#xff0c;协调计算机各部分工作及内存与外设的访问等。 输入设备&#xff1a;将文字、数据、程序和控制命令等信…

交响曲-24-3-单细胞CNV分析及聚类

CNV概述 小于1kb是常见的插入、移位、缺失等的变异 人体内包含<10% 的正常CNV&#xff0c;我们的染色体数是两倍体&#xff0c;正常情况下&#xff0c;只有一条染色体表达&#xff0c;另一条沉默&#xff0c;当表达的那条染色体发生CNV之后&#xff0c;表达数量就会成倍增加…

【Linux-多线程】POSIX信号量-基于环形队列生产消费模型

POSIX信号量 POSIX信号量和System V信号量作用相同&#xff0c;都是用于同步操作&#xff0c;达到无冲突的访问共享资源的目的。但POSIX可以用于线程间同步 1.快速认识信号量接口 POSIX信号量分为两种类型&#xff1a; 命名信号量&#xff08;Named Semaphores&#xff09;&…

Linux下文件操作相关接口

文章目录 一 文件是什么普通数据文件 二 文件是谁打开的进程用户 三 进程打开文件的相关的接口c语言标准库相关文件接口1. fopen 函数2. fread 函数3. fwrite 函数4. fclose 函数5. fseek 函数 linux系统调用接口1. open 系统调用2. creat 系统调用3. read 系统调用4. write 系…