Paper Digest|基于在线聚类的自监督自蒸馏序列推荐模型

论文标题: Leave No One Behind: Online Self-Supervised Self-Distillation for Sequential Recommendation

作者姓名: 韦绍玮、吴郑伟、李欣、吴沁桐、张志强、周俊、顾立宏、顾进杰

组织单位: 蚂蚁集团

录用会议: WWW 2024 Research Track

本文作者:韦绍玮|蚂蚁集团高级算法工程师。 主要研究方向是图算法,推荐算法与语言大模型。研究成果曾多次收录于主流机器学习相关会议(WWW/AAAI/ECML)。过去一年团队的主要工作聚焦于通用推荐算法的研究和应用,在WWW’24发表了基于在线聚类的自监督自蒸馏序列推荐模型“S4Rec”一篇论文。

背景

序列推荐作为一种重要的推荐模式,在诸多网络平台,如亚马逊、阿里巴巴等上发挥着至关重要的作用。一般来说,序列推荐以用户的物品交互历史序列作为输入,预测近期可能发生的用户-物品交互。
早期的序列推荐方法主要建模简单的低阶序列依赖,之后由于神经网络强大的非线性表达能力,多层感知机、递归神经网络以及Transformers等框架相继被引入至序列推荐。为了解决行为稀疏的用户信息缺失,训练得不够充分的问题,受计算机视觉(CV)和自然语言处理(NLP)使用的自监督学习启发,一些工作试图引入对比学习技术,通过最大化用户行为序列的增强视图的互信息来获取额外的监督信息,优化用户表征,进而改进序列推荐模型。为了进一步引入更多的信息,一些工作开始探索跨用户间共享的意图,如ICLRec。ICLRec通过K-means对用户进行聚类,它假设每一个簇代表着一个潜在意图,然后使用意图信息指导用户表征学习。然而,由于聚类算法属于无监督学习,聚类所得的簇的含义难以控制。下图展示了三位用户的行为历史序列,用户1比较活跃,历史行为丰富,因此序列长度较长;反之,用户1和用户2属于不活跃用户,历史交互只有1次。当我们尝试对三个用户聚类成两个簇的时候,可能会出现两种聚类模式(极端情况可能出现三种):

  • 聚类1表示将用户按照是否活跃划分为两个簇;
  • 聚类2表示将用户按照是否为电子产品爱好者划分为两簇;

我们不希望产生聚类1,因为只有聚类2是真正按照不同意图将用户区分开来。然而如果不加以设计的话,实际很有可能得到聚类1的结果。此外,K-means等传统聚类算法通常涉及对整个数据集的操作,这是相当耗时且耗费资源的。

图片

综上分析,为了给用户,特别是行为稀疏用户提供更多可利用的信息,解决训练不充分的问题,蚂蚁集团提出了一种以在线聚类为基础的序列推荐模型,称为基于在线聚类的自监督自蒸馏模型 S 4 R e c S^4Rec S4Rec具体来说,我们首先对用户进行在线聚类, 识别用户不同的潜在意图。在这个过程中,我们利用对抗学习策略来确保聚类过程不受用户行为稀疏性因素的影响。随后,我们提出了一种自蒸馏方法来促进信息从行为丰富的用户(教师)传导到行为稀疏的用户(学生)。

方案设计

接下来我们详细介绍围绕用户聚类串联的整体方案 S 4 R e c S^4Rec S4Rec
图片
S 4 R e c S^4Rec S4Rec模型结构图

模块拆解

图片

  • 【主线】 兴趣聚类->知识蒸馏

根据用户的序列行为兴趣聚类,用所属聚类簇中心表征对用户表征进行知识蒸馏,将知识从行为丰富的用户传递给行为稀疏的用户。

  • 挑战与解决方案

【问题1】 聚类效率挑战

    • 问题分析:传统K-Means等离线聚类方案需要用全量数据迭代计算,计算成本高,并且与推荐主模型的两阶段计算模式会损失端到端的优化效率。
    • 解决方案:在batch内实现基于原型的聚类,约束每个batch内的样本应该尽可能均匀地分配至不同的簇中,采用Sinkhorn-Knopp算法求解。

