深度学习——常用激活函数解析与对比

1、 简介

在神经网络中,激活函数扮演着至关重要的角色。它们的主要目的是引入非线性因素,使得网络能够学习和表示更加复杂的函数映射。以下是激活函数应具备的特点,以及这些特点为何重要的详细解释:

  1. 引入非线性有助于优化网络
    非线性激活函数是神经网络能够解决非线性问题的关键。如果没有非线性激活函数,无论神经网络有多少层,最终都相当于一个线性模型,这大大限制了网络的表达能力。非线性激活函数使得神经网络可以通过叠加多个非线性层来学习复杂的数据分布和模式。例如,ReLU(Rectified Linear Unit)激活函数通过将所有负值置为零,引入了非线性,同时保持了计算的简单性。

  2. 不要过度增加计算成本
    激活函数需要在每次前向传播和反向传播时被计算,因此它们应该尽可能简单,以避免不必要的计算开销。复杂的激活函数可能会导致计算成本显著增加,从而影响网络的训练效率。例如,Sigmoid函数虽然引入了非线性,但其计算成本相对较高,并且在反向传播时可能导致梯度消失问题,因此在现代神经网络中使用较少。

  3. 不妨碍梯度流动
    梯度流动是神经网络训练中的核心机制,它允许网络通过调整权重来最小化损失函数。如果激活函数导致梯度消失(例如,梯度接近于零),那么网络将难以学习。理想的激活函数应该能够保持梯度的流动,使得网络在训练过程中能够有效地学习。ReLU激活函数在这方面表现良好,因为它的梯度在正区间是恒定的,从而避免了梯度消失问题。

  4. 保持数据分布
    激活函数还应该有助于保持数据的分布特性,使得网络能够更好地学习数据的内在结构。例如,某些激活函数可能会使得输出数据分布变得不均匀,这可能会影响网络的泛化能力。而像Leaky ReLU或Parametric ReLU(PReLU)这样的激活函数,通过允许一小部分负梯度流动,可以在一定程度上保持数据分布的多样性。

2. 激活函数的演变

线性函数 y = c x y = cx y=cx(其中 c c c 是一个常数)是一种非常基础的激活函数。当 c = 1 c = 1 c=1 时,它简化为身份函数,即 y = x y = x y=x,这个函数仅仅将输入 x x x 直接传递到输出 y y y,不进行任何变换。

2.1.对数西格玛双曲切线系列

L o g i s t i c S i g m o i d ( x ) = 1 1 + e − x {\mathrm{Logistic~Sigmoid}}\left(x\right)={\frac{1}{1+e^{-x}}} Logistic Sigmoid(x)=1+ex1
T a n h ( x ) = e x − e − x e x + e − x \mathrm{Tanh}(x)=\frac{e^{x}-e^{-x}}{e^{x}+e^{-x}} Tanh(x)=ex+exexex
以上两个函数是早期流行的非线性激活函数,其灵感来自于生物意义上的神经元(注意:生物神经元遵守全有或全无的定律,所以它们的输出只有0或1,中间没有任何东西)。Logistic Sigmoid将输出限制在[0,1],但输出相对于输入的大小变化不大(饱和的输出),造成梯度损失。它也不适合于优化,因为输出不是以零为中心的。

相比之下,Tanh(x)是0中心的,其输出为[−1,1];然而,梯度消失的问题仍未解决[−1,1].

2.2. ReLU系列

整流线性单元(ReLU)由于其简单性和改进的性能,已经成为激活函数的最先进(最高质量、最高性能、SOTA)。


