适应性神经树:当深度学习遇上决策树的“生长法则”

1st author: Ryutaro Tanno

video: Video from London ML meetup

paper: Adaptive Neural Trees ICML 2019

code: rtanno21609/AdaptiveNeuralTrees: Adaptive Neural Trees


背景

在机器学习领域,神经网络(NNs)凭借其强大的表示学习能力,在诸多应用中取得了显著成果,然而其“黑箱”特性和预设架构的局限性也常为人诟病。与之相对,决策树(DTs)以其良好的可解释性、自适应结构和轻量级推理等优势受到青睐,但在特征工程和决策函数简单性方面存在不足。

本文旨在深入解析 2019 年国际机器学习大会 (ICML) 论文《自适应神经树 (Adaptive Neural Trees, ANTs)》,该研究提出了一种创新性的方法,旨在融合这两类模型的优点。ANTs 将神经网络的表示学习能力深度融入决策树的结构中,体现在以下几个方面:

  • 边的特征转换: 数据在树的路径上传递过程中,通过神经网络进行特征转换。
  • 内部节点的路由函数: 神经网络学习如何将数据路由到合适的子节点。
  • 叶子节点的最终预测: 神经网络负责进行最终的预测。

ANTs 引入了一种基于反向传播的自适应架构生长算法。这意味着树的结构并非预先设定,而是能够根据数据的特性进行动态生长和调整。

这种融合模式带来的优势显而易见:

  1. 表示学习的深度渗透: 神经网络在边缘和路由函数中的应用,使得数据在树的层层传递中,其表示(representation)得以不断优化和深化。与传统决策树在原始特征空间进行划分不同,ANTs 在学习到的特征空间上进行划分,显著提升了模型的表达能力。
  2. 架构的自适应性: 这是 ANTs 的核心优势。传统的神经网络架构固定,需要人工设计和调参;决策树虽然结构自适应,但其“硬划分”的贪婪性质可能导致局部最优。ANTs 的生长算法结合了决策树的局部决策和神经网络的端到端优化,使得模型能够根据数据的规模和复杂性动态调整其深度和宽度,避免在小数据集上过度参数化,同时在大数据集上充分挖掘深层结构。
  3. 轻量级推理(条件计算): 类似于决策树,ANTs 在推理时仅激活从根节点到叶子节点路径上的少量参数。与需要激活所有参数的传统全连接神经网络相比,这在资源受限的场景下具有显著优势。

ANTs 的核心机制

模型组件

