当前位置: 首页 > news >正文

文献分享:RoarGraph——跨模态的最邻近查询

原文章: RoarGraph: A Projected Bipartite Graph for Efficient Cross-Modal Approximate Nearest Neighbor Search \text{RoarGraph: A Projected Bipartite Graph for Efficient Cross-Modal Approximate Nearest Neighbor Search} RoarGraph: A Projected Bipartite Graph for Efficient Cross-Modal Approximate Nearest Neighbor Search

1. \textbf{1. } 1. 导论

1.1. \textbf{1.1. } 1.1. 研究背景

1️⃣跨模态检索:

  1. 含义:使用某个模态的数据作为 query \text{query} query,返回另一个模态中语义相似的内容
  2. 示例:输入"Apple"后,返回苹果的照片

2️⃣模态差距 (gap) \text{(gap)} (gap):不同模态数据即使映射到同一语义空间(比如用 CLIP \text{CLIP} CLIP),其分布特征仍差距显著

\quad image-20250103234040081

3️⃣两种 ANN \text{ANN} ANN

  1. 单模态 ANN \text{ANN} ANN:查询向量分布 ↔ ID \xleftrightarrow{\text{ID}} ID 基础数据分布,即查询来源于与数据库数据相同的分布
  2. 跨模态 ANN \text{ANN} ANN​:查询向量分布 ↔ OOD \xleftrightarrow{\text{OOD}} OOD 基础数据分布,即查询来源于与数据库数据不同的分布

1.2. \textbf{1.2. } 1.2. 本文的研究

1️⃣研究动机:当前 SOTA \text{SOTA} SOTA ANN \text{ANN} ANN​都是单模态的,在 OOD \text{OOD} OOD负载上表现差

2️⃣研究内容

  1. OOD \text{OOD} OOD工作负载分析:跨模态后性能下降,源于查询过远 + + +标签分散 → \text{→} 收敛变慢 / / /跳数增加
    类型查询 ↔ 距离 \boldsymbol{\xleftrightarrow{距离}} 距离 基础数据查询最邻近 i ↔ 距离 \boldsymbol{i\xleftrightarrow{距离}} i距离 查询最邻近查询 ↔ 分布 \boldsymbol{\xleftrightarrow{分布}} 分布 基础数据
    单模态 ANN \text{ANN} ANN近(基本假设)近(基本假设) ID \text{ID} ID
    跨模态 ANN \text{ANN} ANN远(实验得到)远(实验得到) OOD \text{OOD} OOD
  2. RoarGraph \text{RoarGraph} RoarGraph的提出:
    • 原理:让查询参与图构建 → \text{→} 将[查询点 ↔ \xleftrightarrow{} 基础点]邻接关系投影到基础点 → \text{→} 形成仅有基础点的图
    • 意义:让空间上很远但是查询上很近的点相连,从而能高效处理 OOD-ANNS \text{OOD-ANNS} OOD-ANNS
      image-20250104005140458
    • 效果:在跨模态数据集上实现了 QPS \text{QPS} QPS Recall \text{Recall} Recall指标的提升

1.3. \textbf{1.3. } 1.3. 有关工作

方法核心思想优缺点
束搜索终止利用查询训练分类模型判断何时终止搜索提升效率,但训练成本较高
图卷积 (GCN) \text{(GCN)} (GCN)引入 GCN \text{GCN} GCN学习最优搜索路径路径优化明显,但训练成本较高
GCN+RL \text{GCN+RL} GCN+RL强化学习与 GCN \text{GCN} GCN结合引导搜索路由提升效果显著,但训练成本较高
GraSP \text{GraSP} GraSP概率模型与子图采样学习边重要性性能优化明显,但索引构建成本高
ScaNN \text{ScaNN} ScaNN结合向量量化和 PQ \text{PQ} PQ进行分区与压缩压缩与搜索性能高效,但依赖调参

2. \textbf{2. } 2.  OOD \textbf{OOD} OOD负载的分析与验证