R e L U ( x ) = m a x ( 0 , x ) = { ⁣ ⁣ x , i f x ≥ 0 0 , o t h e r w i s e \mathrm{ReLU}(x)=\mathrm{max}(0,x)=\left\{\!\!\begin{array}{l l}{{x,}}&{{\mathrm{if}\;x\geq0}}\\ {{0,}}&{{\mathrm{otherwise}}}\end{array}\right. ReLU(x)=max(0,x)={x,0,ifx0otherwise
然而,ReLU有一个负值投入利用不足(under-utilisation)的问题。

2.3. 指数单位系列

Logistic Sigmoid和Tanh的问题是饱和输出,即对于从无限小到无限大的输入范围来说,输出的狭窄性([0,1]),加上ReLU不能很好地利用负输入。这就是指数线性单元(ELU)被发现的地方。


在这里插入图片描述

2.4.学习和适应系统

到目前为止,提到的Sigmoid、Tanh、ReLU和ELU系统的激活函数都是人工设计的,可以说,可能没有充分提取数据的复杂性。

APL(x)=max(0,x)+S∑s=1asimax(0,−x+bsi)

在APL中,ai和bi是学习参数,激活函数本身也会发生变化(注意:S=3和S=4的图看起来是一样的,但仔细观察它们是不同的)。

2.5. 其他。

现在已经提出了许多其他激活函数,包括Softplus函数、随机函数、多项式函数、核函数等等。.

上表总结了这些优点和缺点,从左到右的项目是:梯度损失、非线性、优化困难、缺乏适应性和计算成本。下表总结了该系统的优点和缺点。

3.基于Logistic Sigmoid/Tanh的激活函数。

针对operatornameTanh(x) 的狭窄输出范围和梯度消失问题,提出了一个缩放的双曲切线(sTanh)。

o p e r a t o r n a m e s T a n h ( x ) = A × o p e r a t o r n a m e T a n h ( B × x ) operatornamesTanh(x)=A×operatornameTanh(B×x) operatornamesTanh(x)=A×operatornameTanh(B×x)

提出了参数化的sigmoid函数是一个可微调的、连续的有界函数。
o p e r a t o r m e P S F ( x ) = ( 1 1 + e x p ( − x ) ) m o p e r a t o r m e P S F(x)=(\frac{1}{1+e x p(-x)})^{m} operatormePSF(x)=(1+exp(x)1)m
同样,有人提出了移位的对数西格玛和整流的双曲正割,但输出饱和和梯度消失的问题仍然存在。提出了按比例的sigmoid和惩罚的Tanh,但梯度消失是不可避免的。

后来,有人提出了一种叫做噪声激活函数的方法,即给激活函数一个随机数以改善梯度流动,成功地处理了饱和输出问题。Hexpo函数也解决了大部分的梯度消失问题。
H e x p o ( x ) = { − a × ( e − x / b − 1 ) , x ≥ 0 c × ( e x / d − 1 ) , x < 0 \mathrm{Hexpo}(x)=\left\{\begin{array}{l l}{{-a\times\left(e^{-x/b}-1\right),}}&{{x\geq0}}\\ {{c\times\left(e^{x/d}-1\right),}}&{{x\lt 0}}\end{array}\right. Hexpo(x)={a×(ex/b1),c×(ex/d1),x0x<0

同时提出了sigmoid加权线性单元(SiLU)和改进的logistic sigmoid(ISigmoid),并解决了饱和输出和梯度消失问题。这同样适用于线性缩放双曲切线(LiSHT)、艾略特和软根信号(SRS)。

Sigmoid/Tanh系统中的许多激活函数都试图克服梯度消失问题,但在许多情况下,这个问题并没有得到完全解决。

4. 整流的激活功能

整流线性单元(ReLU)是一个简单的函数,对于正的输入,它输出一个恒定的函数,对于负的输入,输出为零(输入为零时,输出也为零)。
R e L U ( x ) = { x , i f x ≥ 0 0 , o t h e r w i s e {\mathrm{ReLU}}(x)={\left\{\begin{array}{l l}{x,}&{{\mathrm{if~}}x\geq0}\\ {0,}&{{\mathrm{otherwise}}}\end{array}\right.} ReLU(x)={x,0,if x0otherwise

因此,导数值只能是1(正输入)或0(负输入),所以Leaky ReLU(LReLU)被修改为对负输入返回一个小值而不是0。Leaky ReLU (LReLU)已被修改为对负输入返回一个小值而不是0。
L R e L U ( x ) = { x , x ≥ 0 0.01 × x , x < 0 {\mathrm{LReLU}}(x)={\left\{\begin{array}{l l}{x,}&{x\geq0}\\ {0.01\times x,}&{x\lt 0}\end{array}\right.} LReLU(x)={x,0.01×x,x0x<0
然而,LReLU的问题是它不知道0.01是否是正确的系数,而参数ReLU(PReLU)通过学习系数避免了这个问题。
P R e L U ( x ) = { x , x ≥ 0 p × x , x < 0 {\mathrm{PReLU}}(x)={\left\{\begin{array}{l l}{x,}&{x\geq0}\\ {p\times x,}&{x\lt 0}\end{array}\right.} PReLU(x)={x,p×x,x0x<0
然而,PReLU的缺点是容易出现过度学习。
R R e L U ( x ) = { x , x ≥ 0 R × x , x < 0 \mathrm{RReLU}(x)=\left\{\begin{array}{l l}{{x,}}&{{x\geq0}}\\ {{R\times x,}}&{{x\lt 0}}\end{array}\right. RReLU(x)={x,R×x,x0x<0
随机化ReLU(RReLU)是一种随机选择系数的方法。

(注:系数非常小,几乎是重叠的)

已经提出了ReLU的各种其他变种。

5. 指数激活函数

指数系统的激活函数解决了ReLU中的梯度消失问题。
E L U ( x ) = { ⁣ ⁣ x , i f x > 0 α × ( e x − 1 ) , o t h e r w i s e ⁣ ⁣ \mathrm{ELU(x)}=\left\{\!\!\begin{array}{c c}{{x,}}&{{\mathrm{if}\,x\gt 0}}\\ {{\alpha\times\left(e^{x}-1\right),}}&{{\mathrm{otherwise}}}\end{array}\!\!\right. ELU(x)={x,α×(ex1),ifx>0otherwise
ELU对于大的、可微分的、负的输入是饱和的,这使得它们比Leaky ReLU和Parametric ReLU对噪声更稳健。
S E L U ( x ) = λ × { x , α × ( e x − 1 ) , x ≤ 0 x > 0 \mathrm{SELU}(x)=\lambda\times\left\{{x,\atop\alpha\times(e^{x}-1)\,,}\,{\overset{x\gt 0}{x\leq0}}\right. SELU(x)=λ×{α×(ex1),x,x0x>0

(注意:在x>0的区域,蓝色和红色的颜色是重叠的。)

缩放ELU(SELU)使用超参数进行缩放,这样它们就不会对巨大的正向输入产生饱和。

上文总结了ELU的变体;在所有ELU中,都考虑了大数值的饱和和应对计算成本的问题。

6.学习/适应性激活函数

上述的许多激活是不适应的。
o p e r a t o r n a m e A P L ( x ) = max ⁡ ( 0 , x ) + ∑ s = 1 S a s × max ⁡ ( 0 , b s − x ) o p e r a t o r n a m e A P L(x)=\operatorname*{max}(0,x)+\sum_{s=1}^{S}a_{s}\times\operatorname*{max}\left(0,b_{s}-x\right) operatornameAPL(x)=max(0,x)+s=1Sas×max(0,bsx)
自适应分片线性(ALP)是一个铰链形(铰链,线图)激活函数,其中a和b是可学习的参数和S是代表铰链数量的超参数,即每个神经元有不同的a和b值,意味着每个神经元有自己的激活函数S是一个超参数,代表铰链的数量。

Swish是由Ramachandran等人提出的,并通过自动搜索找到。
o p e r a t o r n a m e S w i s h ( x ) = x × σ ( b e t a × x ) o p e r a t o r n a m e{S w i s h}(x)=x\times\sigma(b e t a\times x) operatornameSwish(x)=x×σ(beta×x)
sigma是一个sigmoidal函数;Swish被做成类似ReLU的形式。

后来Swish被扩展到ESwish。
o p e r a t o r n a m e E S w i s h ( x ) = b e t a × x × σ ( x ) o p e r a t o r n a m e E S w i s h(x)=b e t a\times x\times\sigma(x) operatornameESwish(x)=beta×x×σ(x)

(注意:/beta=1.0与Swish和ESwish相匹配,所以/beta的值分别是不相连的。它们看起来仍然非常相似)

学习和适应性激活函数的定义是有一个基础激活函数,并向其添加可学习变量。例如,上述使用参数ReLU和参数ELU的自适应激活函数有 σ ( w × x ) × P R e L U ( x ) + ( 1 − σ ( w × x ) ) × \sigma(w\times x)\times\mathrm{PReLU}({\bf x})+(1-\sigma(w\times x))\times σ(w×x)×PReLU(x)+(1σ(w×x))×有些定义为PELU(x)(σ是一个S型函数,其中w是一个可学习的变量)。

另外,每个神经元可以利用不同的激活函数。这并不意味着每个神经元由于可学习变量的不同值而使用不同的激活函数,而是字面上的不同激活函数。在一些研究中,每个神经元在ReLU和Tanh之间进行选择,并自己学习选择。

不使用可学习的超参数的非参数学习自动调节系统(non-parametrically learning AFs)也有报道,其中激活函数本身是一个非常浅的神经网络,而不是如上所述的可以写成单一公式的激活函数。这被称为超激活功能(hyperactivations),网络被称为超网络。

学习和自适应激活函数是最近的一个趋势。人们正在研究它们以应对更复杂和非线性的数据,但计算成本自然也在增加。下表总结了学习和适应性激活函数。

7.其他激活函数

7.1. Softplus激活函数

Softplus函数是在2001年提出的,在统计学中经常使用。

o p e r a t o r m e s o f t p l u s ( x ) = log ⁡ ( e x + 1 ) o p e r a t o r m e s o f t p l u s(x)=\log\left(e^{x}+1\right) operatormesoftplus(x)=log(ex+1)

随后,深度学习的大行其道导致了Softmax函数的频繁使用,因为它们可以在分类任务中为每个类别输出概率值,所以具有很大的吸引力。

由于Softplus是平滑和可微分的,它类似于ReLU,也就是Softplus线性单元(SLU)。

S L U ( x ) = { α × x , x > 0 β × log ⁡ ( e x + 1 ) − γ , x ≤ 0 \mathrm{SLU}(x)=\left\{\begin{array}{l l}{{\alpha\times x,}}&{{x\gt 0}}\\ {{\beta\times\log\left(e^{x}+1\right)-\gamma,}}&{{x\leq0}}\end{array}\right. SLU(x)={α×x,β×log(ex+1)γ,x>0x0

alpha,β,γ是可训练的参数。

被称为Mish的激活函数是一个非单调的激活函数,同样使用Softplus。

T a n h ( x ) = e x − e − x e x + e − x \mathrm{Tanh}(x)={\frac{e^{x}-e^{-x}}{e^{x}+e^{-x}}} Tanh(x)=ex+exexex
M i s h ( x ) = x × T a n h ( S o f t p l u s ( x ) ) \mathrm{Mish}(x)=x\times\mathrm{Tanh}(\mathrm{Softplus}({\bf x})) Mish(x)=x×Tanh(Softplus(x))
Mish是平滑的和非单调的。它最近被用于YOLOv4中。然而,它在计算上很复杂,而且有计算成本高的缺点。

7.2. 随机激活函数

随机激活函数由于其麻烦而没有得到很好的研究;RReLU、EReLU、RTReLU和GELU是这一类中为数不多的激活函数;GELU(高斯误差线性单元)通过随机正则化考虑到了非线性问题。GELU(高斯误差线性单元)通过随机正则化考虑到了非线性问题。

o p e r a t o r n a m e G E L U ( x ) = x P ( X / l e q x ) = x P h i ( x ) o p e r a t o r n a m e{G E L}U(x)=x P(X/l e q x)=x P h i(x) operatornameGELU(x)=xP(X/leqx)=xPhi(x)

Φ被定义为 P h i ( x ) × I x + ( 1 − Φ ( x ) ) × 0 x = x Φ ( x ) P h i(x)\times I x+(1-\Phi(x))\times0x=x\Phi(x) Phi(x)×Ix+(1Φ(x))×0x=xΦ(x),这被称为随机正则化。

7.3. 多项式激活函数

平滑自适应激活函数(SAAF)被开发为一个片状多项式激活函数,结合了与ReLU的线性部分对称的两个功率函数。

SAFF ⁡ ( x ) = ∑ j = 0 c − 1 v j ′ m a t h r m p j ( x ) + ∑ k = 1 n w k ′ m a t h r m b k c ( x ) \operatorname{SAFF}(x)=\sum_{j=0}^{c-1}v_{j}{}^{\prime}m a t h r m p^{j}(x)+\sum_{k=1}^{n}w_{k}{}^{\prime}m a t h r m\,b_{k}^{c}(x) SAFF(x)=j=0c1vjmathrmpj(x)+k=1nwkmathrmbkc(x)

ReLU也被扩展为整流动力单元(RePU), y = X S y=X^S y=XS在x>0部分(S是一个超参数)。RePU在x=0附近比ReLU更平滑。然而,易受梯度消失、无界和不对称的影响也是RePU的缺点。

近年来,利用Padé近似方法开发了Padé激活单元(PAU)。

o p e r a t o r m e P A U ( x ) = P ( x ) / Q ( x ) o p e r a t o r m e P A U(x)=P(x)/Q(x) operatormePAU(x)=P(x)/Q(x)

PAU的定义如上,其中P(x)和Q(x)分别为度数为m和n的多项式,基本上是手工设计的。

原始出版物对它的定义如上。

8.每个激活函数的性能比较。

上表列出了已经报道过的已经实现SOTA的激活函数。迄今为止,所描述的那些人中有Padé激活单元(MNIST on VGG8)和Swish(CIFAR10和CIFAR100 on MobileNet and ResNet)。数据集有图像、时间序列、文本等,但除了Swish之外,没有相同的激活函数在不同的数据集上实现SOTA。

在CNN上进行的实验。

这些模型是在实践中实施和比较的,而不是在纸上。该数据集是CIFAR10。

虽然数据集是通用的,但可以看出,随着模型的变化,适当的激活函数也在变化。

以上是将数据集改为CIFAR100的结果:对于MobileNet、VGG16和GoogleNet,表现最好的激活函数与CIFAR10相同,但对于ResNet50、SENet18和DenseNet121,结果有所改变(尽管在CIFAR10中表现最好的激活函数仍然表现良好)。

图中显示了每个模型的损失。激活函数是通过颜色来区分的。在图表的图例中,似乎如果激活函数低于ReLU,那么随着时间的推移,损失可以接近于零。因此,让我们比较一下100个历时所需的时间。

PDELU是唯一一个花了非常长的时间的人。

P D E L U ( x ) = { x , x > 0 α × ( [ 1 + ( 1 − t ) × x ] 1 1 − t − 1 ) , x ≤ 0 \mathrm{PDELU}(x)=\left\{{\begin{array}{l l}{x,}&{x\gt 0}\\ {\alpha\times\left(\left[1+(1-t)\times x\right]\frac{1}{1-t}-1\right),}&{x\leq0}\end{array}}\right. PDELU(x)={x,α×([1+(1t)×x]1t11),x>0x0

注:对于PDELU来说,原始出版物不是公开的,而且变量t的含义也未被证实。

9.结论

在深度学习中,选择合适的激活函数对于构建有效的神经网络模型至关重要。通过广泛的研究和实验,可以得出一些关于激活函数选择的结论和建议:

  1. 非零均值和梯度消失问题的进展
    对于logistic-sigmoidal和双曲切数(tanh)系列的激活函数,虽然已经取得了一些进展,例如通过引入非零均值来缓解梯度消失问题,但这些改进往往会增加计算成本。因此,在实际应用中需要权衡性能提升与计算成本之间的关系。

  2. ReLU系列的优势
    ReLU(Rectified Linear Unit)及其变体(如Leaky ReLU和Parametric ReLU)因其简单性和效率而广受欢迎。ReLU在大多数情况下表现良好,尤其是在处理负输入时避免了梯度消失问题。因此,ReLU及其变体通常是研究人员的首选。

  3. 指数系列的局限性
    指数系列的激活函数主要关注负输入的处理。然而,它们在实际应用中的表现并不总是令人满意,可能存在不平滑的问题,这可能会影响模型的训练和泛化能力。

  4. 学习和适应系列的挑战
    虽然学习和适应系列的激活函数是一个新兴趋势,但在设置基础函数和参数数量方面存在挑战。这些激活函数需要更多的研究和实验来确定它们在不同场景下的有效性。

  • 为了减少学习时间,可以选择输出平均值为零的激活函数,并确保它能够有效利用正负输入。
  • 选择与数据复杂性相匹配的模型至关重要。激活函数是连接数据复杂性和模型表达能力的关键,如果两者不匹配,可能会导致过拟合或欠拟合。
  • 对于卷积神经网络(CNN),应避免使用logistic-sigmoidal hyperbolic tangent系列的激活函数,而它们在循环神经网络(RNN)中可能更有用。
  • 对于VGG16和GoogleNet等模型,可以考虑使用ReLU、Mish(Mixture of Softmax and Hyperbolic Tangent)和PDELU(Parametric Dual Exponential Linear Unit)等激活函数。
  • 在具有残差连接的模型中,可以使用ReLU、LReLU(Leaky ReLU)、ELU(Exponential Linear Unit)、GELU(Gaussian Error Linear Unit)、CELU(Cubic Exponential Linear Unit)和PDELU等激活函数。
  • 参数化激活函数通常能够更快地与数据拟合,特别是PAU(Parametric Adaptive Unit)、PReLU和PDELU。
  • PDELU和SRS(Sigmoid ReLU)可能需要更长的学习时间。
  • 当训练时间有限时,ReLU、SELU(Scale Exponential Linear Unit)、GELU和Softplus可能无法达到最佳性能。
  • 指数系列的激活函数更有可能有效地利用负输入。
  • 对于自然语言处理任务,Tanh、SELU可能是不错的选择;而PReLU、LiSHT(Leaky Sigmoid Hyperbolic Tangent)、SRS和PAU也表现良好。
  • 对于语音识别任务,PReLU、GELU、Swish、Mish和PAU被认为表现良好。

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

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

相关文章

【Ant-Desgin-React 步骤条】步骤条配合组件使用

步骤条配合组件使用 基础使用多分组进度 基础使用 /* eslint-disable no-unused-vars */ import React, { useState } from react import { Button, message, Steps, theme } from antd import After from ./components/after import Now from ./components/now const steps …

Docker 安装 Mongo

创建宿主机目录 在你的宿主机上创建必要的目录来存储 MongoDB 的数据和配置文件。这样做可以保证即使容器被删除&#xff0c;数据也能得到保留。 mkdir -p /develop/mongo/data mkdir -p /develop/mongo/config创建 MongoDB 配置文件 创建一个名为 mongod.conf 的 MongoDB 配…

RestfulApi RestTemplate代码规范介绍

1.介绍 1.1 RestfulApi Restful API 是一种设计风格&#xff0c;代表了使用 HTTP 协议构建 web 服务的一种架构原则。REST&#xff08;Representational State Transfer&#xff09;的核心思想是&#xff0c;通过 URL 定位资源&#xff0c;使用 HTTP 方法&#xff08;GET, POS…

MySQL多版本并发控制mvcc原理浅析

文章目录 1.mvcc简介1.1mvcc定义1.2mvcc解决的问题1.3当前读与快照读 2.mvcc原理2.1隐藏字段2.2版本链2.3ReadView2.4读视图生成原则 3.rc和rr隔离级别下mvcc的不同 1.mvcc简介 1.1mvcc定义 mvcc(Multi Version Concurrency Control)&#xff0c;多版本并发控制&#xff0c;是…

golang学习笔记(defer基础知识)

什么是defer defer语句用于golang程序中延迟函数的调用&#xff0c; 每次defer都会把一个函数压入栈中&#xff0c; 函数返回前再把延迟的函数取出并执行。 为了方便描述&#xff0c; 我们把创建defer的函数称为主函数&#xff0c; defer语句后面的函数称为延迟函数。延迟函数…

npm常用的命令大全(2024-04-21)

nodejs中npm常见的命令 npm主要是node包管理和发布的工具。 npm官网网址&#xff1a;npm | Homehttps://www.npmjs.com/官网英文文档&#xff1a; npm DocsDocumentation for the npm registry, website, and command-line interfacehttps://docs.npmjs.com/about-npm官网中文文…

同城便民信息小程序源码系统:相亲交友+拼车顺风车功能 带完整的安装代码包以及搭建教程

在信息化、数字化的时代&#xff0c;人们的生活越来越离不开各种智能应用。其中&#xff0c;小程序作为一种轻量级、便捷的应用形式&#xff0c;正逐渐渗透到我们日常生活的方方面面。今天&#xff0c;我们要介绍的这款“智慧同城便民信息小程序源码系统”&#xff0c;不仅集成…

每日一题:跳跃游戏II

给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j < nums[i] i j < n 返回到达 nums[n - 1] 的最…

CAS机制(Compare And Swap)源码解读与三大问题

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java源码解读-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 目录 1. 前言 2. 原子性问题 3. 乐观锁与悲观锁 4. CAS操作 5. CAS算法带来的…

西米支付:支付行业中,“清算、结算、清结算”之间的区别

做支付最头疼的三个词莫过于“清算、结算、清结算”&#xff0c; 傻傻分不清&#xff0c;偶尔清晰偶尔混沌&#xff0c;有时候吧觉得自己很清晰了&#xff0c;突然跟别人聊天或者看书、看文章时又觉得糊涂起来了&#xff0c;在一些场景里好像很清晰&#xff0c;但是到了另一些…

几种免费SSL证书申请方式

目录 DV单域名免费证书的获取渠道&#xff1a; DV多域名免费证书获取渠道&#xff1a; DV通配符免费证书获取渠道&#xff1a; 随着现在网络安全意识的逐渐提升&#xff0c;越来越多的网站都在相继配对部署SSL证书&#xff0c;用以实现https访问。 大家都知道SSL证书好&…

数据分析学习资源(未完)

1、PDF 数据分析自学攻略 增长黑客&#xff08;AARRR&#xff09; 量化思维

C++ | Leetcode C++题解之第47题全排列II

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<vector<int>> permuteUnique(vector<int>& nums) {dfs(nums, 0);return res;} private:vector<vector<int>> res;void dfs(vector<int> nums, int x) {if (x num…

冯喜运:【涨久必跌】4.25外汇黄金原油走势分析

【黄金消息面解析】&#xff1a;周三(4月24日)黄金在创下近两年来最大单日跌幅后&#xff0c;持续走低。由于投资者关注缓解中东紧张局势&#xff0c;并有迹象表明美联储将在更长时间内维持较高利率&#xff0c;自2月中旬以来&#xff0c;金价仍上涨约15%&#xff0c;尽管有迹象…

软考-系统集成项目管理中级--信息(文档)和配置管理

本章历年考题分值统计(16年11月及以后按新教材考的) 本章重点常考知识点汇总清单(学握部分可直接理解记忆) 本章历年考题及答案解析 12、2018 年下半年第 14题 关于配置管理&#xff0c;不正确的是(14) A、配置管理计划制定时需了解组织结构环境和组织单元之间的联系 B、配置…

华为 2024 届实习校园招聘-硬件通⽤/单板开发——第九套

华为 2024 届实习校园招聘-硬件通⽤/单板开发——第九套 部分题目分享&#xff0c;完整版带答案(有答案和解析&#xff0c;答案非官方&#xff0c;未仔细校正&#xff0c;仅供参考&#xff09;&#xff08;共十套&#xff09;获取&#xff08;WX:didadidadidida313&#xff0c…

DelphiWebMVC对VUE导出包的支持

MVC框架除了本身对html文件的渲染输出&#xff0c;先开始对Hbuilder或VSCode 开发的VUE项目的导出包&#xff0c;开始支持导出包的部署。 这是一个Hbuilder 的vue 项目&#xff0c;导出包为&#xff1a; 这是一个DelphiWeb项目&#xff0c; 这是DelphiWeb项目的运行目录&#x…

FloodFill算法---DFS

目录 floodfill算法概念&#xff1a; 算法模板套路&#xff1a; 例题1&#xff1a;图像渲染 例题2&#xff1a;岛屿数量 例题3&#xff1a;岛屿的最大面积 例题4&#xff1a;被围绕的区域 floodfill算法概念&#xff1a; floodfill算法是一种常用的图像处理算法&#xf…

高速AI光模块–通往400G/800G及更高速率

人工智能&#xff08;AI&#xff09;领域对高速数据传输的需求推动了光学技术取得显著进步。本文探讨了实现400G/800G速率的演进历程并展望这些技术在未来能够提供更强大功能。我们深入研究高速400G/800G AI光模块的需求、演变和重要性&#xff0c;展现它们对各个行业的变革性影…

Python 在windows环境下加密文件成.pyd格式

首先 pip install easycython然后打开在要加密的文件同一目录下cmd命令框&#xff0c;命令行里键入 easycython 你要加密的文件.py 最后会在目录下看见有个.pyd的文件&#xff0c;只保留这个文件&#xff0c;剩下的都删了&#xff0c;其他引用该文件的python文件该咋用咋用。…