20240621日志:大模型压缩-从闭源大模型蒸馏

目录

  • 1. 核心内容
  • 2. 方法
    • 2.1 先验估计
    • 2.2 后验估计
    • 2.3 目标函数
  • 3. 交叉熵损失函数与Kullback-Leibler(KL)损失函数

location:beijing
涉及知识:大模型压缩、知识蒸馏
在这里插入图片描述

Fig. 1 大模型压缩-知识蒸馏

1. 核心内容

本文提出在一个贝叶斯估计框架内估计闭源语言模型的输出分布,包括先验估计和后验估计。先验估计的目的是通过闭源模型生成的语料库(可能包含模型的粗粒度信息)得到先验分布;后验估计使用代理模型来更新先验分布并生成后验分布。利用这两个分布来进行知识蒸馏。

2. 方法

该文章的创新点是在知识蒸馏的过程中,使用一个代理模型作为教师模型和学生模型的中介,该项目配置如Table. 1

Table. 1 项目配置
项目方法
benchmarksBBH\ARC\AGIEval\MMLU\CSQA\GSM8K\
teacher modelGPT-4
proxy modelLLaMA-33B
student modelLLaMA-7B/13B

一些参数表示如下表

Table. 2 参数表示
变量含义
T \mathcal{T} T闭源的教师模型
S \mathcal{S} S学生模型
M \mathcal{M} M开源的代理模型
X X X输入的token序列
Y Y Y输出的token序列
p Y t p_{Y_t} pYt T \mathcal{T} T输出的概率Pr ( Y t ( Y_{t} (Yt | X , Y < t ) X, Y_{< t}) X,Y<t)
q Y t q_{Y_t} qYt S \mathcal{S} S输出的概率Pr ( Y t (Y_{t} (Yt | X , Y < t ) X,Y_{<t}) X,Y<t)
P Y t P_{Y_t} PYt p Y t p_{Y_t} pYt相关的离散随机变量

用指示函数 I Y t = w \mathbb{I}_{Y_t=\boldsymbol{w}} IYt=w(其实不是空心的I应该是空心的1,没法在CSDN打出来)表示 T \mathcal{T} T t t t时刻产生的one-hot编码标签。
传统的目标函数可以表示为
L t traditional = − ∑ w ∈ V I Y t = w log ⁡ q Y t = w + ∑ w ∈ V p Y t = w log ⁡ p Y t = w q Y t = w (1) \mathcal{L}_{t}^{\text{traditional}}=-\sum_{w\in\mathbb{V}}\mathbb{I}_{Y_{t}=w}\log q_{Y_{t}=w}+\sum_{w\in\mathbb{V}}p_{Y_{t}=w}\log\frac{p_{Y_{t}=w}}{q_{Y_{t}=w}}\tag{1} Lttraditional=wVIYt=wlogqYt=w+wVpYt=wlogqYt=wpYt=w(1)式中 V \mathbb{V} V表示词典, w w w是词典中的一个token,可以看出, L t traditional \mathcal{L}_{t}^{\text{traditional}} Lttraditional由两部分组成,第一部分表示由硬标签(Fig.2)产出的交叉熵损失(交叉熵与相对熵在第三章详细说明),第二部分表示用软标签计算出的KL损失,一般情况下由于 p Y t p_{Y_{t}} pYt很难得到,第二项是被忽略的。
在这里插入图片描述

Fig.2 硬标签与软标签

这篇论文就是解决第二项的问题。

2.1 先验估计