2.1. \textbf{2.1. } 2.1. 初步的背景及其验证

2.1.1. \textbf{2.1.1. } 2.1.1. 对模态差距的验证

1️⃣ OOD \text{OOD} OOD的量化

距离类型衡量什么如何理解
Wasserstein \text{Wasserstein} Wasserstein距离两个分布间的差异把一个分布搬到另一个的最小代价
Mahalanobis \text{Mahalanobis} Mahalanobis距离一个向量到一个分布的距离一个点相对于一个分布的异常程度

1️⃣实验 1 1 1:用 Wasserstein \text{Wasserstein} Wasserstein距离衡量 OOD \text{OOD} OOD特性

  1. 数据集:基础数据集中抽取的无交叉集 B 1 / B 2 B_1/B_2 B1/B2 OOD \text{OOD} OOD的查询集 Q Q Q
  2. 结果: Wasserstein ( B 1 , Q ) \text{Wasserstein}(B_1,Q) Wasserstein(B1,Q) Wasserstein ( B 2 , Q ) \text{Wasserstein}(B_2,Q) Wasserstein(B2,Q),大致是 Wasserstein ( B 1 , B 2 ) \text{Wasserstein}(B_1,B_2) Wasserstein(B1,B2)两倍

2️⃣实验 2 2 2:用 Mahalanobis \text{Mahalanobis} Mahalanobis距离衡量 OOD \text{OOD} OOD特性

  1. 数据集:满足分布 P P P的基础数据,来自 ID \text{ID} ID查询集的 q i d q_{id} qid,来自 OOD \text{OOD} OOD查询集的 q o o d q_{ood} qood
  2. 结果: Mahalanobis ( q id , P ) <Mahalanobis ( q ood , P ) \text{Mahalanobis}(q_{\text{id}},P)\text{<}\text{Mahalanobis}(q_{\text{ood}},P) Mahalanobis(qid,P)<Mahalanobis(qood,P)

2.1.2. SOTA-ANN \textbf{2.1.2. }\textbf{SOTA-ANN} 2.1.2. SOTA-ANN OOD \textbf{OOD} OOD任务上的表现

1️⃣对传统的 SOTA-ANN \text{SOTA-ANN} SOTA-ANN

索引方法 OOD \textbf{OOD} OOD上的表现(相比在 ID \textbf{ID} ID上)
HNSW \text{HNSW} HNSW性能显著下降,在 BeamSearch \text{BeamSearch} BeamSearch过程显著访问更多的结点(要经历更多跳)
IVF-PQ \text{IVF-PQ} IVF-PQ性能显著下降,需要更多的聚类数才能达到相同的 Recall \text{Recall} Recall

2️⃣对改进的 ANN \text{ANN} ANN:针对 OOD-ANNS \text{OOD-ANNS} OOD-ANNS的首个图索引 RobustVamana(OOD-DiskANN) \text{RobustVamana(OOD-DiskANN)} RobustVamana(OOD-DiskANN)

  1. 原理:先用 Vamana \text{Vamana} Vamana建图,然后再用 RobustStitch \text{RobustStitch} RobustStitch根据查询向量,连接新的边
  2. 性能:比 DiskANN \text{DiskANN} DiskANN OOD \text{OOD} OOD任务上提升了 40% \text{40\%} 40%性能,但是查询速度慢了 × 4 -10 {\text{×}4\text{-10}} ×4-10

2.2. \textbf{2.2. } 2.2.  OOD \textbf{OOD} OOD ANN \textbf{ANN} ANN工作负载的分析

2.2.1. OOD-ANNS \textbf{2.2.1. OOD-ANNS} 2.2.1. OOD-ANNS ID-ANNS \textbf{ID-ANNS} ID-ANNS的两个差异