【问题2】序列行为稀疏的挑战

    • 问题分析:兴趣聚类的主要输入是用户的历史行为序列,自然的难点就是低频用户的行为稀疏。
    • 解决方案:将低频用户可被观测的行为视为其完整兴趣点的局部采样;对比学习的思路是通过mask/dropout等数据增强的方式对齐同一主体不同的局部view。在序列对比学习中,通过对用户序列输入随机mask生成两个view,基于InfoNCE Loss拉近两个view的序列表征,强化模型对稀疏行为序列表征的强健性。

【问题3】知识蒸馏的方案

    • 问题分析:在原型聚类基础上,如何实现高频用户向低频用户的知识传递
    • 解决方案:采用自蒸馏的方案实现U2C2U (user 2 cluster 2 user)的知识传递。具体实现为最大化用户表征(学生)和用户意图(教师)的分布相似度,聚类感知的自蒸馏损失定义为KL散度。

【问题4】高低频用户聚类分布不均衡的挑战

    • 问题分析:基于行为序列的聚类结果与用户的行为频率高度耦合,导致高活用户与低活用户往往分布在不同的簇,进而阻断了高活到低活用户的知识传递。
    • 解决方案:增加高低活用户的分类任务作为聚类的对抗学习任务,使得聚类任务避免受到用户行为稀疏度的影响,达到高活用户在各个簇中分布更加均匀的效果。具体方法是在编码器和分类器之间插入一个梯度反转层(GRL)。在反向传播过程中,用于最小化分类损失的梯度反向传播至分类器,并且在GRL之后,梯度将被反转,其进一步反传至编码器。也就是说,对于分类损失,我们对分类器的参数执行梯度下降,同时对编码器的参数执行梯度上升,从而实现对抗学习。

模型组件

Online Clustering: 用户在线聚类

基于用户行为序列和属性特征得到的表征的进行在线聚类,形成用户聚类簇分配和聚类质心。

首先,对用户原始特征 S u \mathcal{S}_{u} Su进行编码, f θ f_{\theta} fθ为编码器:
z u = f θ ( S u ) , \mathbf{z}_{u}=f_{\theta}(\mathcal{S}_{u}), zu=fθ(Su),
获取聚类簇隶属度向量,

μ k \bm{\mu}_k μk为参数化聚类原型:

p u k = exp ⁡ ( z u μ k ⊤ / τ 1 ) ∑ k ′ exp ⁡ ( z u μ k ′ ⊤ / τ 1 ) , \mathbf{p}_{u}^{k}=\frac{\exp(\mathbf{z}_{u}\bm{\mu}_k^{\top}/\tau_1)}{\sum_{k'}\exp(\mathbf{z}_{u}\bm{\mu}_{k'}^{\top}/\tau_1)}, puk=kexp(zuμk/τ1)exp(zuμk/τ1),

假设存在聚类标签 q u \mathbf{q}_{u} qu,则可以用交叉熵损失对聚类以batch的形式进行优化:

L C l u s t ( z u , q u ) = − ∑ k q u k log ⁡ p u k . \mathcal{L}_{Clust}(\mathbf{z}_{u},\mathbf{q}_{u})=-\sum_{k}\mathbf{q}_{u}^{k}\log\mathbf{p}_{u}^{k}. LClust(zu,qu)=kquklogpuk.

问题关键在于如何构建聚类标签。

由于聚类属于无监督学习,我们在此仅对聚类结果施加一项弱约束,即希望每个batch内的样本应该尽可能均匀地分配至不同的簇中,从而避免陷入平凡解。我们通过将聚类标签 Q \mathbf{Q} Q建模为运输多面体(transportation polytope)来实现均匀划分,其形式化为:

Q = { Q ∈ R + B × K ∣ Q 1 K = 1 B 1 B , Q ⊤ 1 B = 1 K 1 K } , \mathbf{Q}=\{\mathbf{Q}\in\mathbb{R}_{+}^{B\times K}|\mathbf{Q}\mathbf{1}_{K}=\frac{1}{B}\mathbf{1}_{B},\mathbf{Q}^{\top}\mathbf{1}_{B}=\frac{1}{K}\mathbf{1}_{K}\}, Q={QR+B×KQ1K=B11B,Q1B=K11K},

上式的一种解的形式为归一化指数矩阵:

Q ∗ = d i a g ( m ) exp ⁡ ( Z μ ⊤ ϵ ) d i a g ( v ) . \mathbf{Q}^*=diag(\mathbf{m})\exp(\frac{\mathbf{Z}\bm{\mu}^{\top}}{\epsilon})diag(\mathbf{v}). Q=diag(m)exp(ϵZμ)diag(v).

其中, m \mathbf{m} m v \mathbf{v} v是待求解向量。我们将聚类看作一个最优传输问题,即需要将B个样本以最小代价分配到K个cluster中,进而可以使用解决最优传输问题的各种方法和工具,本文中使用Sinkhorn-Knopp算法求解上式。

由此,我们可以在训练过程中迭代优化聚类原型 μ k \bm{\mu}_k μk,以及获取用户的簇分配 p u k \mathbf{p}_{u}^{k} puk

Sequence-level CL:序列对比学习

通过对序列进行随机增强,将两组不同增强序列的表征作为正样本对进行对比学习。通过序列对比学习的自监督模块强化模型对稀疏行为序列表征的强健性。

用户的行为序列自然地可用于获取自监督信号。给定数据增强算子的函数集 G \mathcal{G} G,包含如mask、reorder和insert等算子,以及用户序列 S u \mathcal{S}_{u} Su,我们可以创建两个增强视图:

S ~ u 1 = g u 1 ( S u ) , S ~ u 2 = g u 2 ( S u ) , g u 1 , g u 2 ∈ G , \tilde{\mathcal{S}}_{u}^{1}=g_{u}^{1}(\mathcal{S}_{u}),\tilde{\mathcal{S}}_{u}^{2}=g_{u}^{2}(\mathcal{S}_{u}), g_{u}^{1},g_{u}^{2}\in \mathcal{G}, S~u1=gu1(Su),S~u2=gu2(Su),gu1,gu2G,

经典的InfoNCE损失只利用了样本本身的监督信息。我们经过在线聚类后,获得了用户的簇分配,可以进一步考虑用负原型构建负样本对,丰富对比学习监督信息。因此InfoNCE Loss可重写为:

L S C L = L S C L ( z u 1 , z u 2 ) + L S C L ( z u 2 , z u 1 ) , \mathcal{L}_{SCL}=\mathcal{L}_{SCL}(\mathbf{z}_{u}^{1},\mathbf{z}_{u}^{2})+\mathcal{L}_{SCL}(\mathbf{z}_{u}^{2},\mathbf{z}_{u}^{1}), LSCL=LSCL(zu1,zu2)+LSCL(zu2,zu1),

L S C L ( z u 1 , z u 2 ) = − log ⁡ exp ⁡ ( z u 1 z u 2 ⊤ / τ 2 ) ∑ n ≠ u exp ⁡ ( z u 1 z n ⊤ / τ 2 ) + ∑ k ′ ≠ h ( u ) exp ⁡ ( z u 1 μ k ′ ⊤ / τ 2 ) , \mathcal{L}_{SCL}(\mathbf{z}^{1}_{u},\mathbf{z}^{2}_{u})= -\log\frac{\exp(\mathbf{z}^{1}_{u}\mathbf{z}^{2\top}_{u}/\tau_2)}{\sum_{n\neq u}\exp(\mathbf{z}^{1}_{u}\mathbf{z}^{\top}_{n}/\tau_2)+\sum_{k'\neq h(u)}\exp(\mathbf{z}^{1}_{u}\bm{\mu}^{\top}_{k'}/\tau_2)}, LSCL(zu1,zu2)=logn=uexp(zu1zn/τ2)+k=h(u)exp(zu1μk/τ2)exp(zu1zu2⊤/τ2),