ANTs 的核心抽象是一个二元组 ( T , O ) (T, O) (T,O),其中 T T T 定义了模型的拓扑结构(一棵二叉树),而 O O O 则是一组作用于这棵树上的可微分操作。

  1. 拓扑结构 T = ( N , E ) T = (\mathcal{N}, \mathcal{E}) T=(N,E):

    • N \mathcal{N} N: 所有节点的集合,分为内部节点 N i n t \mathcal{N}_{int} Nint 和叶子节点 N l e a f \mathcal{N}_{leaf} Nleaf
    • E \mathcal{E} E: 边的集合。特别地,每条边上承载着对数据进行变换的“生产线”。
    • 每个内部节点 j ∈ N i n t j \in \mathcal{N}_{int} jNint 有两个子节点 l e f t ( j ) left(j) left(j) r i g h t ( j ) right(j) right(j)
  2. 核心操作 O = ( R , T , S ) O = (\mathcal{R}, \mathcal{T}, \mathcal{S}) O=(R,T,S): 这是 ANTs 最特别的设计,它突破了传统决策树的简化模式,将神经网络的能力注入到树的每一个关键环节。

    • 路由函数 r j θ ∈ R r_j^\theta \in \mathcal{R} rjθR: 每个内部节点 j ∈ N i n t j \in \mathcal{N}_{int} jNint 都配备一个路由器。图 Figure 1 中白色节点。

      • 功能: 接收来自父节点的特征表示 x j ∈ X j x_j \in \mathcal{X}_j xjXj,输出一个 [ 0 , 1 ] [0, 1] [0,1] 范围内的标量,表示样本流向左子节点的概率。
      • 参数: 由 θ \theta θ 参数化。
      • 决策方式: 采用随机路由(Stochastic Routing),即决策是根据伯努利分布 B e r n o u l l i ( r j θ ( x j ) ) Bernoulli(r_j^\theta(x_j)) Bernoulli(rjθ(xj)) 采样得出(1 去左,0 去右)。这保证了路由函数是可微分的,允许梯度流过。
      • 实现: 论文中提到可以是小型卷积神经网络(CNN)或多层感知机(MLP)。这与传统决策树中简单的轴对齐(axis-aligned)划分函数形成鲜明对比,使得路由决策本身也能学习到复杂的特征表示。
    • 变换函数 t ψ ∈ T t^\psi \in \mathcal{T} tψT: 树的每一条边 e ∈ E e \in \mathcal{E} eE 都带有一个或一组变换模块。图 Figure 1 中边上的黑色小点。

      • 功能: 对流经的特征表示进行非线性变换。例如,一个卷积层加 ReLU 激活函数。
      • 参数: 由 ψ \psi ψ 参数化。
      • 核心意义: 这是 ANTs 与传统决策树(如 SDTs)最显著的区别之一。传统决策树的边通常是恒等函数,数据在树中传递时其特征表示不变。而 ANTs 的边能够“加深”(deepen),学习到更丰富、更抽象的分层表示(Hierarchical Representations)。这意味着每一条从根到叶的路径,本身就是一条“深度神经网络流水线”。
    • 求解器 s l ϕ ∈ S s_l^\phi \in \mathcal{S} slϕS: 每个叶子节点 l ∈ N l e a f l \in \mathcal{N}_{leaf} lNleaf 配备一个求解器。图 Figure 1 中叶子节点。

      • 功能: 接收来自父节点的变换后的特征 x l ∈ X l x_l \in \mathcal{X}_l xlXl,并输出对目标变量 y y y 的预测分布 p ( y ∣ x ) p(y|x) p(yx)
      • 参数: 由 ϕ \phi ϕ 参数化。
      • 实现: 对于分类任务,可以是特征空间上的线性分类器。
        Fiture 1
        Figure 1

图 Figure 1 左图中红色阴影表示了数据 x x x 经过一系列路由函数,最终到求解器 s 4 ϕ s_4^\phi s4ϕ 的路径。

前向预测

ANTs 将条件分布 p ( y ∣ x ) p(y|x) p(yx) 建模为一个分层混合专家模型(Hierarchical Mixture of Experts, HMEs),每个“专家”对应一条从根到叶的路径。模型的总参数集为 Θ = ( θ , ψ , ϕ ) \Theta = (\theta, \psi, \phi) Θ=(θ,ψ,ϕ)

给定输入 x x x,预测分布为:
p ( y ∣ x , Θ ) = ∑ l = 1 L π l θ , ψ ( x ) p l ϕ , ψ ( y ) p ( y ∣ x , Θ ) = ∑ l = 1 L p ( z l = 1 ∣ x , θ , ψ ) ⏟ Leaf-assignment prob.  π l θ , ψ p ( y ∣ x , z l = 1 , ϕ , ψ ) ⏟ Leaf-specific prediction.  p l ϕ , ψ ( 1 ) p(y|x, \Theta) = \sum_{l=1}^{L} \pi_l^{\theta,\psi}(x) p_l^{\phi,\psi}(y)\\ \begin{aligned} &p(\mathbf{y}|\mathbf{x},\Theta)=\sum_{l=1}^L\underbrace{p(z_l=1|\mathbf{x},\boldsymbol{\theta},\boldsymbol{\psi})}_{\text{Leaf-assignment prob. }\pi_l^{\boldsymbol{\theta},\boldsymbol{\psi}}}\underbrace{p(\mathbf{y}|\mathbf{x},z_l=1,\boldsymbol{\phi},\boldsymbol{\psi})}_{\text{Leaf-specific prediction. }p_l^{\boldsymbol{\phi},\boldsymbol{\psi}}} \quad (1) \end{aligned} p(yx,Θ)=l=1Lπlθ,ψ(x)plϕ,ψ(y)p(yx,Θ)=l=1LLeaf-assignment prob. πlθ,ψ p(zl=1∣x,θ,ψ)Leaf-specific prediction. plϕ,ψ p(yx,zl=1,ϕ,ψ)(1)

