深度学习之表示学习 - 贪心逐层无监督预训练篇

引言

在人工智能的浩瀚星空中,深度学习以其强大的数据处理与模式识别能力,成为了一颗璀璨的明星。而表示学习,作为深度学习的核心基石之一,正引领着这一领域不断突破边界。表示学习旨在将原始数据转换为更加抽象、更有意义的特征表示,使得机器学习模型能够更有效地捕捉数据中的复杂关系与规律。在这一过程中,贪心逐层无监督预训练技术犹如一把钥匙,为深度学习模型的构建与优化开辟了新途径。

贪心逐层无监督预训练

  • 无监督学习在深度神经网络的复兴上起到了关键的、历史性的作用,它使研究者首次可以训练不含诸如卷积或者循环这类特殊结构的深度监督网络。

    • 我们将这一过程称为无监督预训练 ( unsupervised pretraining \text{unsupervised pretraining} unsupervised pretraining),或者更精确地, 贪心逐层无监督预训练 ( greedy layer-wise unsupervised pretraining \text{greedy layer-wise unsupervised pretraining} greedy layer-wise unsupervised pretraining)。
    • 此过程是一个任务( 无监督学习,尝试获取输入分布的形状)的表示如何有助于另一个任务(具有相同输入域的监督学习)的典型示例。
  • 贪心逐层无监督预训练依赖于单层表示学习算法,例如 RBM \text{RBM} RBM、单层自编码器、稀疏编码模型或其他学习潜在表示的模型。

    • 每一层使用无监督学习预训练,输入前一层的输出,输出数据的新的表示。
    • 这个新的表示的分布(或者是和其他变量比如要预测类别的关系)有可能是更简单的。
    • 算法1所示正式地表述。
  • 基于无监督标准的贪心逐层训练过程,早已被用来规避监督问题中深度神经网络难以联合训练多层的问题。

    • 这种方法至少可以追溯神经认知机 ( Fukushima, 1975 \text{Fukushima, 1975} Fukushima, 1975)。
    • 深度学习的复兴始于 2006 2006 2006 年,源于发现这种贪心学习的过程能够为多层联合训练过程找到一个好的初始值,甚至可以成功训练全连接的结构:
      • Hinton et al., 2006b \text{Hinton et al., 2006b} Hinton et al., 2006b
      • Hinton and Salakhutdinov, 2006 \text{Hinton and Salakhutdinov, 2006} Hinton and Salakhutdinov, 2006
      • Hinton, 2006 \text{Hinton, 2006} Hinton, 2006
      • Bengio et al., 2007d \text{Bengio et al., 2007d} Bengio et al., 2007d
      • Ranzato et al., 2007a \text{Ranzato et al., 2007a} Ranzato et al., 2007a
    • 在此发现之前,只有深度卷积网络或深度循环网络这类特殊结构的深度网络被认为是有可能训练的。
    • 现在我们知道训练全连接的深度结构,贪心逐层无监督预训练不是唯一的方法,但无监督预训练是第一个成功的方法。
  • 贪心逐层无监督预训练被称为贪心 ( greedy \text{greedy} greedy) 的,是因为它是一个贪心算法 ( greedy algorithm \text{greedy algorithm} greedy algorithm),这意味着它独立地优化解决方案的一个部分,每一步解决一个部分,而不是联合优化所有部分。

    • 它被称为逐层的 ( layer-wise \text{layer-wise} layer-wise),是因为这些独立的解决方案是网络层。
    • 具体地,贪心逐层无监督预训练每次处理一层网络,训练第 k k k 层时保持前面的网络层不变。
    • 特别地,低层网络(最先训练的)不会在引入高层网络后进行调整。
    • 它被称为无监督 ( unsupervised \text{unsupervised} unsupervised) 的,是因为每一层用无监督表示学习算法训练。
    • 然而,它也被称为预训练 ( pretraining \text{pretraining} pretraining),是因为它只是在联合训练算法细调所有层之前的第一步。
    • 在监督学习任务中,它可以被看作是正则化项(在一些实验中, 预训练不能降低训练误差,但能降低测试误差)和参数初始化的一种形式。
  • 通常而言, “预训练’’ 不仅单指预训练阶段,也指结合预训练和监督学习的整个两阶段学习过程。

    • 监督学习阶段可能会使用预训练阶段得到的顶层特征训练一个简单分类器,或者可能会对预训练阶段得到的整个网络进行监督细调。
    • 不管采用什么类型的监督学习算法和模型,在大多数情况下,整个训练过程几乎是相同的。
    • 虽然无监督学习算法的选择将明显影响到细节,但是大多数无监督预训练应用都遵循这一基本方法。
  • 贪心逐层无监督预训练也能用作其他无监督学习算法的初始化,比如深度自编码器 ( Hinton and Salakhutdinov, 2006 \text{Hinton and Salakhutdinov, 2006} Hinton and Salakhutdinov, 2006) 和具有很多潜变量层的概率模型。

    • 这些模型包括深度信念网络 ( Hinton et al., 2006b \text{Hinton et al., 2006b} Hinton et al., 2006b) 和深度玻尔兹曼机 ( Salakhutdinov and Hinton, 2009c \text{Salakhutdinov and Hinton, 2009c} Salakhutdinov and Hinton, 2009c)。
    • 这些深度生成模型会在后续篇章:深度生成模型(敬请期待!)中讨论。
  • 正如深度模型中的优化 - 优化策略和元算法篇 - 监督预训练所探讨的,也可以进行贪心逐层监督预训练。这建立在训练浅层模型比深度模型更容易的前提下,而该前提似乎在一些情况下已被证实 ( Erhan et al., 2010 \text{Erhan et al., 2010} Erhan et al., 2010)。

