[Machine Learning] 领域适应和迁移学习

文章目录

  • 领域适应
    • 核均值匹配 (Kernel Mean Matching, KMM)
  • 迁移学习
    • 协变量偏移模型 (Covariate Shift Model)
    • 目标偏移模型 (Target Shift Model)


在机器学习中,我们的目标是找到一个假设或模型,它可以很好地描述或预测数据。当我们基于训练集训练模型时,我们的目的是让模型能够捕获到数据中的主要模式。然而,为了确保模型不仅仅是对训练数据进行记忆,而是真正理解了数据的结构,我们需要在测试集上评估它。

为什么我们认为一个在训练集上表现良好的模型也应该在测试集上表现良好呢?这是基于一个核心假设:训练数据和测试数据都是从相同的分布中抽取的。因此,如果模型可以很好地理解和拟合训练数据中的模式,那么它也应该能够很好地处理测试数据。

当我们谈论过拟合时,我们关心的是模型是否能从一个样本(训练数据)泛化到整个总体或其他样本(如测试数据)。过拟合发生在模型过于复杂时,以至于它开始“记住”训练数据中的特定噪声和异常,而不是只捕获真实的、普遍的数据模式。

为了提高学习的效率和性能,有时我们需要从一个领域转移到另一个领域,这就涉及到领域适应 (Domain Adaptation) 和迁移学习 (Transfer Learning)。

领域适应的目标是减少源领域和目标领域数据之间的分布差异。例如,我们可能有一个在英国的图像数据集(源领域),我们希望将学到的模型应用于美国的图像数据集(目标领域)。尽管两个数据集在内容上有很多相似之处,但也可能存在一些微妙的差异,例如光线、风格等。领域适应的目标就是减少这些差异的影响。常见的策略包括:

  • 特征级适应: 调整或转换特征,使得源领域和目标领域的特征分布更接近。
  • 模型级适应: 通过正则化、再加权等策略调整在源领域上训练的模型,使其在目标领域上表现更好。

迁移学习则更加广泛,它涉及从一个或多个源领域提取知识,并将这些知识应用于一个不同的目标领域。与领域适应不同,迁移学习的焦点不仅仅在于源和目标的数据分布不同,还可能涉及完全不同的任务。例如,我们可能从图片分类任务中学习的知识(如边缘检测、纹理识别等)来帮助视频物体检测任务。常见的迁移学习策略包括:

  • 预训练与微调: 先在源任务上预训练一个模型,然后在目标任务上进行微调。
  • 知识蒸馏: 将一个大的、在源任务上训练得很好的模型的知识转移到一个小的模型上。
  • 多任务学习: 在多个相关任务上同时训练模型,使其可以共享知识。

总的来说,领域适应更偏向于理论,而迁移学习更偏向于实践,但两者都是为了提高模型在新的、未见过的数据上的性能。

期望风险 (Expected risk) 与经验风险 (Empirical risk) 是评估学习算法性能的两种核心指标。期望风险衡量的是算法在所有可能的数据上的平均性能,而经验风险则是算法在训练集上的性能。

期望风险 R ( h ) = E [ R S ( h ) ] = E [ ℓ ( X , Y , h ) ] R(h) = \mathbb{E}[R_S(h)] = \mathbb{E}[\ell (X, Y, h)] R(h)=E[RS(h)]=E[(X,Y,h)] 描述了假设 h h h 对所有可能的数据点 ( X , Y ) (X, Y) (X,Y) 的平均损失。理想情况下,我们希望找到一个假设 h h h,使期望风险最小。

经验风险 R S ( h ) = 1 n ∑ i = 1 n ℓ ( X i , Y i , h ) R_S(h) = \frac{1}{n} \sum\limits_{i=1}^{n} \ell (X_i, Y_i, h) RS(h)=n1i=1n(Xi,Yi,h) 描述了假设 h h h 在训练集上的平均损失。在实际应用中,由于我们无法获取所有可能的数据点,所以我们通常用经验风险作为期望风险的近似,并尝试最小化它。