1️⃣两种差异及实验结果

  1. OOD \text{OOD} OOD查询离其最邻近很远:即 δ ( q ood , i t h -NN ood ) ≫ δ ( q id , i t h -NN id ) \delta\left(q_{\text{ood}}, i^{t h} \text{-NN}_{\text{ood}}\right) \text{≫} \delta\left(q_{\text{id}}, i^{t h} \text{-NN}_{\text{id}}\right) δ(qood,ith-NNood)δ(qid,ith-NNid),左为 i = 1 i\text{=}1 i=1时的分布结果
  2. OOD \text{OOD} OOD查询的最邻近彼此原理: 10 0 t h -NN 100^{t h} \text{-NN} 100th-NN互相之间的平均距离,实验结果如右
    image-20250104144814904 image-20250104150124562

2️⃣对差异的直观理解

  1. 简单(概念)示例:
    image-20250104150619812
    • ID \text{ID} ID查询:查询与其最邻近在球面上,相互靠近
    • ODD \text{ODD} ODD查询:查询在球心,其最邻近在球面上(由此距离较远且查询不多 + \text{+} +分散分布)
  2. 真实示例:真实数据 PCA \text{PCA} PCA降到二维的视图, ID \text{ID} ID查询更为集中
    image-20250104151013397

2.2.2. \textbf{2.2.2. } 2.2.2. 为何传统 SOTA-ANN \textbf{SOTA-ANN} SOTA-ANN ODD \textbf{ODD} ODD表现不佳

0️⃣传统 ANN \text{ANN} ANN的设计

  1. 基于两假设:查询 / / /数据同分布 + k +k +k个最近邻彼此相互靠近(邻居的邻居是邻居),刚好全反的
  2. 设计的思路:
    • 建图:用 BeamSearch \text{BeamSearch} BeamSearch来构建 KNN \text{KNN} KNN → \text{→} 空间中相近的点转化为图中紧密连接的结点
    • 搜索:从中心点开始 GreedySearch \text{GreedySearch} GreedySearch

1️⃣在基于图 ANN \text{ANN} ANN上: OOD \text{OOD} OOD会使得搜索空间增大

  1. 可识别搜索空间:包围当前访问结点 x x x B s ( x ) + B k ( 1 st -NN , R ) B^{s}(x)\text{+}B^{k}\left(1^{\text{st}}\text{-NN}, R\right) Bs(x)+Bk(1st-NN,R)
    • B k ( 1 st -NN , R ) B^{k}\left(1^{\text{st}}\text{-NN}, R\right) Bk(1st-NN,R):以 1 st -NN 1^{\text{st}}\text{-NN} 1st-NN为球心, k k k邻近间互相距离 δ ( i th -NN , j th -NN ) \delta\left(i^{\text{th}}\text{-NN}, j^{\text{th}}\text{-NN}\right) δ(ith-NN,jth-NN)最大值为半径
    • B s ( x ) B^{s}(x) Bs(x):以当前结点 x x x为圆心,以 δ ( x , i th -NN ) \delta\left(x, i^{\text{th}}\text{-NN}\right) δ(x,ith-NN)的最大值(到最远最邻近的距离)为半径
  2. OOD \text{OOD} OOD的影响:搜索空间大幅增大
    • B k B^{k} Bk:由于 OOD \text{OOD} OOD的性质 R ood  ≫ R id R_{\text {ood }}\text{≫}R_{\text{id}} Rood Rid,这一差异在体积层面放大到 ( R ood  R id ) D \left(\cfrac{R_{\text {ood }}}{R_{\text{id}}}\right)^D (RidRood )D级别
    • B s B^{s} Bs:由于 OOD \text{OOD} OOD的性质 δ ( x , i th -NN ood ) ≫ δ ( x , i th -NN id ) \delta\left(x, i^{\text{th}}\text{-NN}_{\text{ood}}\right)\text{≫}\delta\left(x, i^{\text{th}}\text{-NN}_{\text{id}}\right) δ(x,ith-NNood)δ(x,ith-NNid),使得体积也大幅膨胀
  3. 对搜索过程的影响:
    • 对于 ID \text{ID} ID查询:由于最近邻彼此靠近, GreedySearch \text{GreedySearch} GreedySearch可以使 B s ( x ) B^{s}(x) Bs(x)轻松收敛
      起点 -> 近邻1 -> 近邻2 -> 近邻3 (一个小范围内)
      
    • 对于 OOD \text{OOD} OOD查询:最近邻方向分散难以收敛,需要更大的 Beam \text{Beam} Beam宽度 / / /搜索路径等
             近邻2↗️     
      起点 -> 近邻1 -> 近邻3 (分散在大范围内)↘️     近邻4
      