何时以及为何无监督预训练有效? (篇幅有点长)

  • 在很多分类任务中,贪心逐层无监督预训练能够在测试误差上获得重大提升。
    • 这一观察结果始于 2006 2006 2006 年对深度神经网络的重新关注 ( Hinton et al., 2006b; Bengio et al., 2007d; Ranzato et al., 2007a \text{Hinton et al., 2006b; Bengio et al., 2007d; Ranzato et al., 2007a} Hinton et al., 2006b; Bengio et al., 2007d; Ranzato et al., 2007a)。
    • 然而,在很多其他问题上,无监督预训练不能带来改善,甚至还会带来明显的负面影响。
    • Ma et al. (2015) \text{Ma et al. (2015)} Ma et al. (2015) 研究了预训练对机器学习模型在化学活性预测上的影响。
    • 结果发现,平均而言预训练是有轻微负面影响的,但在有些问题上会有显著帮助。
    • 由于无监督预训练有时有效,但经常也会带来负面效果,因此很有必要了解它何时有效以及有效的原因,以确定它是否适合用于特定的任务。
  • 首先,要注意的是这个讨论大部分都是针对贪心无监督预训练而言。
    • 还有很多其他完全不同的方法使用半监督学习来训练神经网络,比如深度学习中的正则化技术 - 对抗训练篇介绍的虚拟对抗训练。
    • 我们还可以在训练监督模型的同时训练自编码器或生成模型。
    • 这种单阶段方法的例子包括判别 RBM \text{RBM} RBM ( Larochelle and Bengio, 2008a \text{Larochelle and Bengio, 2008a} Larochelle and Bengio, 2008a) 和梯形网络 ( Rasmus et al., 2015 \text{Rasmus et al., 2015} Rasmus et al., 2015),其中整体目标是两项之和(一个使用标签,另一个仅仅使用输入)。
  • 无监督预训练结合了两种不同的想法。
    • 第一,它利用了深度神经网络对初始参数的选择,可以对模型有着显著的正则化效果(在较小程度上,可以改进优化)的想法。
    • 第二,它利用了更一般的想法,学习输入分布有助于学习从输入到输出的映射。
  • 这两个想法都涉及到机器学习算法中多个未能完全理解的部分之间复杂的相互作用。
    • 第一个想法:深度神经网络初始参数的选择对其性能具有很强的正则化效果,是最不容易理解的。
      • 在预训练变得流行时,在一个位置初始化模型被认为会使其接近某一个局部极小点,而不是另一个局部极小点。
      • 如今,局部极小值不再被认为是神经网络优化中的严重问题。
      • 现在我们知道标准的神经网络训练过程通常不会到达任何形式的临界点。
      • 仍然可能的是,预训练会初始化模型到一个可能不会到达的位置——例如,某种区域,其中代价函数从一个样本点到另一个样本点变化很大, minibatch \text{minibatch} minibatch只能提供噪扰严重的梯度估计,或是某种区域中的 Hessian \text{Hessian} Hessian矩阵条件数是病态的,梯度下降必须使用非常小的步长。
      • 然而,我们很难准确判断监督学习期间预训练参数的哪些部分应该保留。
      • 这是现代方法通常同时使用无监督学习和监督学习,而不是依序使用两个学习阶段的原因之一。
      • 除去让监督学习阶段保持无监督学习阶段所提取信息的复杂方法,我们还可以简单地固定特征提取器的参数,仅仅将监督学习作为顶层特征的分类器。
    • 另一个想法:学习算法可以使用无监督阶段学习的信息,更好地执行监督学习阶段,已经被更加深刻地理解了。
      • 其基本想法是对于无监督任务有用的一些特征对于监督学习任务也可能是有用的。
      • 例如,如果我们训练汽车和摩托车图像的生成模型,它需要知道轮子的概念,以及一张图中应该有多少个轮子。
      • 如果我们幸运,已经知道轮子采取一种易于被监督学习获取的表示形式,那么这个任务会变得容易。
      • 然而还未能从数学、理论层面上证明,因此并不总是能够预测哪种任务能以这种形式从无监督学习中受益。
      • 这种方法的许多方面高度依赖于具体使用的模型。
      • 例如,如果我们希望为预训练的特征添加线性分类器,那么学习到的特征必须使潜在的类别是线性可分离的。
      • 这些性质通常自然地发生,但并非总是这样。
      • 这是另一个监督和无监督学习同时训练更可取的原因——输出层施加的约束很自然地从一开始就包括在内。
  • 从无监督预训练作为学习表示的角度来看,我们可以期望无监督预训练在初始表示较差的情况下更有效。一个重要的例子是词嵌入。
    • 使用 one-hot \text{one-hot} one-hot向量表示的词不是具有很多信息,因为任意两个不同的 one-hot \text{one-hot} one-hot向量之间的距离(平方 L 2 L^2 L2 距离都是 2 2 2 ) 都是相同的。
    • 学习到的词嵌入自然会用它们彼此之间的距离来编码词之间的相似性。
    • 因此, 无监督预训练在处理单词时特别有用。
    • 然而在处理图像时是不太有用的,可能是因为图像已经在一个很丰富的向量空间中,其中的距离只能提供低质量的相似性度量。
  • 从无监督预训练作为正则化项的角度来看,我们可以期望无监督预训练在有标签的样本数量非常小时很有帮助。
    • 因为无监督预训练添加的信息来源于无标签的数据,所以当无标签的样本的数量非常大时,我们也可以期望无监督预训练的效果最好。
    • 无监督预训练的大量无标签的样本和少量有标签的样本构成的半监督学习的优势特别明显。
    • 2011 2011 2011 年,无监督预训练赢得了两个国际迁移学习比赛 ( Mesnil et al., 2011; Goodfellow et al., 2011 \text{Mesnil et al., 2011; Goodfellow et al., 2011} Mesnil et al., 2011; Goodfellow et al., 2011)。
    • 在该设定中,目标任务中有标签的样本的数目很少(每类几个到几十个)。
    • 这些效果也出现在被 Paine et al. (2014) \text{Paine et al. (2014)} Paine et al. (2014) 仔细控制的实验中。
  • 还可能涉及到一些其他的因素。
    • 例如,当要学习的函数非常复杂时, 无监督预训练可能会非常有用。
    • 无监督学习不同于权重衰减这样的正则化项,它不偏向于学习一个简单的函数,而是学习对无监督学习任务有用的特征函数。
    • 如果真实的潜在函数是复杂的,并且由输入分布的规律塑造,那么无监督学习更适合作为正则化项。
  • 除了这些注意事项外,我们现在分析一些无监督预训练改善性能的成功示例,并解释这种改进发生的已知原因。
    • 无监督预训练通常用来改进分类器,并且从减少测试集误差的观点来看是很有意思的。
    • 然而,无监督预训练还有助于分类以外的任务,并且可以用于改进优化,而不仅仅只是作为正则化项。
    • 例如,它可以提高去噪自编码器的训练和测试重构误差 ( Hinton and Salakhutdinov, 2006 \text{Hinton and Salakhutdinov, 2006} Hinton and Salakhutdinov, 2006)。
  • Erhan et al. (2010) \text{Erhan et al. (2010)} Erhan et al. (2010) 进行了许多实验来解释无监督预训练的几个成功原因。
    • 对训练误差和测试误差的改进都可以解释为,无监督预训练将参数引入到了其它方法可能探索不到的区域。
    • 神经网络训练是非确定性的,并且每次运行都会收敛到不同的函数。
    • 训练可以停止在梯度很小的点;也可以提前终止结束训练,以防过拟合;还可以停止在梯度很大,但由于诸如随机性或 Hessian \text{Hessian} Hessian矩阵病态条件数等问题难以找到合适下降方向的点。
    • 经过无监督预训练的神经网络会一致地停止在一片相同的函数空间区域,但未经过预训练的神经网络会一致地停在另一个区域。
    • 图例1可视化了这种现象。
    • 经过预训练的网络到达的区域是较小的,这表明预训练减少了估计过程的方差,这进而又可以降低严重过拟合的风险。
    • 换言之,无监督预训练将神经网络参数初始化到它们不易逃逸的区域,并且遵循这种初始化的结果更加一致,和没有这种初始化相比,结果很差的可能性更低。
  • Erhan et al. (2010) \text{Erhan et al. (2010)} Erhan et al. (2010) 也回答了何时预训练效果最好——预训练的网络越深,测试误差的均值和方差下降得越多。值得注意的是,这些实验是在训练非常深层网络的现代方法发明和流行(整流线性单元, Dropout \text{Dropout} Dropout batch normalization \text{batch normalization} batch normalization)之前进行的,因此对于无监督预训练与当前方法的结合,我们所知甚少。
  • 一个重要的问题是无监督预训练是如何起到正则化项作用的。
    • 一个假设是,预训练鼓励学习算法发现那些与生成观察数据的潜在原因相关的特征。
    • 这也是除无监督预训练之外许多其他算法的重要思想的启发,将会在后续篇章:半监督解释因果关系中进一步讨论。
  • 与无监督学习的其他形式相比,无监督预训练的缺点是其使用了两个单独的训练阶段。很多正则化技术都具有一个优点,允许用户通过调整单一超参数的值来控制正则化的强度。
    • 无监督预训练没有一种明确的方法,调整无监督阶段正则化的强度。
    • 相反,无监督预训练有许多超参数,但其效果只能之后度量,通常难以提前预测。
    • 当我们同时执行无监督和监督学习而不使用预训练策略时,会有单个超参数(通常是附加到无监督代价函数的系数)控制无监督目标正则化监督模型的强度。减少该系数,总是能够可预测地获得较少正则化强度。
    • 在无监督预训练的情况下,没有一种灵活调整正则化强度的方式——要么监督模型初始化为预训练的参数,要么不是。
  • 具有两个单独的训练阶段的另一个缺点是每个阶段都具有自己的超参数。
    • 第二阶段的性能通常不能在第一阶段期间预测,因此在第一阶段提出超参数和第二阶段根据反馈来更新之间存在较长的延迟。
    • 最通用的方法是在监督阶段使用验证集上的误差来挑选预训练阶段的超参数,如 Larochelle et al. (2009) \text{Larochelle et al. (2009)} Larochelle et al. (2009) 中讨论的。
    • 在实际中,有些超参数,如预训练迭代的次数,很方便在预训练阶段设定,通过无监督目标上使用提前终止策略完成。
    • 这个策略并不理想,但是在计算上比使用监督目标代价小得多。
  • 如今,大部分算法已经不使用无监督预训练了,除了在自然语言处理领域中单词作为 one-hot \text{one-hot} one-hot向量的自然表示不能传达相似性信息,并且有非常多的无标签的数据集可用。
    • 在这种情况下,预训练的优点是可以对一个巨大的无标签的集合(例如用包含数十亿单词的语料库)进行预训练,学习良好的表示(通常是单词,但也可以是句子),然后使用该表示或细调它,这种方法适用于训练集样本很少的监督任务。
    • 这种方法由 Collobert and Weston (2008b) \text{Collobert and Weston (2008b)} Collobert and Weston (2008b) Turian et al. (2010) \text{Turian et al. (2010)} Turian et al. (2010) Collobert et al.(2011a) \text{Collobert et al.(2011a)} Collobert et al.(2011a) 开创,至今仍在使用。
  • 基于监督学习的深度学习技术,通过 Dropout \text{Dropout} Dropout batch normalization \text{batch normalization} batch normalization来正则化,能够在很多任务上达到人类级别的性能,但必须使用极大的有标签的数据集。
    • 在中等大小的数据集(例如 CIFAR-10 \text{CIFAR-10} CIFAR-10 MNIST \text{MNIST} MNIST,每个类大约有 5 , 000 5,000 5,000 个有标签的样本)上,这些技术的效果比无监督预训练更好。
    • 在极小的数据集,例如选择性剪接数据集,贝叶斯方法要优于基于无监督预训练的方法 ( Srivastava, 2013 \text{Srivastava, 2013} Srivastava, 2013)。
    • 由于这些原因, 无监督预训练已经不如以前流行。
    • 然而,无监督预训练仍然是深度学习研究历史上的一个重要里程碑,并将继续影响当代方法。
    • 预训练的想法已经推广到监督预训练 ( supervised pretraining \text{supervised pretraining} supervised pretraining),这将在深度模型中的优化 - 优化策略和元算法篇 - 监督预训练中讨论,在迁移学习中这是非常常用的方法。
    • 迁移学习中的监督预训练流行 ( Oquab et al., 2014; Yosinski et al., 2014 \text{Oquab et al., 2014; Yosinski et al., 2014} Oquab et al., 2014; Yosinski et al., 2014)于在 ImageNet \text{ImageNet} ImageNet数据集上使用卷积网络预训练。
    • 由于这个原因,实践者们公布了这些网络训练出的参数,就像自然语言任务公布预训练的单词向量一样 ( Collobert et al., 2011a; Mikolov et al., 2013a \text{Collobert et al., 2011a; Mikolov et al., 2013a} Collobert et al., 2011a; Mikolov et al., 2013a)。

  • 算法1:贪心逐层无监督预训练的协定

    • 给定如下:无监督特征学习算法 L \mathcal{L} L L \mathcal{L} L 使用训练集样本并返回编码器或特征函数 f f f
    • 原始输入数据是 X \boldsymbol{X} X,每行一个样本,并且 f ( 1 ) ( X ) f^{(1)}(\boldsymbol{X}) f(1)(X) 是第一阶段编码器关于 X \boldsymbol{X} X 的输出。
    • 在执行细调的情况下,我们使用学习者 T \mathcal{T} T ,并使用初始函数 f f f,输入样本 X \boldsymbol{X} X(以及在监督细调情况下关联的目标 Y \boldsymbol{Y} Y),并返回细调好函数。
    • 阶段数为 m m m
  • 算法1伪代码,如下:
    f ← 恒等函数 \quad f\gets 恒等函数 f恒等函数
    X ~ = X \quad\tilde{\boldsymbol{X}}=\boldsymbol{X} X~=X
    for \quad\textbf{for} for k = 1 , … , m k=1,\dots,m k=1,,m do \textbf{do} do
    f ( k ) = L ( X ~ ) \quad\quad f^{(k)} = \mathcal{L}(\tilde{\boldsymbol{X}}) f(k)=L(X~)
    f ← f ( k ) ∘ f \quad\quad f\gets f^{(k)} \circ f ff(k)f
    X ~ ← f ( k ) ( X ~ ) \quad\quad \tilde{\boldsymbol{X}}\gets f^{(k)}(\tilde{\boldsymbol{X}}) X~f(k)(X~)
    end \quad\textbf{end} end for \textbf{for} for
    if \quad \textbf{if} if f i n e fine fine- t u n i n g tuning tuning then \textbf{then} then
    f ← T ( f , X , Y ) \quad\quad f\gets \mathcal{T}(f,\boldsymbol{X},\boldsymbol{Y}) fT(f,X,Y)
    end \quad\textbf{end} end if \textbf{if} if
    Return \quad \textbf{Return} Return f f f


  • 图例1:在函数空间(并非参数空间,避免从参数向量到函数的多对一映射)不同神经网络的学习轨迹的非线性映射的可视化。
    • 在函数空间(并非参数空间,避免从参数向量到函数的多对一映射)不同神经网络的学习轨迹的非线性映射的可视化。
      在这里插入图片描述

    • 说明:

      • 不同网络采用不同的随机初始化,并且有的使用了无监督预训练,有的没有。
      • 每个点对应着训练过程中一个特定时间的神经网络。经 Erhan et al. (2010) \text{Erhan et al. (2010)} Erhan et al. (2010) 许可转载此图。
      • 函数空间中的坐标是关于每组输入 x \boldsymbol{x} x 和它的一个输出 y \boldsymbol{y} y 的无限维向量。
      • Erhan et al. (2010) \text{Erhan et al. (2010)} Erhan et al. (2010)将很多特定 x \boldsymbol{x} x y \boldsymbol{y} y 连接起来,线性投影到高维空间中。
      • 然后他们使用 Isomap \text{Isomap} Isomap ( Tenenbaum et al.,1 \text{Tenenbaum et al.,1} Tenenbaum et al.,1)进行进一步的非线性投影并投到二维空间。
      • 颜色表示时间。
      • 所有的网络初始化在上图的中心点附近(对应着输出 y \boldsymbol{y} y 近似是均匀分布的函数领域)。
      • 随着时间迁移,学习向外移动函数到预测得更好的点。
      • 当使用预训练时,训练会一致地收敛到同一个区域;而不使用预训练时,训练会收敛到其他不重叠的区域。
      • Isomap \text{Isomap} Isomap试图维持全局相对距离(体积因此也保持不变),因此使用预训练的模型对应的较小区域意味着,基于预训练的估计具有较小的方差。

