混合专家模型MoE的全面详解
什么是混合专家(MoE)?
混合专家(MoE)是一种利用多个不同的子模型(或称为“专家”)来提升LLM质量的技术。
MoE的两个主要组成部分是:
-
专家:每个前馈神经网络(FFNN)层现在都有一组“专家”,可以选择其中的一部分。这些“专家”通常也是FFNN。
-
路由或门控网络:决定哪些词元发送到哪些专家。
在每个具有MoE的模型层中,我们会找到(相对专业化的)专家:
需要注意的是,“专家”并不专注于特定领域,如“心理学”或“生物学”。专家在学习过程中最多只能掌握关于单词层面的句法信息:
更具体地说,专家的专长是在特定上下文中处理特定词元。
路由(门控网络)选择最适合特定输入的专家:
单个专家并不是整个LLM,而是LLM架构中的一个子模型部分。
专家
为了探讨专家的含义及其工作方式,我们首先需要了解MoE所替代的内容:密集层。
密集层
混合专家(MoE)始于LLM的相对基本功能,即前馈神经网络(FFNN)。
请记住,标准的仅解码Transformer架构在层归一化后应用FFNN:
FFNN使模型能够利用由注意力机制创建的上下文信息,进一步转化以捕捉数据中更复杂的关系。
然而,FFNN的规模会迅速增长。为了学习这些复杂关系,它通常会扩展接收到的输入:
稀疏层
传统Transformer中的FFNN被称为密集模型,因为所有参数(权重和偏置)都会被激活。没有任何东西被遗漏,所有东西都用于计算输出。
如果我们仔细观察密集模型,会发现输入在一定程度上激活了所有参数:
相比之下,稀疏模型仅激活其总参数的一部分,与混合专家密切相关。
为了说明这一点,我们可以将密集模型分割成片段(即专家),重新训练,并在给定时间仅激活一部分专家:
其基本思想是每个专家在训练过程中学习不同的信息。然后,在运行推理时,仅使用与特定任务最相关的专家。
当收到问题时,我们可以选择最适合特定任务的专家:
专家学习的内容
如前所述,专家学习到的信息比整个领域的信息更加精细。因此,称它们为“专家”有时被视为误导。
(ST-MoE论文中编码器模型的专家专业化)
然而,解码器模型中的专家似乎并没有同样类型的专业化。但这并不意味着所有专家都是平等的(具有相同的能力)。
Mixtral 8x7B论文(https://arxiv.org/pdf/2401.04088) 中有一个很好的例子,其中每个词元都标记了第一个专家的选择。
这一图片也表明,专家往往专注于句法而非特定领域。
因此,尽管解码器专家似乎没有专业化,但它们似乎在特定类型的词元上使用得相对一致。
专家的架构
尽管将专家可视化为切成块的密集模型的隐藏层很不错,但它们通常是完整的FFNN:
由于大多数LLM有多个解码器块,给定的文本在生成之前会经过多个专家:
选择的专家可能因词元而异,从而导致采取不同的“路径”:
如果我们更新解码器块的图解,它现在将包含更多的FFNN(每个专家各一个):
解码器块现在有多个FFNN(每个都是一个“专家”),可以在推理过程中使用。
路由机制
现在我们有了一组专家,那么模型如何知道使用哪些专家呢?
我们可以在专家层之前添加一个路由(也称为门控网络),它是专门训练用来选择针对特定词元的专家。
路由
路由(或门控网络)也是一个前馈神经网络(FFNN),用于根据特定输入选择专家。它可以输出概率,用于选择最匹配的专家:
专家层返回所选专家的输出,乘以门控值(选择概率)。
路由与专家(其中只有少数被选择)共同构成MoE层:
给定的MoE层有两种类型:稀疏混合专家或密集混合专家。
两者都使用路由器来选择专家,但稀疏MoE仅选择少数专家,而密集MoE则选择所有专家,但可能在不同的分布中。
例如,给定一组词元,MoE会将词元分配到所有专家,而稀疏MoE仅选择少数专家。
在当前的LLM状态下,当看到“MoE”时,通常指的是稀疏MoE,因为它允许使用一部分专家。这在计算上更为经济(消耗的资源更少),这是LLM的重要特性。
选择专家
门控网络可以说是任何MoE中最重要的组件,因为它不仅决定推理期间选择哪些专家,还决定训练时的选择。
在最基本的形式中,我们将输入(x)乘以路由权重矩阵(W):
然后,我们对输出应用SoftMax,创建每个专家的概率分布G(x):
路由使用这个概率分布来选择最匹配的专家。
最后,我们将每个路由的输出与每个选定的专家相乘,并将结果相加。
我们可以将所有内容结合在一起,探索输入如何通过路由和专家流动:
路由的复杂性
然而,这个简单的函数通常导致路由器选择相同的专家,因为某些专家可能学习得比其他专家更快:
这不仅会导致选择的专家分布不均,而且一些专家几乎无法受到训练。这在训练和推理期间都会产生问题。
相反,我们希望在训练和推理期间让专家之间保持均等的重要性,这称为负载均衡。这样可以防止对同一专家的过度拟合。
负载均衡
为平衡专家的重要性,我们需要把关注点放在路由上,因为它是在特定时间决定选用哪些专家的关键组件。
KeepTopK
对路由进行负载均衡的一种方式是借助"KeepTopK"(https://arxiv.org/pdf/1701.06538)直接扩展。通过引入可训练的(高斯)噪声,可以避免重复选择相同的专家。
然后,除了想要激活的前k个专家(例2)之外,其余专家的权重将被设置为-∞:
通过将这些权重设置为-∞,这些权重上的SoftMax输出所产生的概率将会是0:
尽管许多替代方案都很有前景,但许多语言模型仍然使用KeepTopK策略。请注意,KeepTopK也可以在不添加额外噪声的情况下使用。
-
词元选择
KeepTopK策略将每个词元路由到少数选定的专家。这种方法称为词元选择,它允许将给定的词元发送给一个专家(top-1路由):
或者发送给多个专家(top-k路由):
一个主要的好处是它允许权衡和整合专家各自的贡献。
-
辅助损失
为了在训练期间使专家的分布更加均匀,辅助损失(也称为负载均衡损失)被添加到网络的常规损失中。
它增加了一个约束条件,迫使专家具有同等的重要性。
这个辅助损失的第一个组成部分是对整个批次中每个专家的路由值进行求和:
这为我们提供了每个专家的重要性得分,它代表了在任何输入下,给定专家被选中的可能性。
我们可以用这个来计算变异系数(CV),它告诉我们专家之间的重要性得分有多大差异。
例如,如果重要性得分有很大差异,变异系数就会很高:
相反,如果所有专家的重要性得分相似,变异系数就会很低(这是我们的目标):
利用这个变异系数得分,我们可以在训练期间更新辅助损失,使其目标是尽可能降低变异系数得分(从而给予每个专家同等的重要性):
最后,辅助损失被单独添加进来,作为一个独立的损失项在训练期间进行优化。
专家容量
不平衡现象不仅存在于被选中的专家中,还存在于发送给专家的词元分布中。
例如,如果输入的词元在分配给不同专家时比例失调,过多地发送给一个专家而较少地发送给另一个专家,那么可能会出现训练不足的问题。
这里,问题不仅仅在于使用了哪些专家,还在于对它们的使用程度。
这个问题的一个解决方案是限制给定专家可以处理的词元数量,即专家容量。当一位专家达到其容量时,后续的词元将被发送给下一位专家:
如果两位专家都达到了他们的容量,那么该词元将不会被任何专家处理,而是被发送到下一层。这被称为词元溢出(token overflow)。
借助Switch Transformer简化MoE
首批解决了基于Transformer的MoE(例如负载均衡等)训练不稳定性问题的模型之一是Switch Transformer。它极大地简化了架构和训练过程,同时提高了训练的稳定性。
-
切换层
Switch Transformer是一个T5模型(编码器-解码器),它用切换层取代了传统的前馈神经网络层。切换层是一个稀疏的MoE层,它为每个词元选择一个专家(Top-1路由)。
路由在计算选择哪个专家时没有特殊技巧,它只是对输入乘以专家权重后的结果取Softmax(与我们之前所做的相同)。
这种架构(Top-1 路由)假定路由只需要一个专家就能学会如何对输入进行路由。这与我们之前看到的情况形成对比,之前我们假设词元应该被路由到多个专家(Top-k 路由)以学习路由行为。
-
容量因子
容量因子是一个重要的值,因为它决定了一个专家能够处理多少个词元。Switch Transformer在此基础上进行了扩展,直接引入了一个容量因子,它对专家容量产生直接影响。
专家容量的组成部分很直接:
如果我们增加容量因子,每个专家将能够处理更多的词元。
然而,如果容量因子太大,我们会浪费计算资源。相反,如果容量因子太小,由于词元溢出,模型性能将会下降。
-
辅助损失
为了进一步防止丢弃词元,引入了一个简化版的辅助损失。
这个简化后的损失并非去计算变异系数,而是依据每个专家的路由概率所占的比例,来对分配给各个专家的词元的比例进行权衡。
由于目标是在N个专家之间实现词元的均匀路由,我们希望向量P和f的值为 1/N。
α是一个超参数,我们可以在训练期间使用它来微调这个损失的重要性。过高的值将主导主要的损失函数,而过低的值对负载均衡的作用很小。
视觉模型中的混合专家
混合专家(MoE)技术并非仅适用于语言模型。视觉模型(例如视觉transformerViT)利用基于transformer的架构,因此也有使用混合专家的潜力。
ViT(视觉transformer)是一种将图像分割成小块(patch)的架构,这些小块的处理方式与词元类似。
这些小块(或词元)随后被映射到嵌入中(带有额外的位置嵌入),然后再输入到常规编码器中:
这些小块一旦进入编码器,就会像词元一样被处理,这使得这种架构非常适合用于混合专家。
视觉混合专家(Vision-MoE)
视觉混合专家(V-MoE)是在图像模型中最早实现混合专家的方法之一。它采用我们之前看到的视觉变换器(ViT),并将编码器中的密集前馈神经网络替换为稀疏混合专家(Sparse MoE)。
这使得通常比语言模型规模更小的ViT模型能够通过添加专家而大规模扩展。
由于图像通常有很多小块,所以为每个专家使用了一个预先定义的小专家容量,以减少硬件限制。然而,低容量往往会导致小块被丢弃(类似于词元溢出)。
为了保持低容量,网络为小块分配重要性得分,并首先处理那些重要的小块,这样溢出的小块通常就不太重要了。这被称为批量优先级路由。
因此,如果词元的百分比降低,我们仍然应该看到重要的小块被路由。
优先级路由通过专注于最重要的小块,使得较少的小块被处理。
从稀疏混合专家到软混合专家
在视觉混合专家(V-MoE)中,优先级评分器有助于区分更重要和不太重要的小块。然而,小块被分配给每个专家,未处理小块中的信息会丢失。
软混合专家(Soft-MoE)旨在通过混合小块将离散的小块(词元)分配转变为软小块(词元)。
在第一步中,我们将输入x(小块嵌入)与一个可学习的矩阵Φ相乘。这为我们提供了路由信息,告诉我们某个词元与给定专家的相关程度。
然后,通过对路由信息矩阵(在列上)取Softmax,我们更新每个小块的嵌入。
更新后的小块嵌入本质上是所有小块嵌入的加权平均值。
从视觉上看,就好像所有小块都被混合了。然后,这些组合后的小块被发送给每个专家。在生成输出后,它们再次与路由矩阵相乘。
路由矩阵在词元级别影响输入,在专家级别影响输出。
结果,我们得到了被处理的“软”小块/词元,而不是离散的输入。
Mixtral 8x7B的活跃参数与稀疏参数
混合专家之所以有趣的很大一部分原因在于其计算需求。由于在给定时间只使用一部分专家,所以我们可以访问比实际使用更多的参数。
虽然给定的混合专家模型有更多的参数要加载(稀疏参数),但由于在推理期间我们只使用一些专家,所以激活的参数较少(活跃参数)。
换句话说,我们仍然需要将整个模型(包括所有专家)加载到你的设备上(稀疏参数),但当我们进行推理时,我们只需要使用一部分(活跃参数)。混合专家模型需要更多的显存(VRAM)来加载所有专家,但在推理期间运行得更快。
让我们以Mixtral 8x7B来探讨稀疏参数与活跃参数的数量。
在这里,我们可以看到每个专家的大小是5.6B,而不是7B(尽管有8个专家)。
我们将不得不加载8×5.6B(46.7B)的参数(以及所有共享参数),但在推理时我们只需要使用2×5.6B(12.8B)的参数。
总结
至此,我们对混合专家的探索之旅就结束了。希望这篇文章能让你更好地理解这一有趣技术的潜力。如今,几乎所有的模型系列中都至少包含一种混合专家的变体,它将会持续存在下去。
相关文章:
混合专家模型MoE的全面详解
什么是混合专家(MoE)? 混合专家(MoE)是一种利用多个不同的子模型(或称为“专家”)来提升LLM质量的技术。 MoE的两个主要组成部分是: 专家:每个前馈神经网络(…...
vue3相关知识点
title: vue_1 date: 2025-01-28 12:00:00 tags:- 前端 categories:- 前端vue3 Webpack ~ vite vue3是基于vite创建的 vite 更快一点 一些准备工作 准备后如图所示 插件 Main.ts // 引入createApp用于创建应用 import {createApp} from vue // 引入App根组件 import App f…...
【2025美赛D题】为更美好的城市绘制路线图建模|建模过程+完整代码论文全解全析
你是否在寻找数学建模比赛的突破点?数学建模进阶思路! 作为经验丰富的美赛O奖、国赛国一的数学建模团队,我们将为你带来本次数学建模竞赛的全面解析。这个解决方案包不仅包括完整的代码实现,还有详尽的建模过程和解析,…...
games101-(5/6)
光栅化 投影完成之后,视图区域被确定在从[-1,1]的单位矩阵中,下一步就是光栅化 长宽比:ratio 垂直的可视角度:fild-of-view 可以看到的y 轴的范围,角度越小 越接近正交投影 屏幕坐标系 、 将多边形转化成像素 显示…...
UE5.3 C++ CDO的初步理解
一.UObject UObject是所有对象的基类,往上还有UObjectBaseUtility。 注释:所有虚幻引擎对象的基类。对象的类型由基于 UClass 类来定义。 这为创建和使用UObject的对象提供了 函数,并且提供了应在子类中重写的虚函数。 /** * The base cla…...
前端——js高级25.1.27
复习:对象 问题一: 多个数据的封装提 一个对象对应现实中的一个事物 问题二: 统一管理多个数据 问题三: 属性:组成:属性名属性值 (属性名为字符串,属性值任意) 方…...
Python 魔术方法
1. 什么是魔术方法 在 Python 中,魔术方法(Magic Methods),又叫 特殊方法 或 双下方法,是以两个下划线(__)开头和结尾的方法。 这些方法为 Python 提供了对类和对象的特殊操作功能,…...
websocket webworker教程及应用
WebSocket 和 Web Workers 是两种不同的 Web 技术,分别用于实现实时通信和后台线程处理。以下是它们的简要教程: WebSocket 教程 1. 什么是 WebSocket? WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。它允许服务器主动向客户端推…...
qwen2.5-vl:阿里开源超强多模态大模型(包含使用方法、微调方法介绍)
1.简介 在 Qwen2-VL 发布后的五个月里,众多开发者基于该视觉语言模型开发了新的模型,并向 Qwen 团队提供了极具价值的反馈。在此期间,Qwen 团队始终致力于打造更具实用性的视觉语言模型。今天,Qwen 家族的最新成员——Qwen2.5-VL…...
PaddleSeg 从配置文件和模型 URL 自动化运行预测任务
git clone https://github.com/PaddlePaddle/PaddleSeg.git# 在ipynb里面运行 cd PaddleSegimport sys sys.path.append(/home/aistudio/work/PaddleSeg)import os# 配置文件夹路径 folder_path "/home/aistudio/work/PaddleSeg/configs"# 遍历文件夹,寻…...
Java实战项目-基于 springboot 的校园选课小程序(附源码,部署,文档)
Java 基于 springboot 的校园选课小程序 博主介绍:✌程序员徐师兄、8年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战*✌ 🍅文末获取源码联系🍅 👇&…...
网络工程师 (7)进程管理
一、进程相关的概念 (一)定义 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,也是操作系统结构的基础。进程是程序的一次执行实例,具有动…...
大屏 UI 设计风格的未来趋势
在科技飞速革新的时代,大屏设备的应用领域不断拓展,从城市的智能交通指挥中心,到商场的互动广告大屏,再到家庭的超大尺寸智能电视,大屏已然成为信息展示与交互的关键载体。大屏 UI 设计风格也随之不断演变,…...
Kmesh v1.0 正式发布
2025 年 1 月 23 日,Kmesh 团队正式发布了 Kmesh v1.0235。Kmesh 作为一款开源的服务网格解决方案,v1.0 版本在网络流量管理领域引入了多项重磅特性2。具体如下134: IPsec 加密通信:引入 IPsec 加密协议,将节点间流量加…...
低代码系统-产品架构案例介绍、轻流(九)
轻流低代码产品定位为零代码产品,试图通过搭建来降低企业成本,提升业务上线效率。 依旧是从下至上,从左至右的顺序 名词概述运维层底层系统运维层,例如上线、部署等基础服务体系内置的系统能力,发消息、组织和权限是必…...
深入理解动态规划(dp)--(提前要对dfs有了解)
前言:对于动态规划:该算法思维是在dfs基础上演化发展来的,所以我不想讲的是看到一个题怎样直接用动态规划来解决,而是说先用dfs搜索,一步步优化,这个过程叫做动态规划。(该文章教你怎样一步步的…...
C++传送锚点的内存寻址:内存管理
文章目录 1.C/C内存分布回顾2.C内存管理2.1 内存申请2.2 operator new与operator delete函数2.3 定位new表达式 3.关于内存管理的常见知识点3.1 malloc/free和new/delete的区别3.2 内存泄漏 希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力! 继C语…...
webAPI -DOM 相关知识点总结(非常细)
title: WebAPI语法 date: 2025-01-28 12:00:00 tags:- 前端 categories:- 前端WEB API 了解DOM的结构并掌握其基本的操作,体验 DOM 在开发中的作用 API简介 就是使用js来操作html和浏览器 什么是DOM? 就是一个文档对象模型,是用来呈现预计于任意htm…...
Deepseek的RL算法GRPO解读
在本文中,我们将深入探讨Deepseek采用的策略优化方法GRPO,并顺带介绍一些强化学习(Reinforcement Learning, RL)的基础知识,包括PPO等关键概念。 策略函数(policy) 在强化学习中, a…...
设计模式的艺术-策略模式
行为型模式的名称、定义、学习难度和使用频率如下表所示: 1.如何理解策略模式 在策略模式中,可以定义一些独立的类来封装不同的算法,每个类封装一种具体的算法。在这里,每个封装算法的类都可以称之为一种策略(Strategy…...
MyBatis 写法
MyBatis 高效使用技巧 常见 MyBatis 使用技巧,这些技巧有助于简化数据库操作,提高开发效率,并增强系统的性能。 1. 动态 SQL 动态 SQL 让开发者能够依据参数灵活地构建 SQL 语句,避免了手动拼接字符串带来的复杂性和错误风险。…...
Git图形化工具【lazygit】
简要介绍一下偶然发现的Git图形化工具——「lazygit」 概述 Lazygit 是一个用 Go 语言编写的 Git 命令行界面(TUI)工具,它让 Git 操作变得更加直观和高效。 Github地址:https://github.com/jesseduffield/lazygit 主要特点 主要…...
K8s运维管理平台 - xkube体验:功能较多
目录 简介Lic安装1、需要手动安装MySQL,**建库**2、启动命令3、[ERROR] GetNodeMetric Fail:the server is currently unable to handle the request (get nodes.metrics.k8s.io qfusion-1) 使用总结优点优化 补充1:layui、layuimini和beego的详细介绍1.…...
5.3.1 软件设计的基本任务
文章目录 软件设计解决的问题概要设计基本任务详细设计基本任务 软件设计解决的问题 需求分析解决“做什么”的问题,软件设计解决“如何做”的问题。软件设计分为概要设计、详细设计两块。概要设计是设计软件和数据的总体框架,比详细设计的颗粒度更大。详…...
Go学习:字符、字符串需注意的点
Go语言与C/C语言编程有很多相似之处,但是Go语言中在声明一个字符时,数据类型与其他语言声明一个字符数据时有一点不同之处。通常,字符的数据类型为 char,例如 :声明一个字符 (字符名称为 ch) 的语句格式为 char ch&am…...
LabVIEW无线齿轮监测系统
本案例介绍了基于LabVIEW的无线齿轮监测系统设计。该系统利用LabVIEW编程语言和改进的天牛须算法优化支持向量机,实现了无线齿轮故障监测。通过LabVIEW软件和相关硬件,可以实现对齿轮箱振动信号的采集、传输和故障识别,集远程采集、数据库存储…...
基于SpringBoot的租房管理系统(含论文)
基于SpringBoot的租房管理系统是一个集订单管理、房源信息管理、屋主申诉处理、用户反馈等多项功能于一体的系统。该系统通过SpringBoot框架开发,拥有完善的管理员后台、屋主管理模块、用户功能模块等,适用于房地产租赁平台或中介公司进行日常管理与运营…...
剑指 Offer II 008. 和大于等于 target 的最短子数组
comments: true edit_url: https://github.com/doocs/leetcode/edit/main/lcof2/%E5%89%91%E6%8C%87%20Offer%20II%20008.%20%E5%92%8C%E5%A4%A7%E4%BA%8E%E7%AD%89%E4%BA%8E%20target%20%E7%9A%84%E6%9C%80%E7%9F%AD%E5%AD%90%E6%95%B0%E7%BB%84/README.md 剑指 Offer II 008.…...
【微服务与分布式实践】探索 Eureka
服务注册中心 心跳检测机制:剔除失效服务自我保护机制 统计心跳失败的比例在15分钟之内是否低于85%,如果出现低于的情况,Eureka Server会将当前的实例注册信息保护起来,让这些实例不会过期。当节点在短时间内丢失过多的心跳时&am…...
关于opencv环境搭建问题:由于找不到opencv_worldXXX.dll,无法执行代码,重新安装程序可能会解决此问题
方法一:利用复制黏贴方法 打开opencv文件夹目录找到\opencv\build\x64\vc15\bin 复制该目录下所有文件,找到C:\Windows\System32文件夹(注意一定是C盘)黏贴至该文件夹重新打开VS。 方法二:直接配置环境 打开opencv文…...
重构字符串(767)
767. 重构字符串 - 力扣(LeetCode) 解法: class Solution { public:string reorganizeString(string s){string res;//因为1 < s.length < 500 , uint64_t 类型足够uint16_t n s.size();if (n 0) {return res;}unordere…...
【MQ】如何保证消息队列的高性能?
零拷贝 Kafka 使用到了 mmap 和 sendfile 的方式来实现零拷贝。分别对应 Java 的 MappedByteBuffer 和 FileChannel.transferTo 顺序写磁盘 Kafka 采用顺序写文件的方式来提高磁盘写入性能。顺序写文件,基本减少了磁盘寻道和旋转的次数完成一次磁盘 IO࿰…...
通义灵码插件保姆级教学-IDEA(安装及使用)
一、JetBrains IDEA 中安装指南 官方下载指南:通义灵码安装教程-阿里云 步骤 1:准备工作 操作系统:Windows 7 及以上、macOS、Linux; 下载并安装兼容的 JetBrains IDEs 2020.3 及以上版本,通义灵码与以下 IDE 兼容&…...
babylon.js-3:了解STL网格模型
网格模型上色 本篇文章主要介绍如何在 BabylonJS 中实现STL网格模型上色。 文章目录 网格模型上色运用场景概要延申正文加载器库的支持认识 OBJ 和 STL 文件GUI 色板选择器网格模型异步加载加载动画网格模型上色官方即将弃用 ImportMesh 而推荐使用 ImportMeshAsync 说明OBJ …...
面向对象设计(大三上)--往年试卷题+答案
目录 1. UML以及相关概念 1.1 动态图&静态图 1.2 交互图 1.3 序列图 1.4 类图以及关联关系 1.4.1类图 1.4.2 关系类型 (1) 用例图中的包含、扩展关系(include & extend) (2) 类图中的聚合、组合关系(aggragation & composition) 1.5 图对象以及职责划…...
Java基础知识总结(二十四)--Collections
它的出现给集合操作提供了更多的功能。这个类不需要创建对象,内部提供的都是静态方法。 静态方法: Collections.sort(list);//list集合进行元素的自然顺序排序。 Collections.sort(list,new ComparatorByLen());//按指定的比较器方法排序。 class Co…...
大语言模型的API接口如何操作
选择大语言模型 根据自身需求和应用场景选择合适的大语言模型,如 OpenAI 的 GPT 系列、百度的文心一言、智谱的 GLM 等。需要考虑模型的性能、功能特点、适用领域、成本等因素。 获取 API 密钥和凭证 注册账号:访问所选大语言模型的官方平台或相关开发…...
【漫话机器学习系列】067.希腊字母(greek letters)-写法、名称、读法和常见用途
希腊字母(Greek Letters) 希腊字母在数学、科学、工程学和编程中广泛使用,常用于表示变量、常量、参数、角度等。以下是希腊字母的完整列表及其常见用途。 大写与小写希腊字母表 大写小写名称(英文)名称(…...
Kotlin判空辅助工具
1)?.操作符 //执行逻辑 if (person ! null) {person.doSomething() } //表达式 person?.doSomething() 2)?:操作符 //执行逻辑 val c if (a ! null) {a } else {b } //表达式 val c a ?: b 3)!!表达式 var message: String? &qu…...
【Python-办公自动化】实现自动化输出json数据类型的分析报告和正逆转换
分析报告 import json from pprint import pprint, PrettyPrinterdef analyze_energy_data(file_path):"""能源数据分析与结构查看函数参数:file_path (str): JSON文件路径功能:1. 加载并解析JSON数据2. 显示数据结构概览3. 交互式结构探索"""…...
深入理解指针(2)
数组名的理解 什么是数组名?在计算机编程中,数组名是用于标识一个数组的名称。那应当如何来理解数组名呢?事实上,在数组中数组名就是数组首元素的地址。 示例1: #include<stdio.h> int main() {int arr[10] …...
SOME/IP--协议英文原文讲解3
前言 SOME/IP协议越来越多的用于汽车电子行业中,关于协议详细完全的中文资料却没有,所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块: 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 Note: Thi…...
计算机网络之计算机网络主要性能
一、速率与带宽 速率: 定义:数据的传送速率,也称数据率或比特率,表示单位时间内传输的比特数。 单位:比特/秒(bit/s),常用单位有千比特/秒(kb/s)、兆比特/秒…...
家居 EDI:Haverty‘s EDI 需求分析
Havertys 成立于 1885 年,是一家历史悠久的美国家具零售商。公司致力于为客户提供高品质的家具和家居饰品,其产品线涵盖客厅、卧室、餐厅及办公家具等多个领域。 电子数据交换(EDI)是一种通过标准化电子格式在商业伙伴之间进行数据…...
JavaScript - Web APIs(上)
Web API 介绍 严格意义上讲,我们在 JavaScript 阶段学习的知识绝大部分属于 ECMAScript 的知识体系,ECMAScript 简称 ES 它提供了一套语言标准规范,如变量、数据类型、表达式、语句、函数等语法规则都是由 ECMAScript 规定的。浏览器将 ECM…...
【漫话机器学习系列】068.网格搜索(GridSearch)
网格搜索(Grid Search) 网格搜索(Grid Search)是一种用于优化机器学习模型超参数的技术。它通过系统地遍历给定的参数组合,找出使模型性能达到最优的参数配置。 网格搜索的核心思想 定义参数网格 创建一个包含超参数值…...
MySQL 的索引类型【图文并茂】
基本分类 文本生成MindMap:https://app.pollyoyo.com/planttext <style> mindmapDiagram {node {BackgroundColor yellow}:depth(0) {BackGroundColor SkyBlue}:depth(1) {BackGroundColor lightGreen} } </style> * MySQL 索引** 数据结构角度 *** B树索引*** 哈…...
OSCP:发送钓鱼电子邮件执行客户端攻击
概述 在渗透测试领域,钓鱼攻击是一种有效的客户端攻击手段,尤其在目标用户缺乏安全意识或系统存在未修复漏洞时,成功率较高。针对Windows平台,滥用Windows库文件(.Library-ms)是一种技术性较强但易于实施的…...
Oracle 普通用户连接hang住处理方法
一、现象说明 $ sqlplus / as sysdbaSQL*Plus: Release 19.0.0.0.0 - Production on Wed Dec 18 16:49:19 2024 Version 19.11.0.0.0Copyright (c) 1982, 2020, Oracle. All rights reserved.Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Pro…...
C++ ——— 学习并使用 priority_queue 类
目录 何为 priority_queue 类 学习并使用 priority_queue 类 实例化一个 priority_queue 类对象 插入数据 遍历堆(默认是大堆) 通过改变实例化的模板参数修改为小堆 何为 priority_queue 类 priority_queue 类为 优先级队列,其本质就是…...