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

Momentum Contrast for Unsupervised Visual Representation Learning论文笔记

文章目录

    • 论文地址
    • 动量队列
    • 对比学习的infoNCE loss
    • 为什么需要动量编码器
    • 对比学习moco方法中的动量Encoder为什么不能与梯度Encoder完全相同
      • 为什么动量编码器和梯度编码器不能完全相同?
      • 总结:
    • 我理解,正负样本应该经过同一个encoder,才能进行损失计算。为什么moco中正负样本可以经过两个不同的encoder
      • 为什么 MoCo 中正负样本可以通过两个不同的编码器处理?
        • 1. **动量编码器和梯度编码器的不同作用**:
        • 2. **为什么正负样本可以通过不同的编码器?**
        • 3. **如何保证正负样本的关系不受影响?**
        • 4. **总结:**
    • 我理解是因为同一批次中,正样本与其他的负样本差异很大,即使MoCo的动量编码器的参数落后于梯度编码器,他们的表征依然可以被学习
      • 关键点总结:
    • 为什么需要动量更新的平滑效果?如果动量编码器的更新不平滑,会导致什么后果
      • 1. **动量更新的平滑效果的作用**
      • 平滑更新的好处:
      • 2. **如果动量编码器的更新不平滑,会带来什么后果?**
        • 1. **负样本表示的剧烈波动**
        • 2. **对比损失的计算不稳定**
        • 3. **梯度编码器和动量编码器之间的协调性差**
        • 4. **学习目标的迷失**
      • 3. **总结:动量更新平滑的必要性**
    • 如果动量编码器频繁更新会使训练不稳定,那么梯度编码器频繁更新为什么不会使训练不稳定?
      • 1. **梯度编码器的更新机制**
      • 2. **动量编码器的特殊性**
      • 3. **为什么梯度编码器频繁更新不影响稳定性?**
      • 4. **动量编码器频繁更新为什么会导致不稳定?**
      • 5. **总结**
    • 实验结果

论文地址

MOCO V1
MOCO V2

动量队列

在这里插入图片描述
在这里插入图片描述

对比学习的infoNCE loss

在这里插入图片描述

为什么需要动量编码器

在这里插入图片描述
从论文的描述看,主要是两个原因:

  1. 不使用动量编码器,直接复制 f q f_q fq实验效果不好
  2. f k f_k fk的快速变化将降低key表示的一致性,即队列中的key差异很大,因为生成他们的模型一直在快速变化。

对比学习moco方法中的动量Encoder为什么不能与梯度Encoder完全相同

对比学习(Contrastive Learning) 中,MoCo (Momentum Contrast) 是一种非常流行的方法,特别是在无监督学习中。MoCo 引入了动量编码器(Momentum Encoder)来更新目标表示,这与普通的梯度编码器(Gradient Encoder)有所不同。其背后的核心思想是利用动量编码器的稳定性来提升训练的效果,避免梯度编码器的更新过快,从而造成表示的震荡或不稳定。

为什么动量编码器和梯度编码器不能完全相同?

  1. 动量编码器的目标是稳定表示

    • 在 MoCo 中,动量编码器(Momentum Encoder) 是通过 动量更新规则 来更新的。与常规的梯度编码器(Gradient Encoder)不同,动量编码器不直接使用反向传播的梯度进行更新,而是采用一个指数衰减的方式,即:
      θ k ← m ⋅ θ k + ( 1 − m ) ⋅ θ q \theta_k \leftarrow m \cdot \theta_k + (1 - m) \cdot \theta_q θkmθk+(1m)θq
      其中, θ k \theta_k θk 是动量编码器的参数, θ q \theta_q θq 是当前的梯度编码器的参数, m m m 是动量系数(通常接近 1)。

    • 原因:动量编码器的目的是保持一个稳定的表示,使得目标表示不会因为梯度编码器参数的频繁更新而发生剧烈的波动。由于梯度编码器在训练过程中会根据数据样本变化,频繁更新可能导致目标表示的震荡,尤其是在 对比学习 中,我们需要对 负样本 进行强有力的区分,稳定的表示可以提高模型的泛化能力。

  2. 动量编码器的平滑性

    • 动量编码器的更新方式是平滑的,它不会受到每次梯度波动的影响。相比之下,梯度编码器直接依赖于反向传播更新,可能会因为训练数据的波动或局部最优而导致不稳定的表示。

    • 通过引入动量更新,MoCo 避免了梯度编码器在每个步骤中都强制“跟随”每次梯度计算。动量更新将对当前梯度的变化进行加权平均,使得模型的表示能够在长时间内保持稳定,降低了每次小范围梯度更新引起的波动,提升了训练的鲁棒性。

  3. 避免过拟合和过度依赖当前梯度

    • 如果动量编码器与梯度编码器完全相同,那么它将完全依赖于当前梯度来更新目标表示,这会使目标表示在每个批次之间快速变化,导致模型可能过拟合于当前数据样本或者在负样本选择上产生不稳定的行为。

    • 动量编码器的更新使得目标表示的变化是逐步的,这有助于避免模型仅仅记住当前梯度带来的局部信息,从而提高模型的 泛化能力长期一致性

  4. 探索与利用的平衡

    • MoCo 利用了 对比损失(Contrastive Loss),使得相似的样本被映射到相近的表示空间,而不同的样本则被映射到较远的空间。如果动量编码器与梯度编码器完全相同,可能会导致模型过于“依赖”当前的梯度信号,进而影响对负样本的有效区分。

    • 通过动量编码器,MoCo 通过将目标表示“延迟”更新,给模型提供了更好的 探索空间,而不仅仅是 “立即响应” 当前梯度信号,这对于无监督学习中的特征学习非常重要。