总结

贪心逐层无监督预训练技术,作为深度学习发展历程中的一个重要里程碑,通过逐层提取数据的抽象特征,实现了对模型参数的初步优化。这一策略不仅解决了深度学习在训练初期因参数随机初始化而导致的局部最优问题,还显著提高了模型的收敛速度与泛化能力。随着技术的发展,虽然现在有更高效的训练算法如端到端的有监督学习,但贪心逐层无监督预训练的思想依然闪耀着智慧的光芒,为研究者们提供了宝贵的思路与启示。在未来的深度学习探索中,表示学习与贪心逐层无监督预训练的理念将继续指导我们前行,推动人工智能向更加智能、更加高效的方向迈进。

往期内容回顾

深度模型中的优化 - 优化策略和元算法篇
深度学习中的正则化技术 - 对抗训练篇

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

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

相关文章

leetcode第二十六题:删去有序数组的重复项

给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元素的数量为 k ,你…

Rasa对话模型——做一个语言助手

1、Rasa模型 1.1 模型介绍 Rasa是一个用于构建对话 AI 的开源框架,主要用于开发聊天机器人和语音助手。Rasa 提供了自然语言理解(NLU)和对话管理(DM)功能,使开发者能够创建智能、交互式的对话系统。 1.2…

Eclipse 工作空间