c = arg min ⁡ h R ( h ) c = \argmin\limits_{h} R(h) c=hargminR(h) 描述了全局最优的函数,这是在所有可能的函数中期望风险最小的函数。

h ∗ = arg min ⁡ h ∈ H R ( h ) h^* = \argmin\limits_{h \in H} R(h) h=hHargminR(h) 描述了在假设类 H H H 中的最优假设,这是该类中期望风险最小的函数。

h S = arg min ⁡ h ∈ H R S ( h ) h_S = \argmin\limits_{h \in H} R_S(h) hS=hHargminRS(h) 描述了我们实际从数据中学习到的假设,这是假设类 H H H 中经验风险最小的函数。

在源领域中,我们有大量的标记数据,而在目标领域中,我们可能只有少量的标记数据或没有标记数据。

  • 源领域数据: { ( x 1 S , y 1 S ) , . . . , ( x n S S , y n S S ) } \{ (x^S_1, y^S_1), ..., (x^S_{n_S}, y^S_{n_S})\} {(x1S,y1S),...,(xnSS,ynSS)}
  • 目标领域数据: 可能是 { ( x 1 T , y 1 T ) , . . . , ( x n T T , y n T T ) } \{ (x^T_1, y^T_1), ..., (x^T_{n_T}, y^T_{n_T})\} {(x1T,y1T),...,(xnTT,ynTT)} 或只是 { x 1 T , . . . , x n T T } \{ x^T_1, ..., x^T_{n_T}\} {x1T,...,xnTT}

由于目标领域的数据量较小,并且可能没有监督标签,所以我们的约束是 n S ≫ n T n^S \gg n^T nSnT

为了从源领域中提取知识,我们需要确定不同领域之间 p ( X , Y ) p(X,Y) p(X,Y) 的变化方式。这种变化可以用权重 β ( X , Y ) = p t ( X , Y ) p s ( X , Y ) \beta (X,Y) = \frac{p_t(X,Y)}{p_s(X,Y)} β(X,Y)=ps(X,Y)pt(X,Y) 来表示。

首先,回顾我们的目标是估算目标领域的期望风险 R T ( h ) R^T(h) RT(h)。公式如下:

R T ( h ) = E ( X , Y ) ∼ p t ( X , Y ) [ ℓ ( X , Y , h ) ] R^T(h) = \mathbb{E}_{(X,Y) \sim p_t(X,Y)}[\ell(X,Y,h)] RT(h)=E(X,Y)pt(X,Y)[(X,Y,h)]

  • R T ( h ) R^T(h) RT(h):这表示的是在目标领域下,由假设 h h h 产生的期望风险或错误。
  • ℓ ( X , Y , h ) \ell(X,Y,h) (X,Y,h):这是损失函数,它衡量了在给定数据点 ( X , Y ) (X,Y) (X,Y) 和假设 h h h 下的预测错误。

这实际上是一个关于目标领域分布 p t ( X , Y ) p_t(X,Y) pt(X,Y) 的期望。但是,我们没有足够的目标领域数据来直接计算这个期望。所以我们转向源领域,并引入了权重 β ( X , Y ) \beta(X,Y) β(X,Y),该权重捕获了从源领域到目标领域的分布变化。然后我们重写期望为:

R T ( h ) = E ( X , Y ) ∼ p t ( X , Y ) [ ℓ ( X , Y , h ) ] = ∫ X , Y ℓ ( X , Y , h ) p t ( X , Y ) d X d Y = E ( X , Y ) ∼ p s ( X , Y ) [ p t ( X , Y ) p s ( X , Y ) ℓ ( X , Y , h ) ] = E ( X , Y ) ∼ p s ( X , Y ) [ β ( X , Y ) ℓ ( X , Y , h ) ] \begin{align*} R^T(h) &= \mathbb{E}_{(X,Y) \sim p_t(X,Y)}[\ell(X,Y,h)] \\ &= \int_{X,Y} \ell(X,Y,h) p_t (X,Y) dXdY \\ &= \mathbb{E}_{(X,Y) \sim p_s(X,Y)}[\frac{p_t(X,Y)}{p_s(X,Y)}\ell(X,Y,h)] \\ &= \mathbb{E}_{(X,Y) \sim p_s(X,Y)}[\beta (X,Y) \ell(X,Y,h)] \end{align*} RT(h)=E(X,Y)pt(X,Y)[(X,Y,h)]=X,Y(X,Y,h)pt(X,Y)dXdY=E(X,Y)ps(X,Y)[ps(X,Y)pt(X,Y)(X,Y,h)]=E(X,Y)ps(X,Y)[β(X,Y)(X,Y,h)]

现在这是一个关于源领域分布 p s ( X , Y ) p_s(X,Y) ps(X,Y) 的期望,这意味着我们可以使用源领域的数据来估算它。所以,如果我们有一个源领域的样本,我们可以用样本平均近似上面的期望:

R T ( h ) ≈ 1 n S ∑ i = 1 n S β ( x i S , y i S ) ℓ ( x i S , y i S , h ) R^T(h) \approx \frac{1}{n_S}\sum\limits_{i=1}^{n_S} \beta (x^S_i, y^S_i) \ell (x^S_i, y^S_i,h) RT(h)nS1i=1nSβ(xiS,yiS)(xiS,yiS,h)

当我们有无限多的样本数据时,样本平均会收敛到真实的期望。这是大数定律的一个结果。具体地说,如果我们有一个随机变量的无限多的独立同分布样本,那么这些样本的平均值将收敛到这个随机变量的期望。

领域适应

当源领域和目标领域的数据分布不同,机器学习模型可能会在目标领域上表现得不太理想。因此,领域适应的目的就是减少这两个分布之间的差异。

核均值匹配 (Kernel Mean Matching, KMM)

简单来说,KMM 的核心思想是:为源数据中的每个样本赋予权重,使得加权后的源数据在特征空间中的均值与目标数据的均值尽可能接近。这样,当我们从源领域训练的模型在目标领域进行预测时,性能会更好。

KMM 方法主要基于一个简单的观察:如果两个分布的期望值相同,那么这两个分布也是相似的。

考虑一个映射函数 ϕ : X → H \phi: X \rightarrow \mathcal{H} ϕ:XH,其中 H \mathcal{H} H 是一个带有核函数 K ( x 1 , x 2 ) = ⟨ ϕ ( x 1 ) , ϕ ( x 2 ) ⟩ K(x_1, x_2) = \langle \phi(x_1), \phi(x_2) \rangle K(x1,x2)=ϕ(x1),ϕ(x2)⟩ 的再生核希尔伯特空间 (Reproducing Kernel Hilbert Space)。这里, ⟨ ⋅ , ⋅ ⟩ \langle \cdot, \cdot \rangle , 是内积运算。

在特征空间中,我们定义了一个“均值映射” μ ( p ( X ) ) \mu(p(X)) μ(p(X)),它实际上是对分布 p ( X ) p(X) p(X) 在特征空间中的均值的表示。这使得我们可以在这个空间中比较两个分布的均值。

μ ( p ( X ) ) = E X ∼ p ( X ) [ ϕ ( X ) ] \mu(p(X)) = \mathbb{E}_{X \sim p(X)}[\phi(X)] μ(p(X))=EXp(X)[ϕ(X)]

K K K 是一个通用核时, μ \mu μ 是一个双射函数,这意味着它可以在其范围和域之间建立一一对应的关系。

KMM的目标是找到一个权重系列 β ( X ) \beta(X) β(X),使得加权的源领域分布的均值接近于目标领域分布的均值。数学上,这可以表述为 μ ( β ( X ) p S ( X ) ) = μ ( p T ( X ) ) \mu(\beta (X) p_S(X)) = \mu(p_T(X)) μ(β(X)pS(X))=μ(pT(X))