其中:

  • L L L 是叶子节点的总数, z = { 0 , 1 } L \mathbf z =\{0,1\}^L z={0,1}L L L L 维的 onehot 向量, z l = 1 z_l=1 zl=1 表示使用 z l z_l zl 为叶节点。
  • π l θ , ψ ( x ) : = p ( z l = 1 ∣ x , ψ , θ ) \pi_l^{\theta,\psi}(x) := p(z_l=1|x, \psi, \theta) πlθ,ψ(x):=p(zl=1∣x,ψ,θ) 是输入 x x x 被分配到叶子节点 l l l路径概率,由从根到叶 l l l 的唯一路径 P l \mathcal{P}_l Pl 上所有路由器的决策概率的乘积给出。
    π l ψ , θ ( x ) = ∏ r j θ ∈ P l r j θ ( x j ψ ) I [ l is left child of  j ] ⋅ ( 1 − r j θ ( x j ψ ) ) 1 − I [ l is left child of  j ] \pi_l^{\psi,\theta}(x) = \prod_{r_j^{\theta} \in \mathcal{P}_l} r_j^{\theta}(x_j^{\psi})^{ \mathbb{I}[l \text{ is left child of } j]} \cdot (1-r_j^{\theta}(x_j^{\psi}))^{1 - \mathbb{I}[l \text{ is left child of } j]} πlψ,θ(x)=rjθPlrjθ(xjψ)I[l is left child of j](1rjθ(xjψ))1I[l is left child of j]
    这里的 x j ψ x_j^{\psi} xjψ 是输入 x x x 经过从根到节点 j j j 的所有变换函数组合后得到的特征表示。如果从根到节点 j j j 的路径上的变换函数序列是 t e 1 ψ , t e 2 ψ , … , t e n ψ t_{e_1}^\psi, t_{e_2}^\psi, \dots, t_{e_n}^\psi te1ψ,te2ψ,,tenψ,那么:
    x j ψ : = ( t e n ψ ∘ ⋯ ∘ t e 2 ψ ∘ t e 1 ψ ) ( x ) x_j^{\psi} := (t_{e_n}^{\psi} \circ \dots \circ t_{e_2}^{\psi} \circ t_{e_1}^{\psi})(x) xjψ:=(tenψte2ψte1ψ)(x)
    ∘ \circ 是函数的复合运算。
  • p l ϕ , ψ ( y ) : = p ( y ∣ x , z l = 1 , ϕ , ψ ) p_l^{\phi,\psi}(y) := p(y|x, z_l=1, \phi, \psi) plϕ,ψ(y):=p(yx,zl=1,ϕ,ψ) 是叶子节点 l l l局部预测,由其求解器 s l ϕ s_l^\phi slϕ 在变换后的输入特征 x p a r e n t ( l ) ψ x_{parent(l)}^\psi xparent(l)ψ (或 x l ψ x_l^\psi xlψ)上计算得出。

推断策略:

  • 多路径推断(Multi-path inference): 使用公式 (1) 计算所有叶子节点的加权平均预测。计算成本较高,因为它需要遍历树的所有分支。
  • 单路径推断(Single-path inference): 只根据路由器最高置信度的路径(贪婪遍历)选择一条从根到叶的路径进行计算和预测,只激活模型参数的一个子集。实验证明,由于路由器置信度通常接近 0 或 1,单路径推断能很好地近似多路径推断。

训练与优化