先验估计的目的是使用 T \mathcal{T} T生成的语料库 C \mathcal{C} C,得到每一步 t t t的近似 p Y t p_{Y_{t}} pYt的粗粒度估计 p ^ Y t \hat{p}_{Y_t} p^Yt,来自改良的n-gram算法(基于第n个项目的出现只与前面n-1个项目有关)来实现,对于给定一个输出token序列 Y ≤ t ∈ C Y_{\leq t}\in\mathcal{C} YtC,假设 Y t = w t Y_{t}=w_t Yt=wt其中 w t w_t wt V \mathbb{V} V中的一个token,对于 V \mathbb{V} V中的某个token w w w如果有 w = w t w=w_t w=wt,有
p ^ Y t = w = # ( Y t = w , Y t − 1 = w t − 1 , … , Y t − n = w t − n ) γ # ( Y t − 1 = w t − 1 , … , Y t − n = w t − n ) + γ − 1 γ (2) \hat{p}_{Y_t=w}=\frac{\#(Y_t=w,Y_{t-1}=w_{t-1},\ldots,Y_{t-n}=w_{t-n})}{\gamma\#(Y_{t-1}=w_{t-1},\ldots,Y_{t-n}=w_{t-n})}+\frac{\gamma-1}{\gamma}\tag{2} p^Yt=w=γ#(Yt1=wt1,,Ytn=wtn)#(Yt=w,Yt1=wt1,,Ytn=wtn)+γγ1(2)或者
p ^ Y t = w = # ( Y t = w , Y t − 1 = w t − 1 , … , Y t − n = w t − n ) γ # ( Y t − 1 = w t − 1 , … , Y t − n = w t − n ) (3) \hat{p}_{Y_t=w}=\frac{\#(Y_t=w,Y_{t-1}=w_{t-1},\ldots,Y_{t-n}=w_{t-n})}{\gamma\#(Y_{t-1}=w_{t-1},\ldots,Y_{t-n}=w_{t-n})}\tag{3} p^Yt=w=γ#(Yt1=wt1,,Ytn=wtn)#(Yt=w,Yt1=wt1,,Ytn=wtn)(3)式中, # \# #代表语料库 C \mathcal{C} C中出现某一token的数量, n n n代表窗口大小, γ \gamma γ是个超参数,由此可得到一个 p Y t p_{Y_{t}} pYt的粗略估计 p ^ Y t \hat{p}_{Y_t} p^Yt

2.2 后验估计