2️⃣在基于划分 IVF \text{IVF} IVF

  1. 原理上: IVF \text{IVF} IVF先将原数据分簇
    • ID \text{ID} ID查询:最邻近集中在少数几个相邻簇中
    • OOD \text{OOD} OOD查询:最邻近分散在多个不相邻簇中
  2. 实验上: OOD \text{OOD} OOD查询需要扫描更多的簇,性能下降 2.5 2.5 2.5

3. RoarGraph \textbf{3. RoarGraph} 3. RoarGraph

3.1. RoarGraph \textbf{3.1. RoarGraph} 3.1. RoarGraph的设计思路

1️⃣面向解决三种挑战

  1. 边的建立:如何连接查询 / / /基础两类结点,同时避免基础结点度数太高
  2. 搜索效率:查询结点要保持极高出度以覆盖基础节点,但同时也会大幅增加跳数 / / /内存开销
  3. 连通性:避免出现孤立结点,独立子图

1️⃣大致的设计流程

  1. 构建:建立查询 ↔ \boldsymbol{\xleftrightarrow{}} 基础二分图 → \text{→} 将邻接信息投影到基础点中 → \text{→} 增强连接
  2. 查询:同样是用 BeamSearch \text{BeamSearch} BeamSearch

3.2. RoarGraph \textbf{3.2. RoarGraph} 3.2. RoarGraph的构建: 三个阶段

3.2.1. \textbf{3.2.1. } 3.2.1. 阶段 1 \textbf{1} 1: 查询 ↔ \boldsymbol{\xleftrightarrow{}} 基础二分图构建

1️⃣二分图概述:

  1. 基本概念:将所有的点分为两个集合,所有边必须连接不同子集的点,不能内部连接
    image-20250104160314817
  2. 在此处:两子集查询结点 + + +基础节点,两种边[查询结点 → \text{→} 基础结点] + \text{+} +[查询结点 ← \text{←} 基础结点]

2️⃣构建过程概述

\quad image-20250104164020863

  1. 预处理:计算每个查询向量的真实 N q -NN N_q\text{-NN} Nq-NN标签
  2. 边构建:
    方向操作
    查询点 → \text{→} 基础点查询点 → 连接 \xrightarrow{连接} 连接 查询点的 N q -NN N_q\text{-NN} Nq-NN基础点
    基础点 → \text{→} 查询点查询点 ← 连接 \xleftarrow{连接} 连接 查询点的 1 -NN 1\text{-NN} 1-NN基础点,查询点 → 断连 \xrightarrow{断连} 断连 查询点的 1 -NN 1\text{-NN} 1-NN基础点
  3. 示例:
    预处理: T1 -> X1, X2, X3 (Nq=3)
    边构建: T1 -> X2, X3 T1 <- X1 
    

2️⃣构建过程分析

  1. 结点度数的考量:
    • 高查询结点出度:提高 N q N_q Nq值,增加[基础点 → 覆盖性 重叠性 \xrightarrow[覆盖性]{重叠性} 重叠性 覆盖性查询点],使多基础点可由同一查询点联系
    • 低基础节点出度:为了解决上述挑战 1 1 1,目的在于提高二分图上的搜索效率
  2. 边方向的考虑:不进行双向连接,避免二分图搜索时要去检查邻居的邻居( N q 2 N_q^2 Nq2)
    预处理: T1 -> X1, X2, X3 (Nq=3)
    边构建: T1 -> X1, X2, X3 T1 <- X1T1 <- X2T1 <- X3
    