ANTs 的训练分为两个阶段,这体现了模型对架构自适应性的追求。

  1. 生长阶段(Growth phase): 学习模型架构 T T T

    • 初始化: 从一个简单的根节点开始。
    • 迭代过程: 采用广度优先搜索(BFS),对当前所有叶子节点逐一进行评估。
    • 三种生长选项: 对于每个叶子节点,模型评估三种可能的局部架构修改,如 Figure 1 右图所示:
      • (1) “Split data”(分裂数据): 添加一个新的路由器和两个新的叶子节点(左右子节点)。新分支上的变换函数初始化为恒等函数。
      • (2) “Deepen transform”(深化变换): 在当前叶子节点对应的传入边上添加一个新的变换模块,并替换旧的求解器为一个新的求解器。
      • (3) “Keep”(保持): 不对当前节点进行任何修改。
    • 局部优化: 对于选项 (1) 和 (2) 产生的新的模块,仅对其参数进行局部优化(通过最小化验证集上的 NLL)。固定已有模块的参数,减少计算量。
    • 选择标准: 选择验证集 NLL 表现最好的选项。如果性能提升,则接受修改并继续生长;否则,执行 “Keep” 选项。
    • 终止条件: 直到没有更多的“分裂数据”或“深化变换”操作能通过验证测试。

    生长阶段是 ANTs 的核心。它赋予了模型在“变得更深”或“变得更宽”(划分数据)之间进行选择的自由。局部优化虽然可能导致次优决策,但效率高,尤其适用于大型模型,并可被后续精炼阶段修正。这可以看作是一种受约束的神经架构搜索(NAS)过程,只不过搜索空间被限定在树形结构上,且搜索是增量的。

  2. 精炼阶段(Refinement phase): 调优全局参数 O O O

    • 目标: 一旦树的拓扑结构 T T T 在生长阶段确定,进入精炼阶段。
    • 优化方式: 对整个 ANT 模型的所有参数 ( θ , ψ , ϕ ) (\theta, \psi, \phi) (θ,ψ,ϕ) 进行全局优化。同样使用 NLL (负对数似然) 作为目标函数,通过端到端的反向传播和梯度下降进行。
    • 意义: 修正生长阶段中由于局部优化可能导致的次优参数。实验表明,精炼阶段能显著改善模型的泛化误差,甚至能“剪枝”掉一些冗余或不必要的路径,使路由器决策更加集中。

    损失函数 (NLL):
    − log ⁡ p ( Y ∣ X , Θ ) = − ∑ n = 1 N log ⁡ ( ∑ l = 1 L π l θ , ψ ( x ( n ) ) p l ϕ , ψ ( y ( n ) ) ) -\log p(\mathbf{Y}|\mathbf{X},\Theta)=-\sum_{n=1}^N\log\:(\sum_{l=1}^L\pi_l^{\boldsymbol{\theta},\boldsymbol{\psi}}(\mathbf{x}^{(n)})\:p_l^{\boldsymbol{\phi},\boldsymbol{\psi}}(\mathbf{y}^{(n)})) logp(YX,Θ)=n=1Nlog(l=1Lπlθ,ψ(x(n))plϕ,ψ(y(n)))
    由于所有组件(路由器、变换器、求解器)都是可微分的,因此可以使用标准的基于梯度的优化算法。

通过这两阶段的优化,ANTs 不仅能找到适应数据的树形结构,还能精细地调整结构内各个神经网络组件的参数,从而在表示学习和架构学习之间实现协同。这种“结构生成”与“参数优化”的解耦再耦合,是其区别于一般混合模型的关键。

实验测评