后验估计用来改善先验估计,后验估计使用贝叶斯估计框架,引入 T \mathcal{T} T的一个代理模型 M \mathcal{M} M(大于 S \mathcal{S} S), M \mathcal{M} M已经由 T \mathcal{T} T生成的 C \mathcal{C} C微调,该估计使用代理 M \mathcal{M} M生成的连续样本来细化 p ^ Y t \hat{p}_{Y_{t}} p^Yt
假设 p Y t p_{Y_{t}} pYt的值可以用一个离散(更好理解)的随机变量 P Y t P_{Y_t} PYt描述, P Y t P_{Y_t} PYt的数值取自m个数值 p 1 , p 2 , … , p m p^{1},p^{2},\ldots,p^{m} p1,p2,,pm,在0~1服从均匀分布。根据 p ^ Y t \hat{p}_{Y_t} p^Yt,可以重写 P Y t P_{Y_t} PYt的概率质量函数(连续的叫概率密度函数,离散的叫这个)为
E ( P Y t ) = ∑ i = 1 m p i Pr ⁡ ( P Y t = p i ) = p ^ Y t (4) \mathbb{E}(P_{Y_t})=\sum_{i=1}^mp^i\Pr(P_{Y_t}=p^i)=\hat{p}_{Y_t}\tag{4} E(PYt)=i=1mpiPr(PYt=pi)=p^Yt(4)
只要期望 E ( P Y t ) = p ^ Y t \mathbb{E}(P_{Y_t})=\hat{p}_{Y_t} E(PYt)=p^Yt,概率质量函数就可以变化。把 X X X Y < t Y_{<t} Y<t喂给 M \mathcal{M} M得到 t t t时刻的样本 w ^ ∈ V \hat{w}\in\mathbb{V} w^V,给定 w ^ \hat{w} w^ w ∈ V w\in\mathbb{V} wV,事件 A A A定义为如果 w ^ = w \hat{w}=w w^=w,A=1;否则A=0。
如果事件A=1发生,根据贝叶斯定理:
Pr ⁡ ( P Y t = w = p i ∣ A = 1 ) ∝ Pr ⁡ ( A = 1 ∣ P Y t = w = p i ) Pr ⁡ ( P Y t = w = p i ) = p i Pr ⁡ ( P Y t = w = p i ) (5) \Pr(P_{Y_t=w}=p^i|A=1)\propto\Pr(A=1|P_{Y_t=w}=p^i)\Pr(P_{Y_t=w}=p^i)=p^i\Pr(P_{Y_t=w}=p^i)\tag{5} Pr(PYt=w=piA=1)Pr(A=1∣PYt=w=pi)Pr(PYt=w=pi)=piPr(PYt=w=pi)(5)式中 w ∈ V , i ∈ { 1 , 2 , … , m } w\in\mathbb{V},i\in\{1,2,\ldots,m\} wV,i{1,2,,m},通过下式得出一个归一化因子,则 Pr ⁡ ( P Y t = w = p i ∣ A = 1 ) \operatorname*{Pr}(P_{Y_{t}=w}=p^{i}|A=1) Pr(PYt=w=piA=1)可以用 1 η p i Pr ⁡ ( P Y t = w = p i ) \frac1\eta p^i\Pr(P_{Y_t=w}=p^i) η1piPr(PYt=w=pi)来计算
η = ∑ i = 1 m p i Pr ⁡ ( P Y t = w = p i ) (6) \eta=\sum_{i=1}^mp^i\Pr(P_{Y_t=w}=p^i)\tag{6} η=i=1mpiPr(PYt=w=pi)(6)如果事件A=0发生,根据贝叶斯定理:
Pr ⁡ ( P Y t = w = p i ∣ A = 0 ) ∝ Pr ⁡ ( A = 0 ∣ P Y t = w = p i ) Pr ⁡ ( P Y t = w = p i ) = ( 1 − p i ) Pr ⁡ ( P Y t = w = p i ) (7) \Pr(P_{Y_{t}=w}=p^{i}|A=0)\propto\Pr(A=0|P_{Y_{t}=w}=p^{i})\Pr(P_{Y_{t}=w}=p^{i})=(1-p^{i})\Pr(P_{Y_{t}=w}=p^{i})\tag{7} Pr(PYt=w=piA=0)Pr(A=0∣PYt=w=pi)Pr(PYt=w=pi)=(1pi)Pr(PYt=w=pi)(7)式中 w ∈ V , i ∈ { 1 , 2 , … , m } w\in\mathbb{V},i\in\{1,2,\ldots,m\} wV,i{1,2,,m},同样通过下式得出一个归一化因子
η = ∑ i = 1 m ( 1 − p i ) Pr ⁡ ( P Y t = w = p i ) (8) \begin{aligned}\eta=\sum_{i=1}^m{(1-p^i)}\Pr(P_{Y_t=w}=p^i)\end{aligned}\tag{8} η=i=1m(1pi)Pr(PYt=w=pi)(8) Pr ⁡ ( P Y t = w = p i ∣ A = 0 ) \operatorname*{Pr}(P_{Y_{t}=w}=p^{i}|A=0) Pr(PYt=w=piA=0)可由 1 η ( 1 − p i ) Pr ⁡ ( P Y t = w = p i ) \frac1\eta(1-p^i)\Pr(P_{Y_t=w}=p^i) η1(1pi)Pr(PYt=w=pi)得出。
这样在A无论为0还是1都能有所替换,一次迭代结束, P r ( P Y t = p i ) \mathrm{Pr}(P_{Y_{t}}=p^{i}) Pr(PYt=pi) Pr ⁡ ( P Y t = w = p i ∣ A = 0 ) \operatorname*{Pr}(P_{Y_{t}=w}=p^{i}|A=0) Pr(PYt=w=piA=0) Pr ⁡ ( P Y t = w = p i ∣ A = 1 ) \operatorname*{Pr}(P_{Y_{t}=w}=p^{i}|A=1) Pr(PYt=w=piA=1)替换,然后进入下一次迭代。经过多轮采样,可以得到最终的概率质量函数 Pr ⁡ ( P Y t = p i ∣ M ) \operatorname*{Pr}(P_{Y_{t}}=p^{i}|\mathcal{M}) Pr(PYt=piM) p Y t p_{Y_{t}} pYt可以用期望来代替
E ( P Y t ∣ M ) = ∑ i = 1 m p i Pr ⁡ ( P Y t = p i ∣ M ) (9) \mathbb{E}(P_{Y_t}|\mathcal{M})=\sum_{i=1}^mp^i\Pr(P_{Y_t}=p^i|\mathcal{M})\tag{9} E(PYtM)=i=1mpiPr(PYt=piM)(9) E ( P Y t ∣ M ) \mathbb{E}(P_{Y_t}|\mathcal{M}) E(PYtM)即为后验估计。
该过程可以用下图3表示
在这里插入图片描述

Fig.3 后验估计过程

2.3 目标函数