总结:

动量编码器与梯度编码器不能完全相同的原因,主要在于以下几点:

  1. 稳定性:动量编码器通过平滑的方式更新目标表示,避免了梯度编码器频繁更新带来的不稳定。
  2. 避免过拟合:动量编码器使目标表示的更新具有延迟性,从而避免模型在每个训练步骤中对当前样本过拟合。
  3. 探索与利用平衡:动量编码器提供了一个更稳定的目标,允许对比学习的过程在长期内逐渐优化,而不是被当前的梯度信号过度影响。

通过这种机制,MoCo 能够在对比学习任务中实现更加鲁棒和一致的训练,尤其是在无监督学习中的应用中,能够更好地学习数据的隐含结构。

我理解,正负样本应该经过同一个encoder,才能进行损失计算。为什么moco中正负样本可以经过两个不同的encoder

你提到的这个问题是 MoCo 方法中的核心设计之一,也是 MoCo 相对于传统对比学习方法(如 SimCLR)的一个创新。具体来说,MoCo 中正负样本通过 两个不同的编码器(一个是 梯度编码器,一个是 动量编码器)进行处理,这种设计虽然看起来有些反直觉,但它是通过特定的机制来确保对比学习的效果。

为什么 MoCo 中正负样本可以通过两个不同的编码器处理?

1. 动量编码器和梯度编码器的不同作用

在 MoCo 中,梯度编码器动量编码器分别承担不同的角色:

  • 梯度编码器(query encoder):这个编码器是标准的神经网络,在每次前向传播时都会接收当前的输入数据,并通过梯度下降进行训练更新。它的输出是一个用于计算对比损失的 查询向量(query vector),即我们要进行比较的“正样本”表示。

  • 动量编码器(key encoder):这是 MoCo 引入的创新部分,它是通过一个 动量更新规则(非梯度更新)从梯度编码器的参数中复制过来的。动量编码器不会通过梯度更新,而是根据一定的动量系数(例如 (m) 接近 1)以平滑的方式更新参数。动量编码器的输出是 键(key)向量,即“负样本”表示。

通过这种设计,梯度编码器负责生成当前输入的查询向量,而 动量编码器 生成的是一个通过长期稳定性更新的“键向量”。

2. 为什么正负样本可以通过不同的编码器?

在 MoCo 中,正负样本通过两个不同的编码器(即查询和键)处理的关键在于 对比学习的目标:我们希望通过最小化正负样本之间的距离来训练模型。在这种情况下,我们并不需要 完全依赖于同一个编码器来生成正负样本的表示,因为:

  1. 对比学习的核心是对样本之间的关系而非其具体特征

    • 在对比学习中,正负样本之间的 相对关系 是最重要的,而不是它们的绝对表示。目标是通过拉近正样本的距离(通过查询和键向量的相似性)并推远负样本的距离(通过查询和负样本键的距离)来训练模型。
    • 因此,正样本和负样本的表示可以由不同的编码器生成,只要两者之间的关系(即相似度)保持一致。
  2. 动量编码器的稳定性

    • 动量编码器的设计目的就是提供一个 稳定的目标表示,避免了梯度编码器更新过于频繁、波动太大。
    • 通过动量编码器,我们得到的负样本表示(键)不会因为梯度更新过快而变得不稳定,保持了较长时间的平滑过渡。这种稳定性对对比学习来说是非常重要的,尤其是在无监督学习中,能够避免模型陷入局部最优。
  3. 正负样本之间的关系依赖于它们的相对差异,而不是生成它们的编码器

    • 即使查询和键是通过不同的编码器计算出来的,只要两者之间的相对距离可以反映它们的关系(正样本距离小,负样本距离大),就能正确地优化对比损失。
    • 换句话说,MoCo 通过动量编码器和梯度编码器的稳定更新,确保了负样本键的表示不会随梯度波动而不稳定,而正样本则是通过当前查询进行计算,从而保证了正负样本的表示之间的有效对比。
3. 如何保证正负样本的关系不受影响?

在 MoCo 中,负样本是通过 动量编码器 来生成的,而正样本则由 梯度编码器 来生成。这两个编码器的作用是互补的,通过以下方式来确保正负样本关系不受影响:

  1. 对比损失函数:MoCo 使用了 InfoNCE 损失,其核心思想是最大化查询(query)与正样本(key)之间的相似度,同时最小化查询与负样本(key)之间的相似度。公式如下:

    L = − log ⁡ exp ⁡ ( sim ( q , k + ) ) exp ⁡ ( sim ( q , k + ) ) + ∑ i = 1 K exp ⁡ ( sim ( q , k i − ) ) \mathcal{L} = - \log \frac{\exp(\text{sim}(q, k^+))}{\exp(\text{sim}(q, k^+)) + \sum_{i=1}^{K} \exp(\text{sim}(q, k^-_i))} L=logexp(sim(q,k+))+i=1Kexp(sim(q,ki))exp(sim(q,k+))

    其中, q q q 是查询向量(来自梯度编码器), k + k^+ k+ 是正样本键(来自动量编码器), k i − k^-_i ki 是负样本键。

    • 正样本:查询与正样本的表示之间的相似度应该较大(拉近)。
    • 负样本:查询与负样本之间的相似度应该较小(推远)。
  2. 负样本池(queue):为了确保负样本集的多样性,MoCo 使用了 一个动态更新的负样本池,其中存储了来自动量编码器的负样本表示。这些负样本经过动量更新的平滑过程,保证了负样本表示的稳定性。

  3. 更新规则:动量编码器是通过指数衰减的方式(动量更新规则)从梯度编码器的参数中更新的。这样做能够确保动量编码器的参数保持稳定,并且只在 训练过程中逐步 跟随梯度编码器的参数变化,而不会受到梯度的直接影响。