Eclipse 工作空间 Eclipse 工作空间(Workspace)是 Eclipse IDE 中一个核心概念,它指的是一个用于组织和存储开发项目及相关文件的目录。在 Eclipse 中,所有开发活动都是围绕工作空间展开的。本文将详细介绍 Eclipse 工作空间的概念、配置、使用方法,以及如何通过优化工作…

Apache Iceberg 数据类型参考表

Apache Iceberg 概述-链接 Apache Iceberg 数据类型参考表 数据类型描述实例方法注意事项BOOLEAN布尔类型,表示真或假true, false用于条件判断,例如 WHERE is_active true。确保逻辑条件的正确性。INTEGER32位有符号整数42, -7可用于计算、聚合&#xf…

【系统架构设计师】专题:中间件技术

更多内容请见: 备考系统架构设计师-核心总结目录 文章目录 一、中间件概述二、中间件特点三、中间件的分类四、中间件产品介绍一、中间件概述 中间件(middleware) 是基础软件的一大类,属于可复用软件的范畴。顾名思义,中间件处在操作系统、网络和数据库之上,应用软件的下层…

着色器ShaderMask

说明 实现一个渐变进度条,要求: 颜色渐变的过程是循序渐进的,而不是看起来像是将渐变条逐渐拉长了。 效果 源码 // 渐变进度条Stack(children: [// 背景色板Container(width: 300,height: 8,decoration: BoxDecoration(borderRadius: Bord…