其中 h ( u ) h(u) h(u)是将 u u u映射到所属原型向量的下标的函数。

Cluster-aware Self-distillation: 聚类感知的自蒸馏

用所属聚类簇中心表征对用户表征进行知识蒸馏,通过聚类感知的自蒸馏模块将知识从行为丰富的用户传递给行为稀疏的用户。

考虑到大多数用户特征的稀疏性,样本级别的自监督信号是有限的。我们希望通过知识蒸馏(KD)连接原型粒度信息和样本粒度信息。然而,大多数KD方法都需要一个经过预训练的、相对复杂的教师模型。
针对链路较长的KD方法,自蒸馏方法通过利用同一骨干网络同时充当教师和学生来简化蒸馏流程。然而,相关工作需要通过不同的子网络配置来区分教师和学生。
我们则使用同一网络,不同输出来区分教师和学生,即用户意图和用户表征。首先计算用户表征和对应意图的归一化分布:
在这里插入图片描述

e u , s i = exp ⁡ ( z u i / τ 3 ) ∑ i ′ exp ⁡ ( z u i ′ / τ 3 ) , \mathbf{e}_{u,s}^{i}=\frac{\exp(\mathbf{z}_{u}^{i}/\tau_3)}{\sum_{i'}\exp(\mathbf{z}_{u}^{i'}/\tau_3)}, eu,si=iexp(zui/τ3)exp(zui/τ3),

聚类感知的自蒸馏损失可以直接定义为KL散度,最大化用户表征(学生)和用户意图(教师)的分布相似度:
在这里插入图片描述

L C K D ( μ h ( u ) , z u 1 ) = ∑ i e u , t i log ⁡ e u , t i e u , s i , \mathcal{L}_{CKD}(\bm{\mu}_{h(u)},\mathbf{z}^{1}_{u})=\sum_{i}\mathbf{e}_{u,t}^{i}\log\frac{\mathbf{e}_{u,t}^{i}}{\mathbf{e}_{u,s}^{i}}, LCKD(μh(u),zu1)=ieu,tilogeu,sieu,ti,

这项损失为用户,特别是低活用户表征优化提供了额外的监督信号。

Head-tail Adversarial Learning: 用户分层对抗学习

利用梯度反转,减少聚类簇的头/尾语义。

聚类任务容易受到用户行为稀疏度的影响而将高低频用户分别独立成簇。低频用户所在的簇信息将变得稀疏,从而降低知识蒸馏的效果。因此引入用户分层标签的分类任务作为对抗学习,使得聚类任务避免受到用户行为稀疏度的影响,达到各分层用户在各个簇中分布更加均匀的效果。

具体来说,我们将学习到的用户表征作为输入,训练一个分类器,用以预测用户所属类别(如头/尾,高频/低频)。同时,编码器的目标则是生成能够有效欺骗分类器的用户表征。通过联合训练分类器和编码器,可以降低用户表征的类别信息,从而实现更均匀的聚类分布。

我们使用简单的全连接层作为用户类别分类器,并利用交叉熵损失来优化分类器。公式为:

c ^ = W z u , \hat{\mathbf{c}}=\mathbf{W}\mathbf{z}_{u}, c^=Wzu,
L A d v = − c ^ [ c ] + log ⁡ ( ∑ i exp ⁡ ( c ^ [ i ] ) ) , \mathcal{L}_{Adv}=-\hat{\mathbf{c}}[c]+\log(\sum_{i}\exp(\hat{\mathbf{c}}[i])), LAdv=c^[c]+log(iexp(c^[i])),