论文在 SARCOS(多元回归)、MNIST 和 CIFAR-10(图像分类)这三个不同类型的数据集上进行了实验。核心结论清晰而有力:

  • 竞争力:ANTs 在 SARCOS 数据集上实现了最低的均方误差(MSE),即便与最先进的基于树的模型(如梯度提升树 GBTs)和各种 MLP 相比,也展现出领先地位。在图像分类任务上,ANTs 显著优于传统随机森林(RFs)和梯度提升树(GBTs),并且与一些轻量级、非残差连接的 CNN 模型性能相当,甚至更优。

  • 效率与权衡

    • 单路径推理:一个关键的发现,ANTs 的单路径推理(仅激活从根到叶的一条路径)与多路径推理(聚合所有叶子节点的预测)在准确性上差异极小(分类误差通常小于 0.1%),但在计算开销(FLOPS)和激活参数量上则大幅降低。这得益于路由器学习到的高置信度拆分概率(即 r j θ ( x j ) r_j^\theta(x_j) rjθ(xj) 趋近于 0 或 1),使得模型在推断时能果断地“选择”一条路径。
    • 参数效率:在某些配置下,ANTs 甚至能以更少的参数量达到甚至超越 LeNet-5 等传统 CNN 模型在 MNIST 上的性能。这表明树状的层级共享和分离机制,能够有效地增强计算和预测性能。
  • 消融实验

    • “无路由器”(no R):此时 ANTs 退化为某种形式的自适应生长的纯神经网络。在所有数据集上,其性能均显著低于完整的 ANTs。
    • “无变换器”(no T):此时 ANTs 退化为一种带有可学习路由器的软决策树(SDT/HME)。其性能下降更为剧烈,特别是在图像数据集上,误差大幅飙升。

总结

ANTs 不仅仅是一个性能优秀的模型,更重要的是,它提供了一种看待深度学习和决策树的新视角,并引出了许多值得深思的问题。

  1. 可解释的特征分离:论文中提及,ANTs 能够学习到“有意义的层级划分”,例如将图像分为“自然物体”和“人造物体”等。这为“黑箱”的神经网络提供了一扇窥探内部决策逻辑的窗户。树的结构本身就具有一定的可解释性,而学习到的路由函数进一步增强了这种可解释性。这对于许多对模型透明度有要求的领域(如医疗、金融)具有重要意义。
  2. 架构自适应性:奥卡姆剃刀的实践:ANTs 的生长机制使其能够根据训练数据的大小和复杂性自适应地构建模型架构。这意味着对于小数据集,它不会过度生长导致过拟合;对于大数据集,它能够探索更深、更复杂的结构。这本质上是在实践机器学习的奥卡姆剃刀原理:用最简单的模型解释数据。
  3. “软”划分的胜利:传统决策树训练难点在于“硬划分”导致的损失函数不可微。ANTs 通过将路由器输出解释为伯努利分布的概率,并使用混合专家模型(HMEs)的框架,巧妙地避开了这一难题,使得整个树结构都可微,从而能够进行端到端的梯度下降优化。这为传统决策树的扩展开辟了新的道路。

局限与展望

  • 贪婪生长与全局最优:虽然生长阶段比预设架构更灵活,但其本质仍是局部贪婪搜索。每次只在当前叶子节点进行局部最优决策。这可能导致模型陷入局部最优,无法发现全局上更优异的架构。未来的工作可以探索更全局的架构搜索策略,例如基于强化学习或进化算法的树结构搜索,或者像决策森林那样,训练多个 ANTs 进行集成。
  • 计算成本:生长阶段的局部优化虽然效率相对高,但对于非常大的数据集和复杂的模块,每次评估三个选项并进行局部训练仍然是计算密集型的。如何在保持自适应性的同时,进一步提高架构搜索的效率,仍是挑战。
  • 模块的通用性:论文中使用的基础模块(如卷积层、MLP)是通用的。未来是否可以设计更适合树状结构、更轻量、更具表达力的神经模块,以进一步提升效率和性能?
  • 可解释性与复杂性的平衡:虽然 ANTs 比纯粹的 NNs 更具解释性,但随着树的深度和复杂度的增加,特别是每个节点和边都包含深层 NN 时,完全理解特定输入在树中的决策路径和特征转换仍可能面临挑战。如何在增加模型能力的同时,维持甚至增强其可解释性,是一个持续的研究方向。

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

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

相关文章

InitVerse节点部署教程