vue2知识汇总

vue2.x 0. 参考文档 https://cn.vuejs.org/v2/api/https://cn.vuejs.org/v2/guide/1. 发展历程 2014.2 诞生 2015.10 vue1.0发布 2016.4 vue2.0发布预览版, 10月出正式版本 2020.4 vue3.0发布预览版 9.18正式版本2. 概述 声明式渲染 --- 组件系统 ---…

ollama 部署教程(window、linux)

目录 一、官网 二、安装方式一:window10版本下载 三、安装方式二:linux版本docker 四、 模型库 五、运行模型 六、API服务 七、python调用 ollama库调用 langchain调用 requests调用 aiohttp调用 八、模型添加方式 1.线上pull 2.导入 GGU…

Parallels Desktop 20 for Mac 推出:完美兼容 macOS Sequoia 与 Win11 24H2

Parallels Desktop 20 for Mac 近日正式发布,这一新版本不仅全面支持 macOS Sequoia 和 Windows 11 24H2,还在企业版中引入了一个全新的管理门户。新版本针对 Windows、macOS 和 Linux 虚拟机进行了多项改进,其中最引人注目的当属 Parallels …

【AI写作】介绍 Docker 的基本概念和优势,以及在应用程序开发中的实际应用

【AI写作】介绍 Docker 的基本概念和优势,以及在应用程序开发中的实际应用 浅浅的玩一下这个 AI 写作,本内容全为 AI 生成,仅为 AI 观点,无作者本人的观点。 Docker是一个开源的容器化平台,它可以轻松地将应用程序及…