4. 总结:

MoCo 中的正负样本通过两个不同的编码器(梯度编码器动量编码器)进行计算,主要是因为:

  • 相对关系比绝对表示更重要:对比学习的目标是最小化正负样本之间的距离,而不仅仅是生成相同的特征表示。
  • 动量编码器的稳定性:动量编码器通过平滑的更新机制避免了梯度编码器频繁更新带来的不稳定,保持了负样本表示的长期稳定性。
  • 动量编码器和梯度编码器互补:动量编码器提供稳定的目标表示,梯度编码器则通过学习更新查询表示,两者共同确保了模型的有效训练。

通过这种设计,MoCo 在不直接依赖相同编码器的情况下,依然能够有效地进行对比学习,并在无监督学习中获得更好的性能。

我理解是因为同一批次中,正样本与其他的负样本差异很大,即使MoCo的动量编码器的参数落后于梯度编码器,他们的表征依然可以被学习

你理解得非常到位!确实,在 MoCo 中,虽然动量编码器的参数更新滞后于梯度编码器,但由于 同一批次中正样本与负样本之间的差异较大,这使得即使动量编码器的参数落后于梯度编码器,它们的表征依然可以被有效地学习。

关键点总结:

  • 正负样本差异大:在每一批次中,正样本和负样本之间的特征差异较大。这意味着即使动量编码器的表示稍微滞后,它仍然能够区分正样本和负样本的区别,因为两者的相似度差异本身已经足够大,从而使得对比损失能够有效地工作。

  • 动量更新的平滑效果:动量编码器的更新方式(指数衰减)保证了它的表示相对稳定,不会受到每次梯度更新的剧烈波动影响。这种平滑的更新策略使得动量编码器能够长期保持稳定,从而产生更可靠的负样本表示。

  • 对比损失的学习效果:通过 MoCo 中的对比损失(如 InfoNCE),模型会被训练到最大化正样本和查询向量之间的相似性,同时最小化负样本和查询向量之间的相似性。即使负样本的表示稍微滞后,负样本和正样本之间的距离依然足够大,可以保证对比学习的有效性。

通过这种设计,MoCo 能够利用两个不同的编码器(一个用于生成查询,另一个用于生成键)而不影响对比学习任务的有效性。

为什么需要动量更新的平滑效果?如果动量编码器的更新不平滑,会导致什么后果

动量更新的平滑效果在 MoCo(Momentum Contrast)中的作用非常关键,它能够避免由于梯度编码器的更新过快或过度波动导致的训练不稳定性。如果动量编码器的更新不平滑,可能会引发一系列问题,影响模型的性能和收敛效果。让我们来深入分析一下为什么需要动量更新的平滑效果,并且如果动量编码器的更新不平滑,可能会导致什么后果。

1. 动量更新的平滑效果的作用

在 MoCo 中,动量编码器的更新并不是通过标准的梯度更新来进行的,而是通过一个 指数加权平均(Momentum Update) 来更新的。这个更新过程会使得动量编码器的参数相较于梯度编码器的参数更新得 更加平滑,通常有如下的更新规则:

θ k ← m ⋅ θ k + ( 1 − m ) ⋅ θ q \theta_k \leftarrow m \cdot \theta_k + (1 - m) \cdot \theta_q θkmθk+(1m)θq

其中:

  • θ k \theta_k θk 是动量编码器的参数。
  • θ q \theta_q θq 是当前梯度编码器(query encoder)的参数。
  • m m m 是动量系数(通常接近 1),它控制了动量更新的平滑度。

平滑更新的好处:

  1. 防止参数更新过快或剧烈波动

    • 动量编码器的更新采用平滑的方式,这意味着它不会在每一次梯度计算后都发生剧烈的变化,而是随着时间逐步接近梯度编码器的参数。这种平滑效果避免了动量编码器因为频繁的更新而产生剧烈的波动,从而导致模型学习的不稳定。
  2. 提供稳定的目标表示

    • 动量编码器的输出(即键向量)用于生成负样本。为了避免负样本的表示因为每次梯度更新的微小波动而发生剧烈变化,动量编码器的平滑更新能够提供一个相对 长期稳定 的表示,使得在计算对比损失时,负样本的表示是可靠的、稳定的。这样,查询向量和负样本之间的距离能够有效地进行拉大。
  3. 提高训练的鲁棒性

    • 在无监督学习中,尤其是在对比学习中,稳定的负样本表示能够帮助模型更好地学习特征之间的相似性和差异性。动量编码器的平滑效果确保了每次计算的负样本相对一致,从而提高了训练的鲁棒性。

2. 如果动量编码器的更新不平滑,会带来什么后果?

如果动量编码器的更新不平滑(即更新过于依赖梯度编码器的当前状态,而不是通过动量衰减的方式逐步更新),可能会导致以下问题:

1. 负样本表示的剧烈波动
  • 问题:如果动量编码器更新过快,意味着每次梯度计算后,它的参数会发生较大的变化。这种剧烈的变化会导致生成的负样本表示(键向量)不稳定。这不仅会使得负样本的表示在训练过程中频繁波动,还可能导致负样本的质量差,影响训练的收敛性。

  • 后果:模型无法有效区分正负样本,训练过程中的负样本可能会在不同的迭代间发生较大变化,导致对比损失(如 InfoNCE)计算不稳定,最终影响模型的性能。