项目介绍: InitVerse 是一个为新兴企业量身定制的自动化 Web3 SaaS 平台,只需单击几下即可快速开发和部署 DApp。在 INIChain 和 INICloud 的支持下,InitVerse 可以根据需求动态调整计算资源,实现高效的任务处理,同时提供更高的安全性、可用性和可扩展性。 系统要求: C…

阿里开源通义万相 Wan2.1-VACE,开启视频创作新时代

0.前言 阿里巴巴于2025年5月14日正式开源了其最新的AI视频生成与编辑模型——通义万相Wan2.1-VACE。这一模型是业界功能最全面的视频生成与编辑工具,能够同时支持多种视频生成和编辑任务,包括文生视频、图像参考视频生成、视频重绘、局部编辑、背景延展…

解决“VMware另一个程序已锁定文件的一部分,进程无法访问“

问题描述 打开VMware里的虚拟机时,弹出"另一个程序已锁定文件的一部分,进程无法访问"如图所示: 这是VM虚拟机的保护机制。虚拟机运行时,为防止数据被篡改,会将所运行的文件保护起来。当虚拟机崩溃或者强制…

基于大数据的租房信息可视化系统的设计与实现【源码+文档+部署】

课题名称 基于大数据的租房信息可视化系统的设计与实现 学 院 专 业 计算机科学与技术 学生姓名 指导教师 一、课题来源及意义 租房市场一直是社会关注的热点问题。随着城市化进程的加速,大量人口涌入城市,导致租房需求激增。传统的租…

Vue3封装公共图片组件

对图片加载做的处理: 图片加载状态响应式管理图片访问错误的处理机制图片懒加载可通过slot支持自定义加载动画其他监听事件的处理及向上传递 …<!-- components/CustomImage.vue --> <template><div class="custom-image-wrapper"><!-- 主图 -…

车道线检测----CLRKDNet

今天的最后一篇 车道线检测系列结束 CLRKDNet&#xff1a;通过知识蒸馏加速车道检测 摘要&#xff1a;道路车道是智能车辆视觉感知系统的重要组成部分&#xff0c;在安全导航中发挥着关键作用。在车道检测任务中&#xff0c;平衡精度与实时性能至关重要&#xff0c;但现有方法…

Python-感知机以及实现感知机

感知机定义 如果有一个算法&#xff0c;具有1个或者多个入参&#xff0c;但是返回值要么是0&#xff0c;要么是1&#xff0c;那么这个算法就叫做感知机&#xff0c;也就是说&#xff0c;感知机是个算法 感知机有什么用 感知机是用来表示可能性的大小的&#xff0c;我们可以认…

STM32 ADC+DMA+TIM触发采样实战:避坑指南与源码解析

知识点1【TRGO的介绍】 1、TRGO的概述 TRGO&#xff1a;Trigger Output&#xff08;触发输出&#xff09;&#xff0c;是定时器的一种功能。 它可以作为外设的启动信号&#xff0c;比如ADC转换&#xff0c;DAC输出&#xff0c;DMA请求等。 对于ADC来说&#xff0c;可以通过…

Qwen3技术报告解读

https://github.com/QwenLM/Qwen3/blob/main/Qwen3_Technical_Report.pdf 节前放模型&#xff0c;大晚上的发技术报告。通义&#xff0c;真有你的~ 文章目录 预训练后训练Long-CoT Cold StartReasoning RLThinking Mode FusionGeneral RLStrong-to-Weak Distillation 模型结构…

【网络编程】十、详解 UDP 协议

文章目录 Ⅰ. 传输层概述1、进程之间的通信2、再谈端口号端口号的引出五元组标识一个通信端口号范围划分常见的知名端口号查看知名端口号协议号 VS 端口号 3、两个问题一个端口号是否可以被多个进程绑定&#xff1f;一个进程是否可以绑定多个端口号&#xff1f; 4、部分常见指令…

实现RTSP低延迟播放器,挑战与解决方案