我们的目标是最小化源领域的加权均值与目标领域均值之间的差异。为了确保权重的有效性,我们还加了两个约束条件:权重必须为正,并且它们的平均值为1。

min ⁡ β ∥ μ ( p T ( X ) ) − E X ∼ p S ( X ) [ β ( X ) ϕ ( X ) ] ∥ 2 \min\limits_\beta \|\mu(p_T(X)) - \mathbb{E}_{X \sim p_S(X)}[\beta(X) \phi(X)]\|^2 βminμ(pT(X))EXpS(X)[β(X)ϕ(X)]2

受到约束 β ( X ) ≥ 0 \beta(X) \geq 0 β(X)0 E X ∼ p S ( X ) [ β ( X ) ] = 1 \mathbb{E}_{X \sim p_S(X)}[\beta(X)] = 1 EXpS(X)[β(X)]=1

在实际应用中,我们通常只有有限的源领域和目标领域的样本。因此,我们不能直接计算期望,而是使用经验均值来近似它们。

给定源领域的样本 { x 1 S , . . . , x n S S } ∼ p S ( X ) n S \{ x^S_1, ..., x^S_{n_S}\} \sim p_S(X)^{n_S} {x1S,...,xnSS}pS(X)nS 和目标领域的样本 { x 1 T , . . . , x n T T } ∼ p T ( X ) n T \{ x^T_1, ..., x^T_{n_T}\} \sim p_T(X)^{n_T} {x1T,...,xnTT}pT(X)nT,我们的优化问题变为:

min ⁡ β ∥ 1 n T ∑ i = 1 n T ϕ ( x i T ) − 1 n S ∑ i = 1 n S β ( x i S ) ϕ ( x i S ) ∥ 2 \min\limits_\beta \left\| \frac{1}{n_T} \sum\limits_{i=1}^{n_T} \phi(x_i^T) - \frac{1}{n_S} \sum\limits_{i=1}^{n_S} \beta(x_i^S) \phi(x_i^S) \right\|^2 βmin nT1i=1nTϕ(xiT)nS1i=1nSβ(xiS)ϕ(xiS) 2

受到约束 β ( x i S ) ≥ 0 \beta(x_i^S) \geq 0 β(xiS)0 1 n S ∑ i = 1 n S β ( x i S ) = 1 \frac{1}{n_S} \sum\limits_{i=1}^{n_S} \beta(x_i^S) = 1 nS1i=1nSβ(xiS)=1

迁移学习

无论是协变量偏移还是目标偏移,核心的思想都是找到一个权重 β \beta β,使得源域的分布能够被调整为与目标域更为接近。

协变量偏移模型 (Covariate Shift Model)

在协变量偏移的假设下,我们假设源和目标领域之间的特征分布 p ( X ) p(X) p(X) 有所不同,但条件分布 p ( Y ∣ X ) p(Y|X) p(YX) 保持不变,即 p t ( Y ∣ X ) = p s ( Y ∣ X ) p_t(Y|X) = p_s(Y|X) pt(YX)=ps(YX),但 X X X 的边缘分布在两个域中是不同的,即 p s ( Y ∣ X ) ≠ p t ( Y ∣ X ) p_s(Y|X) \neq p_t(Y|X) ps(YX)=pt(YX)

换句话说,尽管数据的来源可能不同,但在给定输入时输出的行为或关系是一致的。在这种情况下,我们关心的是如何调整源数据分布,使其与目标数据分布更为接近,以便在目标域上得到更好的性能。我们的目标是找到一个权重 β ( X ) \beta(X) β(X),这个权重会告诉我们在源域中哪些样本更有可能出现在目标域中。

