安全多方计算中稀疏矩阵乘法优化:原理、实现与隐私保护应用

news2026/5/25 13:27:44
1. 项目概述当稀疏矩阵遇上安全多方计算在机器学习、推荐系统这些我们每天都会接触到的技术背后数据往往以一种“稀疏”的形式存在。想象一下一个拥有百万用户和十万本书籍的在线书店每个用户可能只读过其中几十本那么构建一个“用户-书籍”评分矩阵时超过99.9%的格子都会是空的零值。这种大部分元素为零的矩阵就是稀疏矩阵。直接存储和计算这个巨大的、充满零的矩阵是对计算和存储资源的巨大浪费。因此稀疏矩阵运算成为了高效处理此类数据的核心技术。然而当数据涉及用户隐私时问题就变得复杂了。例如医疗机构的访问日志、公司的敏感审计记录或是跨机构联合训练推荐模型时参与方都不希望自己的原始数据被他人窥探。安全多方计算Secure Multi-Party Computation, MPC技术应运而生它允许多个参与方在不泄露各自私有输入的前提下共同计算一个函数的结果。理想很丰满但现实是将传统的密集矩阵乘法直接套用到MPC框架中去计算一个稀疏矩阵就像用集装箱卡车运送一箱羽毛——绝大部分运力都浪费在了承载“空气”零值上会产生难以承受的通信与计算开销甚至直接导致内存溢出使得许多实际应用根本无法落地。我最近深入实践了一套针对MPC的稀疏矩阵乘法优化方案。这套方案的核心思想很直接既然数据是稀疏的我们的安全计算过程也应该“忽略”那些零值只对真正有数据的部分非零元进行操作。但这在保护隐私的加密世界里并非易事因为你不能简单地告诉对方“我这里有个零我们跳过吧”这本身就会泄露信息。我们的方法通过结合不经意排序等密码学原语成功地将稀疏特性带来的效率优势带入了MPC领域。实测下来在99.9%的稀疏度下通信开销相比传统的安全密集乘法降低了约100倍当稀疏度达到99.99%时这个优势更是扩大到惊人的1000倍。这意味着一些之前因资源限制而无法在隐私保护前提下运行的大规模机器学习应用现在成为了可能。2. 核心思路如何安全地“跳过”零值2.1 从密集到稀疏的范式转变在明文计算中处理稀疏矩阵的经典方法是使用坐标列表COO或压缩稀疏行CSR等格式。以COO为例我们只存储非零元素的行索引、列索引和值这三个数组。进行矩阵乘法时算法会遍历这些非零元仅执行必要的乘加运算完全规避了对零值的操作。但在MPC中所有数据包括索引和值都被秘密共享Secret Sharing或同态加密Homomorphic Encryption等方式保护起来。参与计算的服务器看到的只是一堆看似随机的碎片无法区分哪个碎片对应零值哪个对应真实数据。如果我们直接采用明文稀疏算法的逻辑服务器在遍历时需要为每一个可能的“位置”都执行一次安全乘法即使该位置实际为零这反而可能比直接做密集乘法更低效因为密集乘法有大量高度优化的批处理和向量化操作。因此安全稀疏乘法的设计目标不是简单地移植明文算法而是要设计一套新的协议使得计算和通信的复杂度与输入矩阵中的非零元数量成正比而不是与矩阵的总规模行数×列数成正比。这要求我们的协议必须是“数据自适应的”或“数据可知的”但同时又不能泄露数据本身的隐私。2.2 关键挑战与“公开知识”的权衡实现上述目标面临一个根本性的矛盾为了高效地只处理非零元计算方服务器需要以某种方式“知道”哪些位置需要被处理。但如果直接知道具体是哪些位置就完全破坏了隐私。我们的解决方案引入了一个关键概念可控的公开知识。我们允许服务器知道一些关于数据稀疏模式的、较高级别的统计信息而非具体的隐私内容。具体来说我们假设服务器公开知道每行非零元的数量即行稀疏度。这是一个关键的折衷。它确实泄露了一些信息比如在用户-物品矩阵中服务器会知道每个用户评价了多少个物品但不知道具体评价了哪些物品及其评分。在许多实际场景中如协同过滤用户活跃度评价数量的分布本身可能不是最敏感的隐私而评价内容具体物品和评分才是。用隐私换取效率是工程实践中常见的权衡。注意这个假设是协议高效性的基础。如果连行稀疏度都不能公开那么任何试图优于密集乘法的通用稀疏算法都将极其困难。后续我们会讨论如何进一步最小化这部分公开知识。2.3 核心构件不经意排序Oblivious Sort这是整个方案的基石。不经意排序允许服务器对一组秘密共享的数据进行排序但排序的结果顺序对服务器也是保密的。也就是说服务器协助完成了排序操作但不知道最终谁排在了第一位谁排在了最后。我们如何利用它呢以安全稀疏向量点积为例。假设有两个秘密共享的稀疏向量A和B我们只知道它们各有η个非零元。首先我们将两个向量的非零元包含其加密的索引和值合并成一个列表。然后对这个列表按照索引值进行不经意排序。排序后具有相同索引的非零元即来自两个向量同一位置的非零元会被排列在一起尽管服务器并不知道它们被排在了哪里。接下来服务器可以安全地遍历这个排序后的列表。每当它检测到两个连续元素的索引相等时通过一次安全的相等比较它就知道这两个元素需要相乘并将乘积累加到结果中。这个“检测”过程也是安全的比较结果是/否同样是秘密共享的用于控制一个条件加法。最终服务器得到的就是两个稀疏向量点积的秘密共享结果。整个过程中服务器从未知晓任何具体的索引值、数值也不知道哪些位置被匹配并相乘了它只是在执行一个固定的、与数据无关的计算流程。3. 算法深度解析从向量到矩阵3.1 安全稀疏向量乘法SS-VecMult这是所有更复杂运算的基础。算法的输入是两个秘密共享的稀疏向量每个向量由η个公开已知非零元构成每个非零元是一个元组(index, value)。算法步骤详解合并与扩展将两个向量的所有非零元合并成一个长度为2η的列表Z。为了后续聚合操作方便我们为每个元组附加一个“来源”标签例如来自向量A的标记为0来自B的标记为1和一个初始为0的“聚合值”字段。不经意排序调用安全的不经意排序协议对整个列表Z按照index字段进行排序。这一步是通信开销的主要部分之一。对于诚实多数模型可以使用基于基数排序的Oblivious Radix Sort对于恶意多数模型则可能采用基于Batcher排序网络的方案。排序后相同索引的元组会相邻排列。聚合与相乘初始化一个累加器[[sum]] 0。遍历排序后的列表从i1到2η-1安全地比较Z[i].index和Z[i1].index是否相等得到一个秘密共享的比特[[eq]]相等为1否则为0。计算[[product]] Z[i].value * Z[i1].value。计算[[term]] [[eq]] * [[product]]。这是一个关键技巧只有当eq1即索引相等时term才等于product否则term0。更新[[sum]] [[sum]] [[term]]。输出最终得到的[[sum]]即为两个稀疏向量点积的秘密共享结果。为什么这样是安全的服务器在整个过程中看到的只有1固定长度的列表2排序、比较、乘法、加法这些基础密码学操作的调用序列。它无法从执行流程中推断出任何关于原始索引、值或匹配模式的信息。相等比较的结果[[eq]]是加密的用于控制加法的[[term]]也是加密的因此“跳过零值”这个决策过程对服务器是完全隐匿的。3.2 安全稀疏矩阵-向量乘法SS-MatVecMult矩阵Am×n乘以向量xn×1可以看作是矩阵A的每一行与向量x做一次点积。假设我们已知矩阵A的每一行有η_i个非零元i从1到m。直观但低效的方法直接为每一行i调用一次SS-VecMult(A[i,:], x)。这需要m次独立的排序和遍历操作通信轮数与m线性相关对于大规模矩阵效率不高。我们的优化方法批量处理将轮数复杂度从O(m)降低到O(log m)。全局排序将矩阵A的所有非零元附带其行号i、列号j、值v与向量x的所有非零元附带其列号j、值v合并到一个大列表中。首先按照列号j进行主排序然后在列号相同的情况下按矩阵行号i进行次级排序。聚合Aggregation排序后所有需要进行相乘的项即矩阵非零元A[i,j]和向量非零元x[j]会因为相同的j被排在一起。我们需要将具有相同(i, j)标识的项聚合即相乘。这里使用一个递归的聚合算法类似归并其轮数复杂度为O(log N)其中N是非零元总数。按行归约经过聚合我们得到了一个列表其中每个元素对应一个(i, value)对表示A[i,:] * x的部分和。最后再按行号i进行一次排序和聚合将同一行的所有部分和相加最终得到结果向量ym×1的秘密共享值。这个算法的精妙之处在于通过巧妙的排序策略将原本需要逐行进行的m次点积转化为两次全局排序和聚合极大地减少了通信轮数。3.3 安全稀疏矩阵-矩阵乘法SS-MatMatMult矩阵Am×p乘以矩阵Bp×n是计算量最大的操作也是许多机器学习算法如协方差矩阵计算的核心。其复杂度在密集情况下是O(mnp)我们的目标是将它降至与非零元数量成正比。算法核心思想外积展开。矩阵乘法C A * B可以理解为对于矩阵A的每一列k和矩阵B的每一行k计算其外积并将所有k的外积相加。在稀疏情境下我们只关注那些A列k和B行k同时非零的k。步骤简述数据重组将矩阵A转换为按列存储的非零元列表每个元素为(i, k, v)矩阵B转换为按行存储的非零元列表每个元素为(k, j, v)。连接与排序将两个列表连接按照共同的维度k进行排序。这样所有A[:,k]和B[k,:]的非零元就被分组到了一起。计算外积对于每个k将分组后的A[:,k]和B[k,:]的非零元两两配对计算(i, j, v_A * v_B)这生成了外积矩阵的一部分非零元。聚合最后将所有k生成的外积极阵的非零元列表合并按照(i, j)进行排序和聚合将相同(i, j)位置的值相加最终得到结果矩阵C的秘密共享稀疏表示。性能优势该算法的通信开销主要取决于非零元的数量和分布。对于极度稀疏的矩阵如99.99%的稀疏度需要处理的配对数量远小于密集算法的m*n*p次乘法从而实现了高达1000倍的通信降低。更重要的是它避免了在内存中实例化巨大的密集中间矩阵解决了内存溢出的问题。4. 实战应用隐私保护机器学习系统构建理论再优美也需要实践检验。我将结合两个典型场景展示如何将这些算法应用到真实的隐私保护系统中。4.1 案例一隐私保护的协同过滤推荐系统场景多个在线平台希望联合训练一个书籍推荐模型但谁也不愿意共享自己的用户-书籍交互数据。数据矩阵的每一行代表一个用户每一列代表一本书矩阵的值是评分或是否阅读。挑战用户-书籍矩阵极度稀疏通常99.9%。使用传统的安全密集乘法即使对于中等规模的数据集例如10万用户×10万书籍中间状态也会轻易耗尽内存。我们的解决方案数据预处理各平台在本地将自己的交互数据转换为稀疏矩阵表示COO格式并为每个非零元生成秘密共享份额发送给计算服务器。同时公开每行的非零元数量用户活跃度。模型计算采用基于最近邻的算法。预测时需要计算目标用户向量与所有物品向量的相似度这本质上是一次稀疏矩阵-向量乘法用户-物品矩阵的转置 × 目标用户向量。我们直接调用SS-MatVecMult算法。结果获取服务器完成计算后得到的是加密的相似度分数向量。通过重建协议可以安全地解密出分数最高的前k个物品ID作为推荐结果返回给目标用户而不会泄露其他用户的任何数据。实测效果在一个模拟的真实数据集上密集算法因内存溢出直接失败。而我们的稀疏算法在平均48分钟内完成了推理计算。这证明了方案的可行性。实际上通过结合MPC中常见的预计算优化等技术运行时间还有进一步缩短的空间。4.2 案例二基于线性判别分析LDA的隐私访问控制系统场景一个大型机构希望构建一个机器学习模型用于实时判断数据库访问请求是否可疑。训练数据是历史的访问日志包含用户属性、资源属性和访问决策允许/拒绝。这些日志高度敏感。挑战访问日志经过独热编码One-hot Encoding后特征维度极高例如1.5万维但每个样本一行仅激活其中极少几个特征导致数据矩阵稀疏度极高99.95%。训练LDA模型需要计算协方差矩阵Cov(X) (1/n) * X^T * X其中X是n×d的数据矩阵。X^T * X是一个d×d的密集矩阵直接计算和存储对于大的d是不可能的。我们的核心技巧协方差矩阵的分解存储与计算。 虽然协方差矩阵Cov(X)本身是密集的但我们可以利用公式Cov(X) (1/n) * X^T * X - μ^T * μ其中μ是均值向量来避免显式存储它。存储我们只存储两个部分稀疏的X^T * X使用我们的SS-MatMatMult算法安全计算得到和密集但维度较小的均值向量μ。推理当需要对一个新样本y应用模型时需要计算Cov(X) * y。我们可以将其转化为(1/n) * (X^T * X) * y - (μ^T * μ) * y。注意到(X^T * X) * y X^T * (X * y)。因此计算流程变为先计算一次稀疏矩阵-向量乘v X * ySS-MatVecMult。再计算一次稀疏矩阵-向量乘X^T * v另一个SS-MatVecMult。最后减去一个向量点积(μ^T * μ) * y。 这样我们全程都没有实例化那个巨大的d×d密集协方差矩阵完全在稀疏表示下完成了所有运算。实施结果使用前1万个样本进行训练密集算法在协方差计算阶段即发生内存溢出。而我们的稀疏算法在5小时内完成了整个训练过程。这个案例生动地展示了通过算法创新可以将原本因资源限制而不可行的隐私保护机器学习应用变为现实。5. 隐私增强最小化必要的公开知识如前所述我们的基础算法需要公开每行的非零元数量。虽然这通常是可以接受的但在某些极端敏感的场景下我们可能希望进一步减少信息泄露。以下是三种渐进式的增强技术。5.1 行匿名化Row Anonymization目标将公开的“每行确切非零元数量”弱化为“全体数据行的非零元数量分布”。方法数据所有者在提交其秘密共享份额之前先通过一个匿名化通道如Tor网络提交。由于服务器收到数据的顺序被打乱它们无法将特定的行稀疏度与特定的数据所有者关联起来。原理机器学习算法通常假设数据样本是独立同分布的行的顺序不影响模型。因此打乱行顺序不会改变输入数据的统计本质。服务器最终知道的只是“有X%的行有1个非零元Y%的行有2个非零元……”而不知道哪个数据所有者贡献了稀疏的行哪个贡献了密集的行。这保护了数据所有者个体的行为模式。5.2 最大行填充Max-Row Padding目标进一步将公开知识减少到仅仅是一个“每行非零元数量的上限”。方法所有数据所有者协商一个公共的上限值M例如通过一个安全的MAX协议计算所有行稀疏度的最大值。然后每个所有者将自己的每一行“填充”到恰好M个非零元。填充的方法是添加“虚拟非零元”dummy non-zeros即值为零的条目但它们在计算中被当作普通非零元处理。优缺点优点公开信息最少只泄露一个全局上限。缺点可能引入巨大开销。如果数据集中存在少数“异常值”行拥有极多的非零元例如一个超级活跃的用户那么M会很大导致其他所有行都需要填充大量虚拟元几乎将稀疏矩阵变回密集矩阵抵消了稀疏算法的优势。5.3 矩阵模板Matrix Templating目标在“减少公开信息”和“控制计算开销”之间取得更好的平衡。核心思想不强制所有行填充到同一个上限而是将数据矩阵水平分割成K个块。每个块内的行填充到该块指定的非零元上限。例如我们可以按行稀疏度的分位数如25%, 50%, 75%, 90%, 99%, 100%来划分块。稀疏度最低的25%的行放入第一个块填充到一个较小的上限nnz1接下来的25%的行放入第二个块填充到稍大的上限nnz2以此类推。如何操作数据所有者先按行稀疏度对自己的行进行排序行顺序对ML无影响。根据公开的模板T {(n1, nnz1), (n2, nnz2), ..., (nK, nnzK)}将前n1行填充到nnz1接下来n2行填充到nnz2……最后nK行填充到最大值nnzK。将填充后的矩阵进行秘密共享。隐私与效率的权衡公开的知识从“每行精确稀疏度”变成了“几个分位数阈值”。这比行匿名化泄露得多因为知道了分块信息但比最大行填充泄露得少。在效率上它远优于最大行填充因为只有最后一个小块通常包含最少量的行需要填充到很高的上限大部分行只需要较少的填充。如何获得模板有几种隐私保护的方式基于公开数据集从一个类似的、公开的数据集上计算分位数作为模板。这假设公开集与隐私集分布相似。基于安全多方计算MPC数据所有者秘密共享各自的行稀疏度服务器安全地计算全局分位数。为了确保所有行都能适配计算出的模板可能还需要一个安全的缩放因子计算步骤。基于差分隐私DP如果连通过MPC计算分位数都认为有风险可以使用差分隐私机制来发布一个安全的、略高于真实值的分位数上界。这提供了更强的隐私保障但会引入一些噪声可能导致模板稍大增加一点开销。效果对比在实际数据集上的实验表明矩阵模板技术能显著降低开销。例如在MovieLens数据集上最大行填充会使存储开销增加近100倍几乎等同于密集矩阵而矩阵模板使用5个分位数仅使开销增加约2倍在隐私和效率间取得了极佳的平衡。6. 实现细节与性能调优6.1 不经意排序协议的选择排序是算法中开销最大的操作之一。选择哪种不经意排序协议至关重要它取决于威胁模型。诚实多数模型Honest Majority例如三方案例中至多一方腐败。在此模型下不经意基数排序Oblivious Radix Sort是高效的选择。其复杂度约为O(η log M)其中η是待排序元素数量M是索引的最大值范围。它通过逐位比较进行排序轮数较少。恶意多数模型Malicious Majority例如两方计算双方都可能腐败。此时需要更强的安全性。Batcher排序网络是一个可行的选择。它由一系列固定的比较-交换单元构成无论输入如何执行路径都完全相同非常适合在算术电路或乱码电路Garbled Circuit中实现。但其复杂度为O(η log² η)高于基数排序。实操建议在大部分实际的企业级联合建模场景中参与方数量有限如3-5个且通常有合同约束诚实多数模型是更常见且更高效的假设。优先实现和优化基于不经意基数排序的版本。6.2 通信轮数的优化基础算法中矩阵-向量乘法的聚合步骤有一个按行归约的循环如果实现不当会导致O(m)的通信轮数m为行数。这对于大规模矩阵是不可接受的。优化技巧递归聚合树。 我们可以借鉴MPC库中计算安全最大值的递归算法思想。将需要聚合的列表视为一棵树将列表元素两两配对安全地比较它们的行号是否相等。如果相等则将它们的值相加并将结果“提升”到树的上一级如果不相等则选择其中一个或一个标记值提升。递归地对上一级的结果列表重复步骤1-2。 通过这种分而治之的策略可以将轮数复杂度从O(m)降低到O(log m)。虽然算法逻辑变得稍复杂但对于大规模计算这是必须付出的代价否则网络延迟将成为主要瓶颈。6.3 占位符的移除与内存管理在矩阵乘法的最后阶段我们可能会得到一个包含大量“占位符”即值为零的条目来自未匹配的虚拟元或聚合后的零结果的结果列表。在明文稀疏计算中我们会直接过滤掉它们。但在MPC中我们需要安全地移除它们而不泄露“哪些被移除了”这一信息这本身会泄露非零元数量。“洗牌-揭示”技巧对结果列表包含真实结果和占位符进行不经意洗牌Oblivious Shuffle。这打乱了元素的顺序。安全地揭示每个元素是否为零。由于顺序已被打乱揭示“零值”的位置并不泄露任何关于原始数据关联性的信息。服务器只知道当前乱序列表中有多少个零。所有参与方协作将非零元移动到列表前端并记录新的有效长度。最后截取列表前段得到纯净的、压缩后的稀疏结果表示。这个过程确保了输出稀疏格式的紧凑性为后续计算节省资源。7. 常见问题与避坑指7.1 性能瓶颈分析与定位问题实现算法后发现性能没有达到预期甚至比密集算法还慢。排查思路剖析通信成本使用MPC框架的分析工具统计不同协议阶段排序、比较、乘法的通信字节数和轮数。通常不经意排序是最大的开销来源。确保你使用的排序算法与威胁模型匹配并且已经过优化例如对于整数索引使用基数排序。检查公开知识假设确认你是否正确提供了行稀疏度信息。如果提供的η每行非零元数量是真实值的上界而非精确值会导致大量不必要的虚拟元计算拖慢速度。使用矩阵模板技术来获得更紧致的上界。审视数据分布稀疏算法的优势高度依赖于数据的稀疏程度和分布。如果数据是“块稀疏”或“带状稀疏”而非随机稀疏我们的通用算法可能不是最优的。可以考虑针对特定结构定制更高效的协议。网络与并行化MPC性能受网络延迟影响极大。确保计算服务器之间是低延迟、高带宽的连接。同时探索算法内潜在的并行化机会例如将大矩阵分块在不同服务器组上并行计算不同的块。7.2 精度与数值稳定性问题在安全计算中通常使用定点数Fixed-point或有限域Finite Field算术来模拟实数运算。这可能在迭代算法如某些优化算法中引发精度损失或溢出问题。应对策略缩放因子Scaling Factor在秘密共享前对浮点数乘以一个大的缩放因子如2^16转换为整数。整个计算在整数域进行最后再除以缩放因子得到结果。需要仔细规划乘法带来的缩放因子平方问题。选择足够大的域如果使用有限域算术必须确保域的大小素数足够大能够容纳计算过程中可能出现的最大值而不发生溢出。例如计算X^T * X时元素值可能会非常大。正则化Regularization在机器学习算法中加入L2正则化项不仅有助于防止过拟合也能改善数值稳定性。测试与验证在明文环境下用相同的定点数/有限域算术模拟整个计算流程与浮点结果对比验证精度是否在可接受范围内。7.3 与现有MPC框架的集成问题如何将这套稀疏矩阵算法集成到像MPyC、ABY3、SEAL等现有的MPC框架中实操建议抽象层设计将稀疏矩阵定义为一个抽象数据类型包含indices索引列表、values值列表和shape矩阵形状等属性。在框架内实现其秘密共享版本。复用基础原语我们的算法依赖于安全加法、乘法、比较和排序。大多数现代MPC框架都提供了这些基础原语的高效实现。你的任务是将这些原语像搭积木一样组合起来实现本文描述的算法流程。利用预处理如果可用许多MPC框架如SPDZ支持离线预处理阶段可以提前生成“Beaver三元组”等材料。我们的算法中大量的乘法和比较操作都可以受益于此将在线阶段的成本降至最低。开源参考论文作者已公开了算法实现https://github.com/MarcT0K/Secure-sparse-multiplications。这是一个极佳的起点可以理解其接口设计和与MPC后端的交互方式然后适配到你选择的框架中。7.4 安全性假设再确认问题我们的算法目前的安全证明是在“诚实但好奇”模型下完成的。如果参与方可能是恶意的即可能任意偏离协议该怎么办当前状态与升级路径基础算法目前提供的是“半诚实安全”。这意味着只要参与方遵循协议步骤隐私就能得到保障。迈向恶意安全要防御恶意敌手需要做出重大调整可验证秘密共享使用如Shamir秘密共享并配合信息论MAC消息认证码或同态承诺确保共享值的完整性。恶意安全的不经意排序需要采用能抵抗恶意行为的排序协议例如基于混洗和复制的更复杂构造或者为现有排序网络的每一步添加零知识证明。输入一致性检查防止恶意方提交不一致的输入例如声称一行有η个非零元但实际提交了更多或更少。这可能需要额外的承诺和打开步骤。结果验证可能需要引入冗余计算或牺牲样本sacrificial samples来验证最终结果的正确性。 实现恶意安全会带来显著的开销通常是一个数量级以上的增长。因此在决定是否需要升级前务必仔细评估实际应用场景的威胁模型。对于许多有合同约束的商业合作场景半诚实模型通常是足够的。

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

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

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…