3.2.2. \textbf{3.2.2. } 3.2.2. 阶段 2 \textbf{2} 2: 领域感知投影

1️⃣一些分析

  1. 优化动机:二分图内存消耗高(额外存储了查询节点),搜索路径长(需要额外经过查询结点)
  2. 关于投影:
    • 目的:移除二分图中的查询结点,并保留从查询分布获得的邻近关系
    • 方式:最简单的可将查询点所连的全部基础点全连接(度数太高),优化方法如领域感知投影

2️⃣投影过程:

  1. 预处理:
    • 遍历查询点:获得与查询点相连的最邻近基础点
      查询Q -> {B1, B2, B3, B4, B5}  (Q连接了5个基础节点)
      
    • 选择中心点:即查询点的 1-NN \text{1-NN} 1-NN点,作为 Pivot \text{Pivot} Pivot
      查询Q -> {B1, B2, B3, B4, B5}  (Q连接了5个基础节点)👆pivot
      
    • 排序基础结点:将余下 N q -NN N_q\text{-NN} Nq-NN点,按与 Pivot \text{Pivot} Pivot的距离排序
  2. 感知投影:
    • 连接:让中心点与余下点建立连接
      B1 -> B2 (最近)
      B1 -> B3 (次近)
      B1 -> B4 (较远)
      B1 -> B5 (最远)
      
    • 过滤:保证与 Pivot \text{Pivot} Pivot连接方向的多样性
      条件含义操作
      Dist ( X , Y ) <Dist ( Pivot , Y ) \text{Dist}(X,Y)\text{<}\text{Dist}(\text{Pivot},Y) Dist(X,Y)<Dist(Pivot,Y)该方向已有连接则筛掉 Y Y Y(不与 Pivot \text{Pivot} Pivot建立连接)
      Dist ( X , Y ) >Dist ( Pivot , Y ) \text{Dist}(X,Y)\text{>}\text{Dist}(\text{Pivot},Y) Dist(X,Y)>Dist(Pivot,Y)代表新的搜索方向则保留 Y Y Y(可与 Pivot \text{Pivot} Pivot建立连接)
    • 填充:当 Pivot \text{Pivot} Pivot的出度小于度数限制,则又重新连接之前过滤掉的结点

3.2.3. \textbf{3.2.3. } 3.2.3. 连通性增强

image-20250104172351909

1️⃣为何要增强:仅依赖于二分图的覆盖范围,投影图的连通性还太低,对 GreedySearch \text{GreedySearch} GreedySearch不友好

2️⃣增强的方法:

  1. 检索:从基础集的 Medoid \text{Medoid} Medoid开始,对每个基础点执行 BeamSearch \text{BeamSearch} BeamSearch得到最邻近(作为候选点)
  2. 连边:在不超过度数限制的前提下,让该基础点连接一定数量的候选点作

3.3. RoarGraph \textbf{3.3. RoarGraph} 3.3. RoarGraph性能的验证

3.3.1. \textbf{3.3.1. } 3.3.1. 实验设置

1️⃣数据集

数据集描述查询集索引集
Text-to-Image \text{Text-to-Image} Text-to-Image流行基准数据集,含图像和文本查询向量官方 1 w 1\text{w} 1w余下不重叠数据
LAION \text{LAION} LAION数百万对图像 − - 替代文本对采样 1 w 1\text{w} 1w余下不重叠数据
WebVid \text{WebVid} WebVid素材网站获取的字幕和视频对采样 1 w 1\text{w} 1w余下不重叠数据

2️⃣超参数设置