β ( X , Y ) = p t ( X , Y ) p s ( X , Y ) = p t ( Y ∣ X ) p t ( X ) p s ( Y ∣ X ) p s ( X ) = p t ( X ) p s ( X ) = β ( X ) \beta (X,Y) = \frac{p_t(X,Y)}{p_s(X,Y)} = \frac{p_t(Y|X)p_t(X)}{p_s(Y|X)p_s(X)} = \frac{p_t(X)}{p_s(X)} = \beta(X) β(X,Y)=ps(X,Y)pt(X,Y)=ps(YX)ps(X)pt(YX)pt(X)=ps(X)pt(X)=β(X)

这表示数据的概率变化是与 Y Y Y独立的,仅依赖于 X X X

对于这种情况,我们使用 KMM 来找到每个源域样本的权重,以使源域的 X X X 的边缘分布与目标域的更接近。

min ⁡ β ∥ 1 n T ∑ i = 1 n T ϕ ( x i T ) − 1 n S ∑ i = 1 n S β ( x i S ) ϕ ( x i S ) ∥ 2 \min_\beta \| \frac{1}{n_T} \sum_{i=1}^{n_T} \phi(x^T_i) - \frac{1}{n_S} \sum_{i=1}^{n_S} \beta(x^S_i) \phi(x^S_i) \|^2 βminnT1i=1nTϕ(xiT)nS1i=1nSβ(xiS)ϕ(xiS)2

约束条件为 β ( x i S ) ≥ 0 \beta(x^S_i) \geq 0 β(xiS)0 1 n S ∑ i = 1 n S β ( x i S ) = 1 \frac{1}{n_S} \sum_{i=1}^{n_S} \beta(x^S_i) = 1 nS1i=1nSβ(xiS)=1

注意,尽管 β ( X ) \beta(X) β(X)可以通过 KMM 方法学习,但如果目标域没有任何标签,那么学习 β ( X ) \beta(X) β(X)会变得困难。

目标偏移模型 (Target Shift Model)

在目标偏移的假设下,我们假设源和目标之间的输出分布 p ( Y ) p(Y) p(Y) 不同,但条件分布 p ( X ∣ Y ) p(X|Y) p(XY) 保持不变。

换句话说,不同的环境或条件可能会导致输出分布的变化,尽管输入-输出的关系仍然保持不变。在这种情况下,我们的目标是匹配源域和目标域的边缘分布 p ( X ) p(X) p(X),但这需要通过考虑到输出的分布变化 β ( Y ) \beta(Y) β(Y) 来实现。我们的目标是找到一个权重 β ( Y ) \beta(Y) β(Y),使得考虑了该权重后的源域的 p ( X ) p(X) p(X) 与目标域的 p ( X ) p(X) p(X) 更为接近。

对于这种情况,我们要使用 KMM 来调整源域的 Y Y Y 的边缘分布,使其更接近目标域。

我们知道 p t ( Y ) = β ( Y ) p s ( Y ) p_t(Y) = \beta(Y)p_s(Y) pt(Y)=β(Y)ps(Y),并且可以表示 p t ( X ) p_t(X) pt(X)为:

我们知道:
p t ( Y ) = β ( Y ) p s ( Y ) p_t(Y) = \beta(Y)p_s(Y) pt(Y)=β(Y)ps(Y)
并且可以表示 p t ( X ) p_t(X) pt(X)为:
p t ( X ) = ∫ p s ( X ∣ Y ) β ( Y ) p s ( Y ) d Y p_t(X) = \int p_s(X|Y) \beta(Y) p_s(Y) dY pt(X)=ps(XY)β(Y)ps(Y)dY

我们的目标是估计 β ( Y ) \beta(Y) β(Y),使得源领域和目标领域的 p t ( X ) p_t(X) pt(X) ∫ p s ( X ∣ Y ) β ( Y ) p s ( Y ) d Y \int p_s(X|Y) \beta(Y) p_s(Y) dY ps(XY)β(Y)ps(Y)dY之间的分布尽可能匹配。