其中, c ^ \hat{\mathbf{c}} c^是分类器的预测结果, c \mathbf{c} c是类别标签。在对抗性学习的设置下,分类器的目标是最小化分类损失失,编码器则反之。我们的具体方法是在编码器和分类器之间插入一个梯度反转层(GRL)。在反向传播过程中,用于最小化分类损失的梯度反向传播至分类器,并且在GRL之后,梯度将被反转,其进一步反传至编码器。也就是说,对于分类损失,我们对分类器的参数执行梯度下降,同时对编码器的参数执行梯度上升。我们以这种方式实现了对抗学习。

联合损失函数

最后,我们以多任务的形式联合优化主任务,用户在线聚类任务,序列粒度对比学习任务,聚类感知的自蒸馏任务以及用户分层对抗任务,其联合损失函数为:

L = L S R + α L C l u s t + β 1 L S C L + β 2 L C K D + λ L A d v . \mathcal{L}=\mathcal{L}_{SR}+\alpha\mathcal{L}_{Clust}+\beta_{1}\mathcal{L}_{SCL}+\beta_{2}\mathcal{L}_{CKD}+\lambda\mathcal{L}_{Adv}. L=LSR+αLClust+β1LSCL+β2LCKD+λLAdv.

实验效果

实验设置

数据集

我们使用了四个常用的序列推荐基准数据集:Beauty、 Sports、 Toys 以及 ML-1M。

图片

对比方法

标准序列模型:Caser、GRU4Rec、SASRec

序列模型+对比学习:BERT4Rec、S3-Rec、CL4SRec

序列模型+对比学习+意图因子:DSSRec、ICLRec

对比实验

图片

如上图所示, S 4 R e c S^4Rec S4Rec基本在所有指标取得最优性能。
与标准序列模型相比, S 4 R e c S^4Rec S4Rec无疑优于所有基准。尽管基于Transformer的编码器在标准序列模型中实现了最佳性能,但与 S 4 R e c S^4Rec S4Rec相比,它的性能仍然相对较差。因此,利用自监督信号来充分优化模型参数至关重要。

与使用自监督学习的序列模型相比, S 4 R e c S^4Rec S4Rec引入了用户意图原型,这些原型包含了用户行为序列的语义信息。这些对比方法专注于行为序列粒度的自监督学习,但未能利用意图级别信息。因此, S 4 R e c S^4Rec S4Rec能够取得较大的性能提升。

与ICLRec相比, S 4 R e c S^4Rec S4Rec总是在每个指标中的表现领先。ICLRec的性能是有限的,因为在ICLRec中两次连续的聚类分配之间没有对应关系。因此,从聚类簇中学习到的最终预测可能与下一轮的预测无关,可能会扰乱模型训练。此外,ICLRec的聚类还存在头尾用户分布不均衡问题,这导致了次优聚类。结果验证了在线聚类和对抗策略的有效性。

消融实验

图片

如上表所示,标准序列推荐模型(SR)和 S 4 R e c S^4Rec S4Rec都从能从设计的自监督模块(CSD)和用户分层对抗学习模块(GR)中获得性能提升。完整配置的 S 4 R e c S^4Rec S4Rec基本在所有指标都优于SR+CSD+GR,二者的主要区别在于所采用的聚类算法SR+CSD+GR使用的聚类是传统的k-means算法,需要在完整的数据集上执行,而 S 4 R e c S^4Rec S4Rec使用在线聚类。也就是说,尽管k-means算法利用了所有数据点,但在小批量内执行聚类不会影响推荐结果。
基于上述结果的结果,我们验证了所提出的设计的有效性。

用户分层对抗学习分析

图片

图片

我们在真实数据集上对用户进行不施加约束的聚类,结果如上图(左)所示,直方图表现出明显的双峰特征,这表示丰富行为(长序列)的用户的学习表示往往聚成一簇,且与行为稀疏(短序列)的用户相互分离,直方图的双峰越明显,这符合我们在第一节中的分析。但是,理想情况下,学习到的用户表示应该受到用户潜在意图的影响,而不应当受行为稀疏性的影响,因此我们进一步引入用户对抗学习,使得不管是行为丰富用户还是行为稀疏用户在各个簇中分布都比较均匀均匀的效果。实验效果如上图(右)所示,实际聚类分布更加接近于理想的单峰分布。