模型超参数列表
HNSW \text{HNSW} HNSW M = 32 M\text{=}32 M=32, efConstruction= 500 \text{efConstruction}\text{=}500 efConstruction=500
NSG \text{NSG} NSG R = 64 R\text{=}64 R=64, C = L = 500 C\text{=}L\text{=}500 C=L=500
τ -MNG \tau\text{-MNG} τ-MNG R = 64 R\text{=}64 R=64, C = L = 500 C\text{=}L\text{=}500 C=L=500, τ = 0.01 \tau\text{=}0.01 τ=0.01
RobustVamana \text{RobustVamana} RobustVamana R = 64 R\text{=}64 R=64, L = 500 L\text{=}500 L=500, α = 1.0 \alpha\text{=}1.0 α=1.0
RoarGraph \text{RoarGraph} RoarGraph N q = 100 N_q\text{=}100 Nq=100(最近邻候选数量), M = 35 M\text{=}35 M=35(出度约束), L = 500 L\text{=}500 L=500(候选集大小)

3️⃣性能指标: Recall@k \text{Recall@k} Recall@k QPS \text{QPS} QPS(检索速度)

3.3.2. \textbf{3.3.2. } 3.3.2. 实验结果

1️⃣ QPS \text{QPS} QPS与召回: RoarGraph \text{RoarGraph} RoarGraph最优(超过 RobustVamana \text{RobustVamana} RobustVamana), HNSW/NSG \text{HNSW/NSG} HNSW/NSG差不多, τ -MNG \tau\text{-MNG} τ-MNG最差

image-20250104174815800

2️⃣跳数与召回: RoarGraph \text{RoarGraph} RoarGraph跳数显著减少,且随 Recall@ \text{Recall@} Recall@ k k k增大,减少趋势下降

image-20250104175148632

3️⃣消融实验:对比了二分图 / / /投影图 / / /完整图,可见通过邻域感知投影显著提升性能

image-20250104175148632

4️⃣查询集规模:即查询集大小占基础集大小比重对索引性能的影响;可见起始模型对规模并不敏感

image-20250104175148632

5️⃣在 ID \text{ID} ID负载上的性能: RoarGraph \text{RoarGraph} RoarGraph依旧能打,和 HNSW \text{HNSW} HNSW相当

image-20250104175148632

6️⃣索引开销成本:使用 10 % 10\% 10%数据可大幅降低构建成本,同时保持搜索性能

\quad image-20250104180704959

3.4. RoarGraph \textbf{3.4. RoarGraph} 3.4. RoarGraph的一些讨论

1️⃣运用场景:结合大量历史查询数据,用多模态深度学习模型生成嵌入,部署在大型检索 / / /推荐系统

2️⃣更新机制:

  1. 初始搜索:
    • 结点查询:将新插入下新基础节点 v v v作为查询,在基础数据集中搜索其最邻近
    • 结点筛选:要求最邻近满足,曾在图构建过程中与至少一个查询点连接过的基础点
    • 反向回溯:对该最邻近点,回溯到与其曾建立过连接的距离最近的查询点 q q q
  2. 子图构建:
    • 二分子图:将 q ↔ N out ∪ v q\xleftrightarrow{}N_{\text {out}}\text{∪}v q Noutv整合为二分子图
    • 邻域投影:将 v v v作为 Pivot \text{Pivot} Pivot按同样的方式,生成投影图

3️⃣删除操作:采用墓碑标记法 Tombstones \text{Tombstones} Tombstones,即被删结点任参与路由,但排除在搜索结果中

相关文章:

文献分享:RoarGraph——跨模态的最邻近查询