t t t步的目标函数由三部分组成,用指示函数 I Y t = w \mathbb{I}_{Y_t=\boldsymbol{w}} IYt=w表示 T \mathcal{T} T t t t时刻产生的one-hot编码标签。第一部分的目标函数是交叉熵损失 L t c e = − ∑ w ∈ V I Y t = w log ⁡ q Y t = w \mathcal{L}_{t}^{\mathrm{ce}} = -\sum_{w\in\mathbb{V}}\mathbb{I}_{Y_{t}=w}\log q_{Y_{t}=w} Ltce=wVIYt=wlogqYt=w,第二部分基于先验估计 L t k l = ∑ w ∈ V p ^ Y t = w log ⁡ p ^ Y t = w q Y t = w \mathcal{L}_{t}^{\mathrm{kl}} = \sum_{w\in\mathbb{V}}\hat{p}_{Y_{t}=w}\log\frac{\hat{p}_{Y_{t}=w}}{q_{Y_{t}=w}} Ltkl=wVp^Yt=wlogqYt=wp^Yt=w,第三部分基于后验估计 L t ∣ M k l = ∑ w ∈ V E ( P Y t = w ∣ M ) log ⁡ E ( P Y t = w ∣ M ) q Y t = w \mathcal{L}_{t|\mathcal{M}}^{\mathrm{kl}}=\sum_{w\in\mathbb{V}}\mathbb{E}(P_{Y_{t}=w}|\mathcal{M})\log\frac{\mathbb{E}(P_{Y_{t}=w}|\mathcal{M})}{q_{Y_{t}=w}} LtMkl=wVE(PYt=wM)logqYt=wE(PYt=wM),最终得到目标函数
L = 1 T ∑ t = 1 T ( L t c e + α L t k l + β L t ∣ M k l ) (10) \mathcal{L}=\frac{1}{T}\sum_{t=1}^{T}(\mathcal{L}_{t}^{\mathrm{ce}}+\alpha\mathcal{L}_{t}^{\mathrm{kl}}+\beta\mathcal{L}_{t|\mathcal{M}}^{\mathrm{kl}})\tag{10} L=T1t=1T(Ltce+αLtkl+βLtMkl)(10)式中 α \alpha α β \beta β都是超参数。
总结一下如图4
在这里插入图片描述

Fig. 4 总体目标函数

3. 交叉熵损失函数与Kullback-Leibler(KL)损失函数

在信息论中,期望使用公式来表示事件所包含的信息的量度。

信息量,期望一个事件发生的概率越小,信息量就越大;而大概率的信息量较小,同时期望两个事件同时发生的信息量等于两个事件的信息量相加,由此可以规定一个事件的信息量为
I ( x i ) = − log ⁡ b P ( x i ) (11) I(x_i) = -\log_b P(x_i)\tag{11} I(xi)=logbP(xi)(11)
信息熵 𝐻(𝑋),也称为熵,是随机变量𝑋的期望信息量,可以通过对其所有可能结果的信息量求加权平均来计算:
H ( X ) = − ∑ i = 1 n P ( x i ) log ⁡ b P ( x i ) (12) H(X) = -\sum_{i=1}^{n} P(x_i) \log_b P(x_i)\tag{12} H(X)=i=1nP(xi)logbP(xi)(12)信息熵用来评估一个随机变量的不确定性,不确定性越大(对投色子,各数字概率密度均匀,取出任何数的概率相同),熵越大;不确定性越小(对扑克牌,普通牌与大小王的概率密度差距很大,取出普通牌的不确定性小),熵越小。

交叉熵假设随机变量𝑋的真实概率密度p,预测概率密度q,定义q对p的平均信息量的估计,叫做交叉熵,定义为公式
H ( p , q ) = ∑ p i I i q = − ∑ p i l o g 2 ( q i ) (13) H(p,q)=\sum p_iI_i^q=-\sum p_ilog_2(q_i)\tag{13} H(p,q)=piIiq=pilog2(qi)(13)交叉熵越小,预测的分布与真实的分布差异越小。且交叉熵总是大于熵的值。