图片

我们进一步分析用户分层对抗权重对结果的影响。如上图所示,随着对抗分类损失权重的增大,聚类簇中的用户类别分布更加均匀,模型性能随之提升;当权重进一步增大,推荐性能开始下降。辅助任务影响到主任务的学习,可能也说明了用户类别与用户兴趣存在一定程度关联。

线上实验

S 4 R e c S^4Rec S4Rec已在支付宝多个营销推荐场景取得显著效果。

总结与展望

我们通过在线聚类以及用户类别对抗学习的约束,能够将用户进行分群,进一步利用分群信息指导用户表征学习,从而提升各分群用户的推荐效果。 在公开数据集的效果以及在支付宝营销推荐多个场景的推全,说明了方法的有效性和通用性。后续我们将对模型各模块做进一步优化,如更好地设计聚类目标,更好地使用意图信息以及与因果推断相结合等。

分布式全链路因果学习系统 OpenASCE:

https://github.com/Open-All-Scale-Causal-Engine/OpenASCE

大模型驱动的知识图谱 OpenSPG:

https://github.com/OpenSPG/openspg

大规模图学习系统 OpenAGL:

https://github.com/TuGraph-family/TuGraph-AntGraphLearning

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

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

相关文章

CSS之动画

一,动画的制作 实现盒子绕圈走 二, 动画的常用属性 三,动画简写属性 前面两个属性一定要写,第三个linear是指匀速的意思(默认是ease)

【Java多线程】4——特定场景解决办法

4 特定场景解决方法 ⭐⭐⭐⭐⭐⭐ Github主页👉https://github.com/A-BigTree 笔记仓库👉https://github.com/A-BigTree/tree-learning-notes 个人主页👉https://www.abigtree.top ⭐⭐⭐⭐⭐⭐ 如果可以,麻烦各位看官顺手点个st…

C语言结合体和枚举的魅力展现

前言 ✨✨欢迎👍👍点赞☕️☕️收藏✍✍评论 个人主页:秋邱’博客 所属栏目:人工智能 (感谢您的光临,您的光临蓬荜生辉) 引言: 前面我们已经讲了结构体的声明,自引用,内存…

排序C++

题目 法1 sort升序排序&#xff0c;再逆序输出 #include<iostream> #include<algorithm> using namespace std;const int N 5e53;//注意const&#xff0c;全局 int a[N]; int main() {//错误int N5e53;//错误const int a[N];int n;cin >> n;for (int i 1;…

【数据结构】新篇章 -- 顺序表

&#x1f308; 个人主页&#xff1a;白子寰 &#x1f525; 分类专栏&#xff1a;python从入门到精通&#xff0c;魔法指针&#xff0c;进阶C&#xff0c;C语言&#xff0c;C语言题集&#xff0c;C语言实现游戏&#x1f448; 希望得到您的订阅和支持~ &#x1f4a1; 坚持创作博文…

【数据结构】顺序表习题之移除元素和合并两个有效数组

&#x1f451;个人主页&#xff1a;啊Q闻 &#x1f387;收录专栏&#xff1a;《数据结构》 &#x1f389;道阻且长&#xff0c;行则将至 前言 嗨呀&#xff0c;今天的博客是关于顺序表的两道题目&#xff0c;是力扣的移除元素和合并有序数组的题目。 一.移除…

EXCEL通过VBA字典快速分类求和

EXCEL通过VBA字典快速分类求和 汇总截图 Option ExplicitOption Explicit Sub answer3() Dim wb As Workbook Dim sht As Worksheet Set wb ThisWorkbook Set sht wb.Worksheets(2) Dim ss1 As Integer Dim ss2 As Integer Dim i As Integer Dim j As Integer j 1Dim aa()…

人工智能:数字化转型中的关键角色