C++编程语言:基础设施:源文件和程序(Bjarne Stroustrup)

第15章 源文件和程序 (Source Files and Programs) 目录 15.1 单独编译(Separate Compilation) 15.2 链接(Linkage) 15.2.1 文件局部名(File-Local Names) 15.2.2 头文件(Header Files) 15.2.3 一次定义原则(The One-Definition Rule) 15.2.4 标准库头文件 1…

基于YOLOv8+LSTM的商超扶梯场景下行人安全行为姿态检测识别

基于YOLOv8LSTM的商超扶梯场景下行人安全行为姿态检测识别 手扶电梯 行为识别 可检测有人正常行走,有人 跌倒,有人逆行三种行为 跌倒检测 电梯跌倒 扶梯跌倒 人体行为检测 YOLOv8LSTM。 基于YOLOv8LSTM的商超扶梯场景下行人安全行为姿态检测识别&#xf…

STM32上实现FFT算法精准测量正弦波信号的幅值、频率和相位差(标准库)

在研究声音、电力或任何形式的波形时,我们常常需要穿过表面看本质。FFT(快速傅里叶变换)就是这样一种强大的工具,它能够揭示隐藏在复杂信号背后的频率成分。本文将带你走进FFT的世界,了解它是如何将时域信号转化为频域…