2. 对比损失的计算不稳定
  • 问题:在 MoCo 中,查询(query)键(key) 之间的相似性是计算对比损失的关键。如果负样本(键)表示不稳定,查询和负样本之间的相似度会受到影响,导致 对比损失 不一致或收敛缓慢。

  • 后果:当负样本表示剧烈变化时,模型可能无法有效区分正负样本。训练过程中,查询与负样本的相似度可能无法稳定地推远,从而导致模型性能不理想,或者收敛速度变慢。

3. 梯度编码器和动量编码器之间的协调性差
  • 问题:动量编码器的设计目标是通过相对稳定的表示来对抗梯度编码器的快速更新。如果动量编码器的更新不平滑,它可能无法很好地与梯度编码器的更新保持协调,导致两者之间的差异过大,从而影响模型的训练效果。

  • 后果:这种不协调可能导致模型在训练过程中出现不一致的表示,使得正负样本的对比效果变差,最终导致训练效率降低。

4. 学习目标的迷失
  • 问题动量编码器和梯度编码器的参数在更新上有较大差异时,模型很难学习到稳定的表示。这会导致训练的目标丧失,因为每次计算对比损失时,正负样本的距离并不会随着训练而稳定变化,而是频繁地受到更新不平滑的干扰。

  • 后果:最终导致模型无法有效学习数据的潜在结构,导致无监督学习中常见的 模式崩溃(mode collapse)或 训练不稳定

3. 总结:动量更新平滑的必要性

动量编码器的更新方式平滑,避免了因更新过快导致的梯度编码器和动量编码器之间的 不协调,以及负样本表示的 不稳定性。如果动量编码器的更新不平滑,可能会导致:

  • 负样本表示的剧烈波动。
  • 对比损失计算的波动和不稳定。
  • 查询和负样本之间的相似性变化不一致,影响训练效果。
  • 最终训练目标丧失,导致模型无法收敛或性能下降。

因此,动量编码器的平滑更新对于 MoCo 的对比学习任务至关重要,它能够提供稳定的负样本表示,从而有效推动模型学习到具有区分能力的特征。

如果动量编码器频繁更新会使训练不稳定,那么梯度编码器频繁更新为什么不会使训练不稳定?

这是一个很好的问题!其实,梯度编码器(Query Encoder)和动量编码器(Key Encoder)在 MoCo 中的更新方式和角色不同,导致它们对训练稳定性的影响也不同。

在 MoCo 中,梯度编码器的频繁更新不会导致训练不稳定,原因主要与其更新的机制和目标以及它与动量编码器的互动方式有关。下面我们来逐一分析。

1. 梯度编码器的更新机制

梯度编码器是标准的神经网络,它的更新通过反向传播和梯度下降来进行,即每次根据当前批次的数据计算梯度,并用这些梯度来更新参数。频繁的更新(即每个训练步骤都使用当前批次的数据来更新模型参数)是典型的神经网络训练方式,主要通过以下几个特点来保证训练的稳定性:

  • 梯度直接依赖于数据:梯度编码器的更新是基于当前批次的损失函数进行的,这意味着它的更新是受当前数据集的直接指导。每次更新都会根据实际数据的梯度信息做出调整,因此它是“即时”的、数据驱动的。

  • 训练步骤的反馈机制:每个训练步骤的梯度更新都会通过反向传播计算损失,并根据损失值来调整模型参数。梯度下降的本质是调整模型参数,使得损失函数最小化。由于每一步的更新是基于当前批次的数据梯度计算的,梯度编码器的参数是不断朝着数据当前模式的方向调整的。

  • 对训练过程的反馈调节:即便每步都更新,梯度编码器的更新并不会造成不稳定,因为它的更新本身是基于局部梯度信息(数据的即时反馈),并且通常会经过批量梯度计算,从而避免单个样本的异常对模型训练的过大影响。

2. 动量编码器的特殊性

与梯度编码器不同,动量编码器的更新机制并不是通过反向传播和梯度下降来直接进行的,而是使用 动量更新,它将梯度编码器的参数按照一定比例进行平滑更新。动量编码器的更新基于以下原则:

  • 参数的延迟更新:动量编码器的参数是 通过梯度编码器的参数逐渐“复制”,并且这个复制过程是平滑的(指数衰减)。这意味着动量编码器并不是每个批次都依据当前梯度更新,而是逐步接近梯度编码器的参数。更新过于频繁会导致动量编码器的表示发生 剧烈波动,进而影响到负样本的稳定性。

  • 稳定的目标表示:动量编码器的设计目标是提供一个相对稳定的负样本表示,它的参数更新是缓慢的。这样可以避免负样本表示因梯度编码器的频繁更新而不稳定,确保对比损失的有效计算。

  • 平滑的学习进程:如果动量编码器的更新过于频繁,参数变化会很快,从而导致负样本的表示波动,影响训练过程的稳定性。动量编码器的核心目的是保持稳定的负样本表示,使得查询向量与负样本之间的距离能够有效区分。