人工智能&#xff1a;数字化转型中的关键角色 数字化转型是十多年来商业变革的核心&#xff0c;它本身也在人工智能的崛起中发生转变。人工智能有望极大地改变数字化转型&#xff0c;从企业设定的目标到从业者用来推进计划的工具。本文将深入探讨人工智能在数字化转型中的扮演的…

Transformers —— 以通俗易懂的方式解释-Part 1

公众号:Halo咯咯,欢迎关注~ 本系列主要介绍了为ChatGPT以及许多其他大型语言模型(LLM)提供支持的Transformer神经网络。我们将从基础的Transformer概念开始介绍,尽量避免使用数学和技术细节,使得更多人能够理解这一强大的技术。 Transformers —— 以通俗易懂的方式解释…

pip永久修改镜像地址

修改命令&#xff1a; pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple/ 效果&#xff1a; 会在C:\Users\PC(用户名)\AppData\Roaming\pip目录下新增或修改文件pip.ini 文件内容&#xff1a; [global] index-url https://pypi.tuna.tsinghua.e…

关于web_server项目的学习记录(自用)

主要参考资料&#xff1a; 我在地铁吃闸机 基础处理框架&#xff1a;Multi-reactor muduo库有三个核心组件实现持续监听reactor的fd&#xff1a;channel;epoll/poller/eventloop类 channel 事件监听器epoll_ctl监听到了fd发生了什么事件,channel类会封装每个fd和fd感兴趣的事…

9、鸿蒙学习-开发及引用静态共享包(API 9)

HAR&#xff08;Harmony Archive&#xff09;是静态共享包&#xff0c;可以包含代码、C库、资源和配置文件。通过HAR可以实现多个模块或多个工程共享ArkUI组件、资源等相关代码。HAR不同于HAP&#xff0c;不能独立安装运行在设备上&#xff0c;只能作为应用模块的依赖项被引用。…

ethers.js:sign(签名)

Signers 在ethers中Signer是以太坊账户的抽象&#xff0c;可以用来签名消息和交易&#xff0c;如将签名的交易发送到以太坊网络以执行状态更改的操作。 npm install ethers5.4.0// 引入 import { ethers } from ethers签名 this.provider new ethers.providers.Web3Provider(…

36.not comply with the UI component syntax不允许在UI描述里直接使用

不允许在UI描述里直接使用&#xff0c;但可以在方法或者函数里使用 not comply with the UI component syntax. <etsLint> 这里ok:

搜索与图论——Floyd算法求最短路

floyd算法用来求多源汇最短路 用邻接矩阵来存所有的边 时间复杂度O(n^3) #include<iostream> #include<cstring> #include<algorithm>using namespace std;const int N 20010,INF 1e9;int n,m,k; int g[N][N];void floyd(){for(int k 1;k < n;k ){f…

Python-基础部署

机器没法直接读懂我们写的代码&#xff0c;需要解释解释器作为中间的翻译&#xff0c;把代码转换成字节码在执行 安装python解释器 Download Python | Python.org 安装代码编辑器 pycharm Thank you for downloading PyCharm! 创建一个项目&#xff0c;每个项目里的文件夹…

一周学会Django5 Python Web开发-Django5模型定义

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计41条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…

Windows无法安装torch==1.4.0

在conda中&#xff0c;每创建一个虚拟环境&#xff0c;就要重新配置其中的pytorch 这次我创建的虚拟环境需要torch1.4.0的版本。 torch网址&#xff1a;https://pytorch.org/get-started/previous-versions/ 解决办法 按以下代码进行安装&#xff1a; pip install torch0.4.0…

【MySQL探索之旅】MySQL数据表的增删查改——约束

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 《MySQL探索之旅》 |《Web世界探险家》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更…

工业项目中你连IIoT系统都没见过?

什么是IIoT 工业物联网&#xff08;IIoT&#xff09;是信息技术和制造业融合的产物&#xff0c;利用物联网技术连接工业设备、传感器、系统和人员&#xff0c;实现工业生产数字化、智能化、自动化。IIoT提升生产效率、品质、减低成本和资源利用&#xff0c;打造智能化工业。 功…