力扣(leetcode)每日一题 815 公交路线 (图的宽度优先遍历变种)

815. 公交路线 - 力扣(LeetCode) 题干 给你一个数组 routes ,表示一系列公交线路,其中每个 routes[i] 表示一条公交线路,第 i 辆公交车将会在上面循环行驶。 例如,路线 routes[0] [1, 5, 7] 表示第 0 辆…

如何将Excel表格嵌入Web网页在线预览、编辑并保存到自己服务器上?

猿大师办公助手作为一款专业级的网页编辑Office方案,不仅可以把微软Office、金山WPS和永中Office的Word文档内嵌到浏览器网页中实现在线预览、编辑保存等操作,还可以把微软Office、金山WPS和永中Office的Excel表格实现网页中在线预览、编辑并保存到服务器…

python中ocr图片文字识别样例(二)

一、说明 本次解决图片相关出现中文乱码问题,属于上篇文章的优化,前提条件依赖上篇文章的包,当然ocr的具体应用场景很多,根据自身需求进行调整 二、具体实现 2.1 代码实现: # -*- coding: utf-8 -*- import easyoc…

3.《DevOps》系列K8S部署CICD流水线之部署MetalLB负载均衡器和Helm部署Ingress-Nginx

架构 服务器IP服务名称硬件配置192.168.1.100k8s-master8核、16G、120G192.168.1.101k8s-node18核、16G、120G192.168.1.102k8s-node28核、16G、120G192.168.1.103nfs2核、4G、500G操作系统:Rocky9.3 后续通过K8S部署GitLab、Harbor、Jenkins 为什么使用MetalLB 当使用云平…

内网穿透软件有哪些?

目录 神卓互联 花生壳 FRP Ngrok Cpolar Lanproxy 小蚂蚁 内网穿透软件是帮助用户实现从外部网络访问内部网络资源的工具,这对于远程办公、网络调试、私有项目展示等方面非常有用。以下是一些常用的内网穿透软件: 神卓互联 神卓互联&#xff1a…

【Nginx】Nginx 监控详解

目录 一、Nginx 监控的重要性二、Nginx 监控的方法2.1 使用 Nginx 自带的状态模块2.2 使用日志分析2.3 监控工具 三、监控指标四、可能出现的情况及处理4.1 高负载4.2 错误日志增多4.3 资源瓶颈 总结 Nginx 是一个高性能的 HTTP 服务器和反向代理服务器,广泛应用于现…

在vue中:style 的几种使用方式

在日常开发中:style的使用也是比较常见的&#xff1a; 亲测有效 1.最通用的写法 <p :style"{fontFamily:arr.conFontFamily,color:arr.conFontColor,backgroundColor:arr.conBgColor}">{{con.title}}</p> 2.三元表达式 <a :style"{height:…