这可以通过以下模型来实现:
min ⁡ β ∥ μ ( p t ( X ) ) − E Y ∼ p s ( Y ) [ μ ( p s ( X ∣ Y ) ) β ( Y ) ] ∥ 2 \min\limits_\beta \|\mu(p_t(X)) - \mathbb{E}_{Y \sim p_s(Y)}[\mu (p_s(X|Y)) \beta (Y) ]\|^2 βminμ(pt(X))EYps(Y)[μ(ps(XY))β(Y)]2

约束条件为 β ( Y ) ≥ 0 \beta(Y) \geq 0 β(Y)0 E Y ∼ p s ( Y ) [ β ( Y ) ] = 1 \mathbb{E}_{Y \sim p_s(Y)}[\beta(Y)] = 1 EYps(Y)[β(Y)]=1

在实践中,我们使用以下的经验模型来估计:

min ⁡ β ∥ 1 n T ∑ i = 1 n T ϕ ( x i T ) − 1 n S ∑ i = 1 n S β ( y i S ) μ ^ ( p s ( X ∣ y i S ) ) ∥ 2 \min_\beta \| \frac{1}{n_T} \sum_{i=1}^{n_T} \phi(x^T_i) - \frac{1}{n_S} \sum_{i=1}^{n_S} \beta(y^S_i) \hat\mu(p_s(X|y^S_i)) \|^2 βminnT1i=1nTϕ(xiT)nS1i=1nSβ(yiS)μ^(ps(XyiS))2

约束条件为 β ( y i S ) ≥ 0 \beta(y^S_i) \geq 0 β(yiS)0 1 n S ∑ i = 1 n S β ( y i S ) = 1 \frac{1}{n_S} \sum_{i=1}^{n_S} \beta(y^S_i) = 1 nS1i=1nSβ(yiS)=1

其中, μ ^ ( p s ( X ∣ y i S ) ) \hat\mu(p_s(X|y^S_i)) μ^(ps(XyiS)) 是给定 y i S y^S_i yiS 时的 X X X 的条件分布的经验均值。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

由一个单例模式引发的思考-holder类方式

前言: 最近在看《Java并发编程实践》,里面提到了一种实现单例模式的方式,并大致说明了机制,但仍不是很清晰,今日有空,查阅相关书籍,尝试解释其中道理。 单例模式: 单例模式是一种常…

【Go入门】GO语言基础快速入门

Go基础 这小节我们将要介绍如何定义变量、常量、Go内置类型以及Go程序设计中的一些技巧。 定义变量 Go语言里面定义变量有多种方式。 使用var关键字是Go最基本的定义变量方式,与C语言不同的是Go把变量类型放在变量名后面: //定义一个名称为“variabl…

网络原理之TCP/IP

文章目录 应用层传输层UDP协议TCP协议TCP 的工作机制1. 确认应答2. 超时重传3. 连接管理TCP 的建立连接的过程(三次握手),和断开连接的过程(四次挥手)TCP 断开连接, 四次挥手 3. 滑动窗口5. 流量控制6. 拥塞控制7. 延时应答8. 捎带应答9. 面向字节流10. 异常情况 本章节主要讨论…

docker部署prometheus+grafana服务器监控(二) - 安装数据收集器 node-exporter

在目标服务器安装数据收集器 node-exporter 1. 安装数据收集器 node-exporter wget https://github.com/prometheus/node_exporter/releases/download/v1.6.1/node_exporter-1.6.1.linux-amd64.tar.gztar xvf node_exporter-1.6.1.linux-amd64.tar.gzmv node_exporter-1.6.1…

JavaWeb——Servlet原理、生命周期、IDEA中实现一个Servlet(全过程)