KL散度也称为相对熵,是一种衡量两个概率分布差异的指标。KL散度是不对称的,即从分布P到分布Q的KL散度与从Q到P的KL散度不同。对于两个概率分布𝑃和𝑄定义在相同的概率空间上,KL散度定义为:
K L ( P ∥ Q ) = ∑ x [ P ( x ) ( I P − I Q ) ] = ∑ x P ( x ) log ⁡ ( P ( x ) Q ( x ) ) (14) \mathrm{KL}(P\parallel Q)=\sum_{x}[P(x)(I_P-I_Q)]=\sum_{x}P(x)\log\left(\frac{P(x)}{Q(x)}\right)\tag{14} KL(PQ)=x[P(x)(IPIQ)]=xP(x)log(Q(x)P(x))(14)
对于连续概率分布,求和变成积分。当两分布完全相同,则 K L ( P ∥ Q ) = 0 \mathrm{KL}(P\parallel Q)=0 KL(PQ)=0,KL熵用来衡量两分布的相似程度,KL熵越小,两分布越相似。

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

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

相关文章

Program-of-Thoughts(PoT):结合Python工具和CoT提升大语言模型数学推理能力

Program of Thoughts Prompting:Disentangling Computation from Reasoning for Numerical Reasoning Tasks github&#xff1a;https://github.com/wenhuchen/Program-of-Thoughts 一、动机 数学运算和金融方面都涉及算术推理。先前方法采用监督训练的形式&#xff0c;但这…

英语笔记-专升本

2024年6月23日15点01分&#xff0c;今天自己听老师讲了一张试卷&#xff0c;自己要开始不断地进行一个做事&#xff0c;使自己可以不断地得到一个提升&#xff0c;自己可以提升的内容&#xff0c; 英语试卷笔记 ------------------------------------ | 英语试卷笔记 …

使用Python监控网络连接状态并自动启动和关闭软件

通过 Python 编写一个网络连接状态监测程序&#xff0c;以 Synology Drive软件为例。通过如下代码实现来演示如何监控网络连接状态并自动启动和关闭相关软件。 程序首先通过 ping 命令检查内网或外网的连接状态。如果连接的是外网&#xff0c;则程序会检查 Synology Drive 软件…

发表在SIGMOD 2024上的高维向量检索/向量数据库/ANNS相关论文

前言 SIGMOD 2024会议最近刚在智利圣地亚哥结束&#xff0c;有关高维向量检索/向量数据库/ANNS的论文主要有5篇&#xff0c;涉及混合查询&#xff08;带属性或范围过滤的向量检索&#xff09;优化、severless向量数据库优化、量化编码优化、磁盘图索引优化。此外&#xff0c;也…

微信小程序入门2

微信开发者工具的安装方法 1.打开微信开发者工具下载页面 在微信小程序管理后台的左侧边栏中选择“开发工具”&#xff0c;然后选择“开发者工具”&#xff0c;即可找到微信开发者工具的下载页面。 2.打开微信开发者工具的下载链接页面 单击“下载” 按钮下载&#xff0c;即…

离线linux通过USB连接并使用手机网络

离线linux通过USB连接并使用手机网络 引场景 引 离线环境要安装一些软件特别麻烦&#xff0c;要自己去官网下载对应的包&#xff0c;然后上传到服务器上&#xff0c;再解压&#xff0c;编译&#xff0c;执行&#xff0c;配置变量等等&#xff0c;错一步都可能安装失败。有网络…

越复杂的CoT越有效吗?Complexity-Based Prompting for Multi-step Reasoning

Complexity-Based Prompting for Multi-step Reasoning 论文&#xff1a;https://openreview.net/pdf?idyf1icZHC-l9 Github&#xff1a;https://github.com/FranxYao/chain-of-thought-hub 发表位置&#xff1a;ICLR 2023 Complexity-Based Prompting for Multi-step Reason…

网络攻击有哪些新兴的威胁和防御策略

最新网络攻击威胁 近期&#xff0c;网络攻击的威胁呈现出新的趋势和特点。DDoS攻击仍然是一种严重的威胁&#xff0c;其次数和规模在过去一年中显著增长&#xff0c;攻击者技术不断升级&#xff0c;攻击成本逐渐降低。此外&#xff0c;攻击者的手段越来越多样化&#xff0c;包…

Simple-STNDT使用Transformer进行Spike信号的表征学习(三)训练与评估