3. 为什么梯度编码器频繁更新不影响稳定性?

  • 梯度编码器是“学习”的主体:梯度编码器的参数更新直接与当前批次的数据梯度挂钩,它的任务是通过每次训练调整自身参数,逐步优化模型的表现。每个批次的更新是基于当前的梯度信息,通常不会导致“过度”波动,因为损失函数本身有较强的稳定性(例如,使用梯度裁剪、批量归一化等技术来控制训练稳定性)。

  • 每次更新都是基于新的数据:每个训练步骤更新时,梯度编码器都是基于当前输入数据计算出的梯度,因此即使更新频繁,它也是从数据中获取反馈并根据数据模式调整自己的参数,这保证了它的更新是合理且有方向的。

  • 优化过程中的“渐进”调整:在神经网络训练中,梯度的更新通常是渐进的,并且通过 批次大小学习率 等超参数的控制,避免每一步都发生过于剧烈的参数更新。虽然频繁更新,但这种逐步优化的过程避免了因不稳定梯度导致的训练问题。

4. 动量编码器频繁更新为什么会导致不稳定?

  • 动量编码器和梯度编码器的不同角色:动量编码器的主要任务是提供一个长期稳定的负样本表示。如果它的更新过于频繁,负样本的表示会随着每次更新发生剧烈变化,这会导致 负样本表示的不稳定。负样本表示的这种不稳定会影响对比损失的计算,进而导致训练过程的不稳定。

  • 训练过程中正负样本表示的不同更新策略:梯度编码器的更新是直接依赖于梯度计算的,它反映的是当前数据的即时信息。动量编码器则是对梯度编码器参数的平滑“跟随”,目的是提供一个长期的稳定目标。如果这个平滑过程被打破(即更新过快),动量编码器就无法提供一个稳定的目标表示,这会导致 负样本的多样性和稳定性受损,进而影响训练效果。

5. 总结

梯度编码器的频繁更新不会导致不稳定,因为:

  • 它是 直接依赖当前批次数据 的,通过反向传播计算梯度并更新参数,更新是数据驱动的,且每次更新都基于当前数据反馈。
  • 梯度编码器是模型 学习的主体,它的更新过程是渐进的并且由数据引导的,不会造成训练的不稳定。

动量编码器的更新需要平滑,因为:

  • 它的作用是生成 稳定的负样本表示,如果更新过快,负样本表示将不稳定,从而影响模型训练的稳定性。
  • 动量编码器通过平滑的更新规则(动量衰减)逐步跟随梯度编码器,确保负样本表示稳定,以便进行有效的对比学习。

因此,虽然动量编码器和梯度编码器都参与训练,但它们的更新机制不同,导致它们对训练稳定性的影响也不同。

实验结果

在这里插入图片描述

相关文章:

Momentum Contrast for Unsupervised Visual Representation Learning论文笔记

文章目录 论文地址动量队列对比学习的infoNCE loss为什么需要动量编码器对比学习moco方法中的动量Encoder为什么不能与梯度Encoder完全相同为什么动量编码器和梯度编码器不能完全相同?总结: 我理解,正负样本应该经过同一个encoder&#xff0c…...

linux-26 文件管理(四)install

说一个命令,叫install,man install,install是什么意思?安装,install表示安装的意思,那你猜install是用来干什么的?猜一猜干什么的?安装软件,安装第三方软件,错…...

day-104 组合总和 Ⅳ