6、servlet 6.1、什么是servlet 在JavaWeb中,Servlet是基于Java编写的服务器端组件,用于处理客户端(通常是Web浏览器)发送的HTTP请求并生成相应的HTTP响应。Servlet运行在Web服务器上,与Web容器(如Tomcat&…

【ARMv8 SIMD和浮点指令编程】NEON 通用数据处理指令——复制、反转、提取、转置...

NEON 通用数据处理指令包括以下指令(不限于): • DUP 将标量复制到向量的所有向量线。 • EXT 提取。 • REV16、REV32、REV64 反转向量中的元素。 • TBL、TBX 向量表查找。 • TRN 向量转置。 • UZP、ZIP 向量交叉存取和反向交叉存取。 1 DUP (element) 将…

什么是React中的有状态组件(stateful component)和无状态组件(stateless component)?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

【机器学习可解释性】5.SHAP值的高级使用

机器学习可解释性 1.模型洞察的价值2.特征重要性排列3.部分依赖图4.SHAP 值5.SHAP值的高级使用 正文 汇总SHAP值以获得更详细的模型解释 总体回顾 我们从学习排列重要性和部分依赖图开始,以显示学习后的模型的内容。 然后我们学习了SHAP值来分解单个预测的组成部…

解释一下React中的钩子(hooks),例如useState和useEffect。

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

[数据结构】二叉树

1.概念 一棵二叉树是结点的一个有限集合,该集合: 1. 或者为空 2. 或者是由一个根节点加上两棵别称为左子树和右子树的二叉树组成 从上图我们可以发现: 1.二叉树不存在大于2 的度 2.二叉树的子树有左右之分,次序不能颠倒。是有…

beyond compare 4密钥2023大全,beyond compare 4注册码最新

beyond compare 4是一款文件对比软件,可以快速比较文件和文件夹、合并以及同步,非常实用,一些用户想知道beyond compare 4密钥有哪些,本文为大家带来了介绍哦~ 密钥: w4G-in5u3SH75RoB3VZIX8htiZgw4ELilwvPcHAIQWfwf…

基于STM32的示波器信号发生器设计

**单片机设计介绍,基于STM32的示波器信号发生器设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序文档 六、 文章目录 一 概要 基于STM32的示波器信号发生器是一种高性能的电子仪器,用于测试和分析电路中的电信号。在该系统中&a…

No174.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

《动手学深度学习 Pytorch版》 10.7 Transformer

自注意力同时具有并行计算和最短的最大路径长度这两个优势。Transformer 模型完全基于注意力机制,没有任何卷积层或循环神经网络层。尽管 Transformer 最初是应用于在文本数据上的序列到序列学习,但现在已经推广到各种现代的深度学习中,例如语…

ubuntu部署个人网盘nextCloud使用docker-compose方式

概述 当下各大网盘的容量都是有限制的,而且xx云不开会员网速就拉跨。 所以就想搭建一个自己的盘,并且可以控制用户的权限分组; nextCloud就很合适 我这边都是自己用偶尔给其他人使用下,所以直接docker部署了。 ubuntu版本&…

趣互联app一分购地推网推拉新上线平台啦,简单流程

趣互联一手渠道 “聚量推客” 上架趣互联啦,适合地推和网推进行推广,社群私域也可以推广,比较简单。 如果你在做拉新推广 地推或者网推都可以通过“聚量推客”获取最大收益

Unity Shader Graph 风格化熔岩

Unity ShaderGraph 合集_哔哩哔哩_bilibili

DAMNets

方法 体会 实验充分,不愧是ICLR,但作者未提供代码

关于报错java.util.ConcurrentModificationException: null的源码分析和解决

一般有这种问题,方法中至少会有List或者Map下的至少两个子类,有可能参数类型相同,也有可能不同都有可能触发这个问题!其主要原因是使用了ArrayList进行删除操作或者使用iterator遍历集合的同时对集合进行修改都有可能会出现这个问题 ArrayList属于List下的子类 需要区分的是Li…

剪辑中遮罩可分几种 剪辑遮罩视频怎么做

当你觉得剪辑特效很难制作的时候,不妨阅读一下本文,来了解遮罩的原理和用法。它是一种超级剪辑工具,可以制作出各种神奇的画面效果。在了解遮罩的基本原理后,就连初学者也能轻松地制作出令人惊艳的剪辑遮罩。有关剪辑中遮罩可分几…