文章目录 1. 评估指标2. 训练准备3. debug测试4. train-val函数 1. 评估指标 import numpy as np from scipy.special import gammaln import torchdef neg_log_likelihood(rates, spikes, zero_warningTrue):"""Calculates Poisson negative log likelihood g…

Java面试题:通过实例说明工厂模式和抽象工厂模式的用法,以及它们在解耦中的作用

工厂模式和抽象工厂模式是创建型设计模式中的两种&#xff0c;主要用于对象的创建&#xff0c;并且通过将对象的创建过程封装起来&#xff0c;来实现代码的解耦和灵活性。下面通过具体实例来说明这两种模式的用法及其在解耦中的作用。 工厂模式&#xff08;Factory Method Pat…

STM32 - LED灯 蜂鸣器

&#x1f6a9; WRITE IN FRONT &#x1f6a9; &#x1f50e; 介绍&#xff1a;"謓泽"正在路上朝着"攻城狮"方向"前进四" &#x1f50e;&#x1f3c5; 荣誉&#xff1a;2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4、2021|2222年获评…

Pytest框架中pytest.mark功能

文章目录 mark功能 1. 使用pytest.mark.skip 2. 使用pytest.mark.skipif 3. 使用 pytest.mark.xfail 4使用pytest.mark.parametrize 5 使用pytest.mark.自定义标记 6 使用pytest.mark.usefixtures pytest 的mark功能在pytest官方文档是这样解释的&#xff1a; https://…

Rust:使用 Warp 框架编写基于 HTTPS 的 RESTful API

在 Rust 中使用 Warp 框架编写基于 HTTPS 的 RESTful API&#xff0c;你需要首先设置好 TLS/SSL 证书以启用 HTTPS。以下是一个基本的步骤指南&#xff1a; 步骤 1: 安装 Rust 和 Cargo 确保你已经安装了 Rust 和 Cargo。你可以从 Rust 官网 下载并安装 Rust。 步骤 2: 创建…

stm32学习笔记---GPIO输出(代码部分)LED闪烁/流水灯/蜂鸣器

目录 面包板的使用方法 第一个演示代码&#xff1a;LED闪烁 最后一次快速新建工程演示 点击新建工程 选择芯片 在工程文件夹中创建Start、Library、User Start文件夹的必备文件复制操作 Library文件夹的必备文件复制操作 User文件夹的必备文件复制操作 在keil中创建S…

关于数据登记的六点观察|数据与治理思享会(第1期)圆满举行

本文内容转载自 数据与治理专委会。 鼹鼠哥有幸在上周参与了数据大讲堂的首次线下活动&#xff0c;也做了个简短笔记 [最新]清华数据大讲堂线下思享会 因为上次是个人笔记&#xff0c;有些内容不方便些。既然今天官方公众号发出来了&#xff0c;就在这里把官方的内容也给大家转…

Repair LED lights

Repair LED lights 修理LED灯&#xff0c;现在基本用灯带&#xff0c;就是小型LED灯串联一起的 1&#xff09;拆旧灯条&#xff0c;这个旧的是用螺丝拧的产品 电闸关掉。 2&#xff09;五金店买一个&#xff0c;这种是磁铁吸附的产品 现在好多都是铝线啊。。。 小部件&#x…

【大数据离线项目四:什么是海豚调度?怎么使用可以将海豚调度应用到我们的大数据项目开发中?】

前言&#xff1a; &#x1f49e;&#x1f49e;大家好&#xff0c;我是书生♡&#xff0c;今天主要和大家分享一下什么是海豚调度&#xff1f;怎么使用可以将海豚调度应用到我们的项目开发中&#xff1f;希望对大家有所帮助。 &#x1f49e;&#x1f49e;代码是你的画笔&#xf…

数组 (java)

文章目录 一维数组静态初始化动态初始化 二维数组静态初始化动态初始化 数组参数传递可变参数关于 main 方法的形参 argsArray 工具类sort 中的 comparable 和 comparatorcomparator 比较器排序comparable 自然排序 一维数组 线性结构 静态初始化 第一种&#xff1a;int[] a…

IDEA插件推荐-CodeGeex

功能&#xff1a;这个插件可以实现快速翻译代码&#xff0c;json文件格式转换&#xff0c;代码语言类型转换。 安装方式&#xff1a;File->Settings->Plugins->MarketPlace->搜索“CodeGeex”即可 &#xff08;CodeGeex功能展示&#xff09; &#xff08;CodeGeex…

模拟算法讲解

模拟算法是一种基于实际情况模拟的算法&#xff0c;通过模拟现实世界中的系统或过程&#xff0c;来研究它们的性质和行为。模拟算法可以用于解决各种问题&#xff0c;包括物理模拟、经济模拟、社会模拟等。 模拟算法的基本步骤包括&#xff1a; 定义问题&#xff1a;明确需要模…