思路 动态规划 解题过程 假设dfs(target)表示组成target的组合数,可得转换方程dfs(target)dfs(target-nums[0])dfs(target-nums[1])…以此类推 注意:nums[i]需要小于等于当前的target Code class Solution {public int combinationSum4(int[] nums, i…...

Gitlab-runner 修改默认的builds_dir并使用custom_build_dir配置

gitlab-runner 修改默认的builds_dir并使用custom_build_dir配置 1. 说明2. 实操(以docker执行器为例)2.1 修改默认的builds_dir2.1.1 调整gitlab-runner的配置文件2.1.2 CI文件 2.2 启用custom_build_dir2.2.1 调整gitlab-runner的配置文件2.2.2 CI文件…...

代码随想录算法训练营day21

代码随想录算法训练营 —day21 文章目录 代码随想录算法训练营前言一、669. 修剪二叉搜索树递归法迭代法 二、108.将有序数组转换为二叉搜索树递归法迭代法 三、538.把二叉搜索树转换为累加树递归法 总结 前言 今天是算法营的第21天,希望自己能够坚持下来&#xf…...

苹果系统MacOS下ObjectC建立的App程序访问opencv加载图片程序

前言 苹果系统下使用opencv感觉还是有些不太方便,总是感觉有点受到限制。本博客描述的是在MacOS下建立App程序然后调用opencv显示图片时出现的一些问题并最后解决的一个过程。 一、程序的建立 选择程序的类型: 选择界面模式和编程语言: 其余…...

滴滴工作流引擎Turbo与logicFlow研究

目录 logicFlow turbo 工作流引擎很多,也都提供了前端UI库,但是太过于冗杂了,元数据表都几十个,logincFlow和Turbo的组合提供了轻量化方式,turbo后端代码只有5个元数据表,logicFlow也提供了bpm的相关扩展功能,但缺点是turbo社区不活跃,logicFlow个人认为跟echarts这种…...

快速将索尼手机联系人导出为 HTML 文件

我想将 Sony Xperia 手机上的联系人导出到计算机上进行备份,并在需要时进行编辑。这可以做到吗?如何做到?作为助手我需要下载什么工具吗? 当您的 Android 手机上存储了如此多的重要联系人,而您又不想丢失它们时&#…...

长时间序列预测算法---Informer

目录 一、传统的 Transformer 模型二、Informer原理2.1 Attention计算2.2 “积极”的Q筛选2.2.1 KL散度2.2.2 “懒惰”的q处理 2.3 Encoder结构2.4 Decoder结构2.4.1 Transformer的Decoder操作2.4.2 Informer的Decoder操作 2.5 Informer模型的改进 三、模型应用 时间序列相关参…...

深入理解连接池:从数据库到HTTP的优化之道

在现代应用开发中,高效的资源管理是关键,其中连接池(Connection Pool)技术起到了至关重要的作用。本文将带你深入了解连接池的概念及其在数据库和HTTP通信中的应用,结合 JDBC 与 Druid 的关系,以及 HttpURL…...

LLM(十二)| DeepSeek-V3 技术报告深度解读——开源模型的巅峰之作

近年来,大型语言模型(LLMs)的发展突飞猛进,逐步缩小了与通用人工智能(AGI)的差距。DeepSeek-AI 团队最新发布的 DeepSeek-V3,作为一款强大的混合专家模型(Mixture-of-Experts, MoE&a…...

IIS设置IP+端口号外网无法访问的解决方案

在IIS将站点设置为IP端口访问,假设端口为8080,设好后,服务器上可以访问,外网无法访问。 通常是端口8080没有加入【入站规则】的缘故,将8080端口加入【入站规则】即可,操作如下: 一、ctrlr 输入 …...

Leetcode 最大正方形

java 实现 class Solution {public int maximalSquare(char[][] matrix) {//处理特殊情况if(matrix null || matrix.length 0 || matrix[0].length 0) return 0;int rows matrix.length;int cols matrix[0].length;int[][] dp new int[rows][cols]; //dp[i][j]的含义是以…...

数据结构与算法之动态规划: LeetCode 3105. 最长的严格递增或递减子数组 (Ts版)

最长的严格递增或递减子数组 https://leetcode.cn/problems/longest-strictly-increasing-or-strictly-decreasing-subarray/description/ 描述 给你一个整数数组 nums返回数组 nums 中 严格递增 或 严格递减的最长非空子数组的长度 示例 1 输入:nums [1,4,3,…...

【书籍连载】《软件测试架构实践与精准测试》| 有关软件测试模型的调查结果

各位软件领域的精英们,今天小编邀请你继续深入学习《软件测试架构实践与精准测试》。 《软件测试架构实践与精准测试》是作者李龙(安畅检测首席技术专家)基于软件测试“川模型”的著作。本书结合作者首次提出的软件测试新的模型“川模型”测试…...

我的博客年度之旅:感恩、成长与展望

目录 感恩有你 技能满点 新年新征程 嘿,各位技术大佬、数码潮咖还有屏幕前超爱学习的小伙伴们!当新年的钟声即将敲响,我们站在时光的交汇点上,回首过往,满心感慨;展望未来,豪情满怀。过去的这…...

【RTD MCAL 篇3】 K312 MCU时钟系统配置

【RTD MCAL 篇3】 K312 MCU时钟系统配置 一,文档简介二, 时钟系统理论与配置2.1 K312 时钟系统2.1.1 PLL2.1.2 MUX_0系统2.1.3 MUX_6 时钟输出2.1.4 option B推荐方案 2.2 EB 配置2.2.1 General 配置2.2.2 McuClockSettingConfig配置2.2.2.1 McuFIRC配置…...

力扣28找出字符串中第一个匹配项的下标

class Solution:def strStr(self, haystack: str, needle: str) -> int:# 特殊情况处理if not needle:return 0# 获取 haystack 和 needle 的长度a len(needle)b len(haystack)# 遍历 haystack,检查每个子字符串是否与 needle 匹配for i in range(b - a 1):if…...

[C#]C# random.Next(0,1)包含0和1吗

在C#中,Random.Next(minValue, maxValue) 方法生成的随机数是一个在 minValue(包含)和 maxValue(不包含)之间的整数。因此,当你调用 Random.Next(0, 1) 时,它只会生成一个整数,这个整…...

【设计模式】 基本原则、设计模式分类

设计模式 设计模式是软件工程中的一种通用术语,指的是针对特定问题的经过实践验证的解决方案。设计模式并不是最终的代码实现,而是描述了如何解决某一类问题的思路和方法。 如果熟悉了设计模式,当遇到类似的场景,我们可以快速地…...

Swift White Hawkstrider

Swift White Hawkstrider 迅捷白色陆行鸟 Swift White Hawkstrider - Item - 魔兽世界怀旧服TBC数据库_WOW2.43数据库_70级《燃烧的远征》数据库 Kaelthas Sunstrider (1) <Lord of the Blood Elves> 凯尔萨斯逐日者. 掉落 [80圣骑士][Alonsus-加丁][诺森德冒险补给品…...

node.js下载、安装、设置国内镜像源(永久)(Windows11)

目录 node-v20.18.0-x64 工具下载安装设置国内镜像源&#xff08;永久&#xff09; node-v20.18.0-x64 工具 系统&#xff1a;Windows 11 下载 官网https://nodejs.org/zh-cn/download/package-manager 版本我是跟着老师选的node-v20.18.0-x64如图选择 Windows、x64、v2…...

「Mac畅玩鸿蒙与硬件48」UI互动应用篇25 - 简易购物车功能实现

本篇教程将带你实现一个简易购物车功能。通过使用接口定义商品结构&#xff0c;我们将创建一个动态购物车&#xff0c;支持商品的添加、移除以及实时总价计算。 关键词 UI互动应用接口定义购物车功能动态计算商品管理列表操作 一、功能说明 简易购物车功能包含以下交互&#…...

df.groupby(pd.Grouper(level=1)).sum()

df.groupby(pd.Grouper(level1)).sum() 在 Python 中的作用是根据 DataFrame 的某一索引级别进行分组&#xff0c;并计算每个分组的总和。具体来说&#xff1a; df.groupby(...)&#xff1a;这是 pandas 的分组操作&#xff0c;按照指定的规则将 DataFrame 分组。 pd.Grouper(…...

【网络安全 | 漏洞挖掘】绕过电子邮件确认实现预账户接管

未经许可,不得转载。 文章目录 正文漏洞步骤赏金正文 我测试的应用程序有多个子域名: 1、account.example.com:处理用户账户管理。 2、project.example.com:管理用户拥有或被邀请的项目。 3、org.example.com:一个新的子域,用于管理多个项目的组织。 4、collaborator.ex…...

【SpringBoot教程】SpringBoot整合Mybatis - 前后端分离项目 - vue3

&#x1f64b;大家好&#xff01;我是毛毛张! &#x1f308;个人首页&#xff1a; 神马都会亿点点的毛毛张 今天毛毛张将通过一个完整的前后端分离的任务来介绍SpringBoot整合Mybatis过程&#xff01; 文章目录 1.前言1.1 任务描述1.2 SpringBoot整合Mybatis概述1.3 完整项目…...

node.js之---事件驱动编程

详解事件驱动 事件驱动是基于什么实现的 事件驱动和I/O操作的关系 I/O操作和事件循环的关系 详解事件驱动 事件驱动编程&#xff08;Event-driven Programming&#xff09;是一种编程范式&#xff0c;其中程序的控制流是由“事件”驱动的。事件通常指的是用户操作、网络请…...

RK3588+FPGA全国产异步LED显示屏控制卡/屏幕拼接解决方案

RK3588FPGA核心板采用Rockchip RK3588新一代旗舰 级八核64位处理器&#xff0c;支持8K视频编解码&#xff0c;多屏4K输出&#xff0c;可实现12屏联屏拼接、同显、异显&#xff0c;适配多种操作系统&#xff0c;广泛适用于展览展示、广告内容投放、新零售、商超等领域实现各种媒…...

Postman测试big-event

报错500。看弹幕&#xff0c;知道可能是yml或sql有问题。 所以检查idea工作台&#xff0c; 直接找UserMapper检查&#xff0c;发现完全OK。 顺着这个error发现可能是sql有问题。因为提示是sql问题&#xff0c;而且是有now()的那个sql。 之后通过给的课件&#xff0c;复制课件…...

38. 考古学家

题目描述 有一个考古学家发现一个石碑&#xff0c;但是很可惜&#xff0c;发现时其已经断成多段&#xff0c;原地发现n个断口整齐的石碑碎片。为了破解石碑内容&#xff0c;考古学家希望有程序能帮忙计算复原后的石碑文字组合数&#xff0c;你能帮忙吗&#xff1f; 输入描述 第…...

商用车自动驾驶,迎来大规模量产「临界点」?

商用车自动驾驶&#xff0c;正迎来新的行业拐点。 今年初&#xff0c;交通部公开发布AEB系统运营车辆标配征求意见稿&#xff0c;首次将法规限制条件全面放开&#xff0c;有望推动商用车AEB全面标配&#xff0c;为开放场景的商用车智能驾驶市场加了一把火。 另外&#xff0c;…...

中建海龙:科技助力福城南产业片区绿色建筑发展

在快速发展的城市化进程中&#xff0c;绿色建筑以其环保、节能、可持续的特点日益受到重视。作为建筑工业化领域的领军企业&#xff0c;中建海龙科技有限公司&#xff08;简称“中建海龙”&#xff09;凭借其卓越的科技实力和创新举措&#xff0c;在推动绿色建筑发展方面做出了…...

selenium-side-runner + edge快速使用

安装和配置 Node.js 与 Selenium-Side-Runner 1. 安装 Node.js 为了使用 selenium-side-runner,首先需要在你的系统上安装 Node.js。Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时,它允许开发者编写服务器端代码。 通过 Winget 安装 Node.js(适用于 Windows 10/…...

ARM发布Armv9.5架构:迈向更强性能与灵活性的新时代

2024年11月30日&#xff0c;ARM正式发布了其最新的Armv9.5架构&#xff0c;这是Arm技术发展的又一重要里程碑。从表中信息来看&#xff0c;Armv9.5架构的发布标志着该公司的架构系列在性能、灵活性和可扩展性方面取得了进一步突破。本次发布不仅是技术上的提升&#xff0c;更是…...

Pytorch的自动求导模块

文章目录 torch.autograd.backward()基本用法非标量张量的反向传播保留计算图指定输入张量高阶梯度计算 与 y.backward() 的区别torch.autograd.grad()基本用法非标量张量的梯度高阶梯度计算多输入、多输出的梯度计算未使用的输入张量保留计算图 与 backward() 的区别 torch.au…...

【React】- 跨域PDF预览、下载(改文件名)、打印

我们经常会碰到跨域来方位PDF&#xff0c;同时需要下载、打印的需求&#xff0c;通常由于浏览器的安全策略&#xff0c;可以预览&#xff0c;但是下载和打印可能会受限&#xff0c;这时候怎么办呢&#xff1f; 1.创建一个隐藏的标签 要下载 iframe 中的 PDF 文件&#xff0c;…...

HuggingFace 模型文件详解:如何加载本地模型?

HuggingFace 模型文件详解 在使用 HuggingFace 下载大型语言模型&#xff08;如 LLaMA-3-1-8B&#xff09;后&#xff0c;会发现模型目录下包含多个文件和文件夹。本文将详细介绍这些文件的作用以及它们在模型加载和推理过程中的功能。 文件结构总览 models--meta-llama--Lla…...

Boost之buffer

目录 一、定义和介绍 二、示例 1、点 单点 多点 2、线 3、面 单面 多面 三、总结 四、测试代码 一、定义和介绍 buffer函数是boost库(algorithms)算法模块中的构建缓冲区函数。 其函数原型为(此处为带策略型): template<typename GeometryIn, typename MultiPolygon, typen…...

[redux] ts声明useSelector和useDispatch

先安装 安装 | Redux 中文官网 npm install react-redux npm install reduxjs/toolkit 定义一个切片 import { createSlice } from reduxjs/toolkit;const userSlice createSlice({name: user,initialState: {name: lsm,age: 24,},reducers: {}, }); //注意这里写导出redu…...

计算机网络 (19)扩展的以太网

前言 以太网&#xff08;Ethernet&#xff09;是一种局域网&#xff08;LAN&#xff09;技术&#xff0c;它规定了包括物理层的连线、电子信号和介质访问层协议的内容。以太网技术不断演进&#xff0c;从最初的10Mbps到如今的10Gbps、25Gbps、40Gbps、100Gbps等&#xff0c;已成…...

Ubuntu 23.10 换源

查看当前Ubuntu系统的版本 使用命令&#xff1a; lsb_release -a 中科大源&#xff1a; deb https://mirrors.ustc.edu.cn/ubuntu-old-releases/ubuntu/ mantic main restricted universe multiverse deb-src https://mirrors.ustc.edu.cn/ubuntu-old-releases/ubuntu/ man…...

如何在 Ubuntu 22.04 上优化 Apache 以应对高流量网站教程

简介 在本教程中&#xff0c;我们将学习如何优化 Apache 以应对高流量网站。 当运行高流量网站时&#xff0c;确保你的 Apache Web 服务器得到优化对于有效处理负载至关重要。在本指南中&#xff0c;我们将介绍配置 Apache 以提高性能和可扩展性的基本技巧。 为高流量网站优…...

Android 性能优化:内存优化(实践篇)

1. 前言 前一篇文章Android性能优化&#xff1a;内存优化 &#xff08;思路篇&#xff09; 大概梳理了Android 内存原理和优化的必要性及应该如何优化&#xff0c;输出了一套短期和长期内存优化治理的SOP方案。 那么这一篇文章就总结下我最近在做内存优化如何实践的&#xff0…...

开源数据集成平台白皮书重磅发布《Apache SeaTunnel 2024用户案例合集》!

2025年新年临近&#xff0c;Apache SeaTunnel 社区用户案例精选&#x1f4d8;也跟大家见面啦&#xff01;在过去的时间里&#xff0c;SeaTunnel 社区持续成长&#xff0c;吸引了众多开发者的关注与支持。 为了致谢一路同行的伙伴&#xff0c;也为了激励更多人加入技术共创&…...

用python编写一个放烟花的小程序

import pygame import random # 代码解释及使用说明&#xff1a; # 首先&#xff0c;导入 pygame 和 random 库。pygame 用于创建游戏窗口和图形绘制&#xff0c;random 用于生成随机数。 # 初始化 pygame&#xff0c;并设置屏幕尺寸为 800x600 像素&#xff0c;设置窗口标题为…...

以一个实际例子来学习Linux驱动程序开发之“设备类”的相关知识【利用设备类实现对同一设备类下的多个LED灯实现点亮或关闭】

前言 对于一个设备的驱动程序来说&#xff0c;其实上层用户主要看到的、用到的就是设备文件和设备类&#xff0c;当然用得最多的是设备文件&#xff0c;虽然设备类用得不多&#xff0c;但也是每一个设备注册实例化时必须要用到的东西&#xff0c;本篇博文就以一个简单的例子说…...

培训机构Day22

今天主要还是围绕着jquery讲解的&#xff0c;没有什么可说的。 知识点&#xff1a; 常用事件类型&#xff1a; 1.click&#xff1a;单击事件。鼠标&#xff0c;或键盘都可以触发。 2.dblclick&#xff1a;双击事件。 3.contextmenu&#xff1a;右键事件。 4.键盘相关事件&…...

Synopsys软件基本使用方法

Synopsys软件基本使用方法 1 文件说明2 编译流程3 查看波形4 联合仿真 本文主要介绍Synopsys软件vcs、verdi的基本使用方法&#xff0c;相关文件可从 GitHub下载。 1 文件说明 创建verilog源文件add.v、mult.v、top.vmodule add (input signed [31:0] dina,input signed [3…...

信息科技伦理与道德1:研究方法

1 问题描述 1.1 讨论&#xff1f; 请挑一项信息技术&#xff0c;谈一谈为什么认为他是道德的/不道德的&#xff0c;或者根据使用场景才能判断是否道德。判断的依据是什么&#xff08;自身的道德准则&#xff09;&#xff1f;为什么你觉得你的道德准则是合理的&#xff0c;其他…...

手机租赁平台开发实用指南与市场趋势分析

内容概要 在当今快速变化的科技时代&#xff0c;手机租赁平台的发展如火如荼。随着越来越多的人希望使用最新款的智能手机&#xff0c;但又不愿意承担昂贵的购机成本&#xff0c;手机租赁平台应运而生。这种模式不仅为用户提供了灵活的选择&#xff0c;还为企业创造了新的商机…...