随着低延迟直播需求的快速增长&#xff0c;RTSP&#xff08;Real-Time Streaming Protocol&#xff09;播放器逐渐成为实时视频流传输中的核心技术之一。与WebRTC&#xff08;Web Real-Time Communication&#xff09;相比&#xff0c;RTSP在实时性和网络延迟方面面临诸多挑战&…

【springcloud学习(dalston.sr1)】Eureka单个服务端的搭建(含源代码)(三)

该系列项目整体介绍及源代码请参照前面写的一篇文章【springcloud学习(dalston.sr1)】项目整体介绍&#xff08;含源代码&#xff09;&#xff08;一&#xff09; springcloud学习&#xff08;dalston.sr1&#xff09;系统文章汇总如下&#xff1a; 【springcloud学习(dalston…

GPU与NPU异构计算任务划分算法研究:基于强化学习的Transformer负载均衡实践

点击 “AladdinEdu&#xff0c;同学们用得起的【H卡】算力平台”&#xff0c;H卡级别算力&#xff0c;按量计费&#xff0c;灵活弹性&#xff0c;顶级配置&#xff0c;学生专属优惠。 引言 在边缘计算与AI推理场景中&#xff0c;GPU-NPU异构计算架构已成为突破算力瓶颈的关键技…

探索C语言中的二叉树:原理、实现与应用

一、引言 二叉树作为一种重要的数据结构&#xff0c;在计算机科学领域有着广泛的应用&#xff0c;无论是在操作系统的文件系统管理&#xff0c;还是在数据库的索引构建中&#xff0c;都能看到它的身影。在C语言中&#xff0c;我们可以利用指针灵活地构建和操作二叉树。接下来&…

使用libUSB-win32的简单读写例程参考

USB上位机程序的编写&#xff0c;函数的调用过程. 调用 void usb_init(void); 进行初始化 调用usb_find_busses、usb_find_devices和usb_get_busses这三个函数&#xff0c;获得已找到的USB总线序列&#xff1b;然后通过链表遍历所有的USB设备&#xff0c;根据已知的要打开USB设…

vue注册用户使用v-model实现数据双向绑定

定义数据模型 Login.vue //定义数据模型 const registerData ref({username: ,password: ,confirmPassword: })使用 v-model 实现数据模型的key与注册表单中的元素之间的双向绑定 <!-- 注册表单 --><el-form ref"form" size"large" autocompl…

【Arthas实战】常见使用场景与命令分享

简介: Arthas是一款Java诊断工具&#xff0c;适用于多种场景&#xff0c;如接口响应变慢、CPU占用过高、热更新需求等。其核心命令包括实时监控面板&#xff08;dashboard&#xff09;、线程状态查看&#xff08;thread&#xff09;、方法调用链路追踪&#xff08;trace&#x…

Jenkins 最佳实践

1. 在Jenkins中避免调度过载 过载Jenkins以同时运行多个作业可能导致资源竞争、构建速度变慢和系统性能问题。分配作业启动时间可以防止瓶颈&#xff0c;并确保更顺畅的执行。如何实现&#xff1f; 在Cron表达式中使用H&#xff1a;引入抖动&#xff08;jitter&#xff09;&a…

pytest框架 - 第二集 allure报告

一、断言assert 二、Pytest 结合 allure-pytest 插件生成美观的 Allure 报告 (1) 安装 allure 环境 安装 allure-pytest 插件&#xff1a;pip install allure-pytest在 github 下载 allure 报告文件 地址&#xff1a;Releases allure-framework/allure2 GitHub下载&#x…

人工智能时代:解锁职业新身份,从“认证师”到“工程师”的进阶之路

在人工智能技术浪潮席卷全球的今天,技术的飞速迭代正在重塑职业版图。从算法优化到伦理决策,从系统测试到应用开发,AI技术不再只是程序员的专属领域,而是成为各行各业从业者必须掌握的“生存技能”。当企业争相布局AI赛道,个人如何在这场变革中抢占先机?答案或许藏在两个…