文章目录 1. \textbf{1. } 1. 导论 1.1. \textbf{1.1. } 1.1. 研究背景 1.2. \textbf{1.2. } 1.2. 本文的研究 1.3. \textbf{1.3. } 1.3. 有关工作 2. \textbf{2. } 2. 对 OOD \textbf{OOD} OOD负载的分析与验证 2.1. \textbf{2.1. } 2.1. 初步的背景及其验证 2.1.1. \textbf{2…...

故事可视化AI

i68,爱六八,链接你我他 StoryWeaver故事可视化 通过知识增强的角色定制技术&#xff0c;实现高质量的故事可视化论文链接:https://arxiv.org/pdf/2412.07375项目仓库:https://github.com/Aria-Zhangjl/StoryWeaver由厦门大学多媒体可信感知与高效计算教育部重点实验室和网易伏…...

【机器学习篇】从新手探寻到算法初窥:数据智慧的开启之门

文章目录 【机器学习篇】从新手探寻到算法初窥&#xff1a;数据智慧的开启之门前言一、什么是机器学习&#xff1f;二、机器学习的基本类型1. 监督学习&#xff08;Supervised Learning&#xff09;2. 无监督学习&#xff08;Unsupervised Learning&#xff09;3. 半监督学习&a…...

ffmpeg八大开发库

‌FFmpeg八大库‌是指FFmpeg项目中最重要的八个库&#xff0c;它们各自承担不同的功能&#xff0c;共同构成了FFmpeg的强大功能。以下是这八大库的详细介绍&#xff1a; ‌libavcodec‌&#xff1a;负责音频和视频的编解码。它支持多种编解码器&#xff0c;如H.264、AAC、MP3、…...

【ArcGISPro/GeoScenePro】解决常见的空间参考和投影问题

修复空间参考缺失的图像 数据 https://arcgis.com/sharing/rest/content/items/535efce0e3a04c8790ed7cc7ea96d02d/data 查看属性坐标 查看属性范围 范围值并不是零或接近于零。 这意味着栅格具有范围,因此其已正确进行...

Linux上安装配置单节点zookeeper

直接先去官网下载安装包&#xff0c; https://downloads.apache.org/zookeeper/ 选择合适的版本&#xff0c;然后上传至服务器 解压&#xff1a; tar -zxvf apache-zookeeper-3.9.3-bin.tar.gz创建data和logs目录 mkdir data mkdir logs配置环境变量&#xff1a; vim /etc/p…...

现代光学基础-1

总结自老师的讲义 yt1 目录 光纤通信系统 组成部分三大里程碑技术实例分析 激光器 定义自振荡器的特性组成输出特性应用领域 受激辐射、自然辐射与吸收 LASER的定义受激辐射的特点光与物质的相互作用能量守恒与材料特性净增益条件 谐振器 定义组成部分性能描述 F-P谐振器&am…...

pytorch中nn.Conv2d详解及参数设置原则

文章目录 基础参数1. in_channels (输入通道数)2. out_channels (输出通道数)3. kernel_size (卷积核大小)4. stride (步幅)5. padding (填充)6. dilation (膨胀)7. groups (分组卷积)8. bias (偏置) 如何设置参数&#xff1f;1. **in_channels 和 out_channels&#xff08;输入…...

T-SQL语言的正则表达式

T-SQL语言的正则表达式 在现代数据库管理系统中&#xff0c;SQL&#xff08;结构化查询语言&#xff09;被广泛用于数据的操作与管理。对数据的查询、插入、更新和删除几乎是每一个数据库管理系统中的基本功能。T-SQL&#xff08;Transact-SQL&#xff09;是微软对SQL的扩展&a…...

UDP_TCP

目录 1. 回顾端口号2. UDP协议2.1 理解报头2.2 UDP的特点2.3 UDP的缓冲区及注意事项 3. TCP协议3.1 报头3.2 流量控制2.3 数据发送模式3.4 捎带应答3.5 URG && 紧急指针3.6 PSH3.7 RES 1. 回顾端口号 在 TCP/IP 协议中&#xff0c;用 “源IP”&#xff0c; “源端口号”…...

Python 中常见的数据结构之二推导式

Python 中常见的数据结构之二推导式 使用推异式列表推导式字典推导式集合推导式 使用推异式 推导式是一种从已存在的序列中快速构建列表(list)、集合(set) 和 字典(dictionary)方式。Python 支持 3 种不同类型的推导式&#xff1a; 列表推导式&#xff1b;字典推导式&#xf…...

STM32 拓展 低功耗案例3:待机模式 (hal)

配置PA0的两种方式&#xff1a; 第一种 第二种 复制寄存器代码然后对其进行修改 mian.c /* USER CODE BEGIN Header */ /********************************************************************************* file : main.c* brief : Main program body…...

【开源社区openEuler实践】探索 Yocto-Meta-OpenEuler:嵌入式开发的强大基石

title: 探索 Yocto-Meta-OpenEuler&#xff1a;嵌入式开发的强大基石 date: ‘2024-11-19’ category: blog tags: Yocto-Meta-OpenEuler嵌入式系统开源项目定制化开发 sig: EmbeddedTech archives: ‘2024-12’ author:way_back summary: Yocto-Meta-OpenEuler 为嵌入式系统开…...

C++ hashtable

文章目录 1. 基本概念2. 哈希函数3. 哈希冲突及解决方法开放定址法链地址法再哈希法建立公共溢出区4. 哈希表的操作实现5. 内存管理及优化 时间复杂度理想情况&#xff08;无哈希冲突或冲突极少&#xff09;一般情况&#xff08;考虑哈希冲突及解决方法&#xff09;综合来看 以…...

JS (node) 的 ACM 模式 + debug方法 (01背包为例)

文章目录 JS 的 ACM 模式输入处理 JS dubug (01背包为例)动态输入在本地通过 Node.js 运行和调试 硬编码 Hard CodingVS Code JS 的 ACM 模式 在 JavaScript 中&#xff0c;ACM 模式一般通过 Node.js 的 readline 模块实现。 输入处理 使用 readline 模块监听输入。 将每行输…...

vue设计与实现-框架设计

权衡的艺术 命令式和声明式 视图层框架通常分为命令式和声明式&#xff0c;各有优缺。jquery是一种命令式框架。命令式框架关注过程&#xff0c;而声明式框架关注结果。对于vue来说&#xff0c;过程被vue封装了&#xff0c;所以vue内部是命令式的&#xff0c;但vue暴露给用户…...

Stable Diffusion和Midjourney有什么区别?

Stable Diffusion 和 Midjourney 主要有以下区别&#xff1a; 目录 费用与可访问性 设备要求 安装与使用 学习成本 图像生成效果 可控性与定制性 私密性 费用与可访问性 Stable Diffusion&#xff1a;开源免费&#xff0c;任何人都可以免费下载并自行部署使用&#xf…...

即插即用,无痛增强模型生成美感!字节跳动提出VMix:细粒度美学控制,光影、色彩全搞定

文章链接&#xff1a;https://arxiv.org/pdf/2412.20800 代码地址&#xff1a;https://github.com/fenfenfenfan/VMix 项目地址&#xff1a;https://vmix-diffusion.github.io/VMix/ 亮点直击 分析并探索现有模型在光影、色彩等细粒度美学维度上生成图像的差异&#xff0c;提出…...

面向对象分析和设计OOA/D,UML,GRASP

目录 什么是分析和设计&#xff1f; 什么是面向对象的分析和设计&#xff1f; 迭代开发 UML 用例图 交互图 基于职责驱动设计 GRASP 常见设计原则 什么是分析和设计&#xff1f; 分析&#xff0c;强调是对问题和需求的调查研究&#xff0c;不是解决方案。例如&#x…...

【每日学点鸿蒙知识】广告ID、NFC手机充值、CSS支持语法、PC与模拟器交互、SO热更新等

1、HamonyOS 样机获取成功返回Oaid为00000000-0000-0000-0000-000000000000&#xff1f; 请求授权时需要触发动态授权弹窗,看一下是不是没有触发授权弹窗。 可以参考以下代码以及文档&#xff1a; // ets import identifier from ohos.identifier.oaid; import hilog from oh…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者写过很多次这道题了&#xff0c;不想写题解了&#xff0c;大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

视觉slam十四讲实践部分记录——ch2、ch3

ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了&#xff0c;就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

Linux nano命令的基本使用

参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时&#xff0c;显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...