深度学习杂乱知识

news2024/10/23 14:15:44

阿达玛乘积(Hadamard Product)详解

1. 定义:

阿达玛乘积(Hadamard Product),又称为元素乘积逐元素乘积,是指对两个维度相同的矩阵进行逐元素相乘的操作。

假设我们有两个维度相同的矩阵 ( A ) 和 ( B ),它们的阿达玛乘积 ( A \circ B ) 是一个新矩阵 ( C ),其中:
[
C_{ij} = A_{ij} \cdot B_{ij}
]
即矩阵 ( A ) 和 ( B ) 对应位置的元素直接相乘,生成一个新的矩阵 ( C )。

2. 计算例子:

假设有两个 2x2 的矩阵:
[
A = \begin{pmatrix} 1 & 2 \ 3 & 4 \end{pmatrix}, \quad B = \begin{pmatrix} 5 & 6 \ 7 & 8 \end{pmatrix}
]
它们的阿达玛乘积为:
[
A \circ B = \begin{pmatrix} 1 \cdot 5 & 2 \cdot 6 \ 3 \cdot 7 & 4 \cdot 8 \end{pmatrix} = \begin{pmatrix} 5 & 12 \ 21 & 32 \end{pmatrix}
]
这种操作与普通的矩阵乘法不同,它没有进行行与列的线性组合,而是逐元素的相乘。


阿达玛乘积的几何意义

阿达玛乘积的几何意义并不如普通的矩阵乘法那样直观。普通的矩阵乘法涉及向量间的线性组合,可以实现诸如旋转、缩放等全局的线性变换,而阿达玛乘积只是逐元素的相乘,意味着它更多是一种局部的元素级别操作

  • 逐元素缩放: 如果我们将矩阵视作高维空间中的向量组,每个元素代表一个特定维度的坐标,那么阿达玛乘积可以看作是在每个维度上独立缩放对应位置的元素。它不会改变整个矩阵的结构,只是在每个位置上通过对应的元素进行缩放。

  • 局部交互: 阿达玛乘积反映了两个矩阵在每个元素上的局部交互,而不是整体的几何变换。这种局部操作在很多应用中,尤其是在处理逐元素计算时非常有用。


阿达玛乘积在机器学习中的意义

阿达玛乘积在机器学习领域,尤其是深度学习中,具有广泛的应用。以下是几个关键场景:

1. 逐元素操作:

在神经网络中,很多操作是逐元素进行的,阿达玛乘积为此类操作提供了极大的便利。例如,在神经网络的前向传播反向传播中,激活函数的输出往往需要逐元素与权重或梯度相乘。

2. 权重控制:

阿达玛乘积用于实现权重矩阵的元素级别控制,例如在一些正则化方法(如 Dropout)中,它用于逐元素调整权重,帮助控制过拟合现象。在这种情况下,阿达玛乘积可以帮助网络以更精细的方式控制不同权重的更新。

3. 特征交互与协方差:

阿达玛乘积在计算协方差矩阵或处理高维数据的特征交互时非常有用。在许多机器学习任务中,我们需要逐元素地计算不同特征之间的关系,阿达玛乘积可以有效减少计算复杂度。

4. 注意力机制:

注意力机制中,阿达玛乘积用于对特定维度的权重进行调整,使得模型能够更加关注输入中的重要信息。例如,在自注意力机制中,通过阿达玛乘积可以对注意力权重进行元素级别的微调,提升模型的感知能力。


阿达玛乘积在神经网络中的反向传播

在神经网络的反向传播算法中,阿达玛乘积尤为重要,帮助简化逐元素的梯度计算。接下来,我们将以一个具体的例子来展示阿达玛乘积在反向传播中的应用。

1. 前向传播:

考虑一个简单的神经网络,输入为 ( x ),经过权重 ( W ) 和偏置 ( b ) 的线性变换:
[
z = W x + b
]
通过激活函数 ( f(z) ) 得到输出:
[
h = f(z)
]
然后计算损失函数 ( L ):
[
L = \frac{1}{2} (h - y)^2
]
这里 ( y ) 是目标值。

2. 反向传播:

在反向传播中,我们需要通过链式法则计算损失函数对每个参数的偏导数。这个过程分为以下几个步骤:

  • 损失函数对输出 ( h ) 的偏导数:
    [
    \frac{\partial L}{\partial h} = h - y
    ]
    这是通过损失函数对 ( h ) 求导得到的。

  • 激活函数对线性变换 ( z ) 的偏导数:
    [
    \frac{\partial h}{\partial z} = f’(z)
    ]
    其中 ( f’(z) ) 是激活函数对 ( z ) 的导数。

  • 阿达玛乘积在梯度传播中的作用:
    损失函数相对于线性变换 ( z ) 的梯度可以表示为:
    [
    \frac{\partial L}{\partial z} = \frac{\partial L}{\partial h} \circ f’(z)
    ]
    这里的 ( \circ ) 是阿达玛乘积。这一步表示,损失函数对 ( h ) 的导数和激活函数对 ( z ) 的导数逐元素相乘。

3. 梯度更新:

现在,我们已经得到了 ( \frac{\partial L}{\partial z} ),接下来就可以继续计算对权重 ( W ) 和偏置 ( b ) 的梯度:
[
\frac{\partial L}{\partial W} = \frac{\partial L}{\partial z} \cdot x^T
]
[
\frac{\partial L}{\partial b} = \frac{\partial L}{\partial z}
]
这就完成了反向传播的梯度计算过程。


总结

阿达玛乘积作为逐元素操作的工具,在几何意义上更注重局部的缩放和交互,而不是全局的变换。在机器学习中,它在神经网络的前向传播与反向传播特征交互注意力机制以及权重矩阵的控制等方面发挥了至关重要的作用。

它的逐元素特性使得复杂的计算任务更加高效,尤其是在大规模的矩阵运算中,通过阿达玛乘积可以简化多维数据的处理与优化。


梯度消失

例子:两层神经网络中的梯度消失现象

我们还是考虑之前的两层神经网络

  1. 输入层:输入为 ( X )。
  2. 隐藏层:使用权重 ( W_1 ) 和偏置 ( b_1 ),激活函数为 ( f )(假设是 Sigmoid 激活函数)。
  3. 输出层:使用权重 ( W_2 ) 和偏置 ( b_2 ),输出层没有激活函数。

网络的前向传播公式如下:

  1. 隐藏层的输出:

[
H = f(W_1 X + b_1)
]

  1. 输出层的输出:

[
\hat{y} = W_2 H + b_2
]

  1. 损失函数(Loss)

假设使用均方误差(MSE)作为损失函数:

[
L = \frac{1}{2} (\hat{y} - y)^2
]


梯度消失的出现

现在,我们会模拟反向传播的过程,并说明在使用 Sigmoid 作为激活函数时,梯度是如何消失的。

1. 梯度从输出层向隐藏层传播:

首先计算输出层的梯度,然后将梯度传递到隐藏层。

输出层梯度(计算损失对 ( W_2 ) 的偏导数):

[
\frac{\partial L}{\partial W_2} = (\hat{y} - y) \cdot H
]

这个计算没有问题,梯度会通过输出层传播到隐藏层。

隐藏层梯度(计算损失对 ( W_1 ) 的偏导数):

隐藏层的梯度通过链式法则来计算,具体为:

[
\frac{\partial L}{\partial W_1} = \frac{\partial L}{\partial H} \cdot \frac{\partial H}{\partial W_1}
]

接下来我们逐步计算:

  1. 损失对隐藏层输出 ( H ) 的梯度

[
\frac{\partial L}{\partial H} = \frac{\partial L}{\partial \hat{y}} \cdot \frac{\partial \hat{y}}{\partial H} = (\hat{y} - y) \cdot W_2
]

  1. 隐藏层输出 ( H ) 对权重 ( W_1 ) 的梯度

由于隐藏层使用了 Sigmoid 激活函数,我们需要计算 Sigmoid 的导数。

  • Sigmoid 激活函数 ( f(z) ) 定义为:

[
f(z) = \frac{1}{1 + e^{-z}}
]

  • Sigmoid 的导数为:

[
f’(z) = f(z) \cdot (1 - f(z))
]

因此:

[
\frac{\partial H}{\partial W_1} = f’(W_1 X + b_1) \cdot X = f(W_1 X + b_1) \cdot (1 - f(W_1 X + b_1)) \cdot X
]

接下来,将这些表达式组合起来:

[
\frac{\partial L}{\partial W_1} = (\hat{y} - y) \cdot W_2 \cdot f(W_1 X + b_1) \cdot (1 - f(W_1 X + b_1)) \cdot X
]


2. 梯度消失问题的原因:

现在我们来看隐藏层的梯度公式:

[
\frac{\partial L}{\partial W_1} = (\hat{y} - y) \cdot W_2 \cdot f(W_1 X + b_1) \cdot (1 - f(W_1 X + b_1)) \cdot X
]

  • Sigmoid 的导数 ( f(z) \cdot (1 - f(z)) ) 的值在 0 和 0.25 之间。特别是,当 ( z ) 远离 0 时,Sigmoid 的导数会趋近于 0。

    • 当 ( z ) 非常大时,Sigmoid 输出接近 1,此时 ( f’(z) \approx 0 )。
    • 当 ( z ) 非常小时,Sigmoid 输出接近 0,此时 ( f’(z) \approx 0 )。
  • 累积效应:在深层网络中,随着网络层数的增加,梯度会逐层向前传播。如果每一层都包含一个 Sigmoid 激活函数,且 Sigmoid 的导数接近 0,那么每一层的梯度都会被缩小,最终到达前几层时,梯度几乎消失,导致前面几层的权重几乎没有更新。

具体表现
  • 隐藏层的激活值趋近 0 或 1:当隐藏层的激活值接近于 0 或 1 时,Sigmoid 的导数会非常小,导致 ( f’(W_1 X + b_1) \approx 0 )。
  • 梯度接近 0:由于梯度的计算包含 ( f’(W_1 X + b_1) ),整个梯度会接近 0,这意味着隐藏层的权重 ( W_1 ) 更新非常慢,甚至没有更新。

3. 梯度消失在深层网络中的加剧:

如果我们将这个例子扩展到一个更深的网络,问题会变得更加明显。

多层神经网络中的梯度消失
  • 每一层的梯度都依赖于上层的梯度。如果每一层都使用了 Sigmoid 激活函数,并且其导数在 0 附近,那么随着层数增加,梯度会在每一层中进一步缩小,导致前几层的梯度几乎为 0。
为什么前几层不更新?
  • 梯度消失意味着反向传播过程中,靠近输入层的权重几乎没有更新,这是因为梯度在传递过程中逐渐减小,最后变得极其微弱。
  • 这些前几层的权重在每次迭代中几乎保持不变,导致这些层没有学到有用的特征。

4. 解决梯度消失的常用方法

为了防止梯度消失,我们可以采用以下策略:

  1. ReLU 激活函数

    • ReLU 在正值区域的导数为 1,不会像 Sigmoid 那样导致梯度逐渐减小,因此 ReLU 减少了梯度消失的风险。
  2. Batch Normalization

    • BatchNorm 可以对每一层的激活值进行标准化,使其保持在较为合适的范围内,避免梯度变得过小。
  3. 残差网络(ResNet)

    • ResNet 通过引入跳跃连接(Skip Connections)允许梯度直接传递到前面的层,避免了梯度在层层传递过程中逐渐消失。

总结:

  1. 梯度消失的主要原因是:在使用 SigmoidTanh 等激活函数时,它们的导数在远离 0 的区域非常小,导致梯度在反向传播过程中逐层变小。

  2. 梯度消失现象在深层网络中更容易出现,因为每一层的梯度传递到下一层时会被进一步缩小,导致靠近输入层的权重几乎不更新,模型难以训练。

  3. 解决方案包括使用 ReLU 激活函数Batch Normalization残差网络 等技术,来确保梯度在反向传播中保持稳定,不会逐层消失。


反向传播算法的原理

反向传播算法是用于训练神经网络的核心算法,它的目的是计算神经网络中各层参数的梯度,以便通过梯度下降来更新权重和偏置。

步骤

  1. 前向传播(Forward Pass):输入数据从输入层开始,经过网络的各个层(通过权重、偏置和激活函数),最后输出结果。这个过程会计算每一层的输出值(即激活值)以及最终的损失函数(Loss)

  2. 计算损失(Loss):在输出层计算模型的预测值与真实标签之间的误差(损失),通常使用损失函数(例如均方误差、交叉熵损失等)。

  3. 反向传播(Backward Pass):通过链式法则,从输出层开始计算损失函数对每个参数(权重和偏置)的梯度。梯度表示损失函数对参数的敏感性,帮助我们确定参数如何调整,以最小化损失。反向传播从输出层开始,一层一层地向前传递梯度,最终计算到输入层。

2. 为什么梯度从输出层向前传播?

梯度的定义
  • 在神经网络中,梯度表示某个参数(如权重)对损失函数的影响。
  • 假设某层的权重为 ( W ),损失函数为 ( L ),我们需要计算损失对权重的偏导数 ( \frac{\partial L}{\partial W} )。这个偏导数告诉我们,当我们稍微调整权重 ( W ) 时,损失函数 ( L ) 会如何变化。
链式法则
  • 神经网络由多个层级组成,每一层的输出是下一层的输入。因此,损失函数不仅仅是直接依赖于某一层的权重,还会通过后面的层间接依赖该层的权重。
  • 通过链式法则,我们可以逐层计算损失函数对每层参数的导数。
梯度从输出层传递到输入层的原因
  1. 损失函数直接依赖于输出层的结果

    • 反向传播算法是从输出层开始的,因为损失函数 ( L ) 是基于网络的最终输出值与真实标签之间的差距来定义的。我们首先计算损失函数对输出层的参数(权重和偏置)的偏导数。
  2. 逐层传递梯度

    • 由于神经网络是逐层传递信息的,每一层的输出依赖于前一层的输出。因此,损失函数对前面每一层的参数的影响,必须通过后面所有层的信息传递来计算。这就是链式法则的应用。

    • 损失函数 ( L ) 对第 (i) 层的权重 ( W_i ) 的偏导数可以表示为:

      [
      \frac{\partial L}{\partial W_i} = \frac{\partial L}{\partial a_{i+1}} \cdot \frac{\partial a_{i+1}}{\partial a_i} \cdot \frac{\partial a_i}{\partial W_i}
      ]

      其中,( a_i ) 是第 ( i ) 层的激活值,梯度从后面一层依次传递到前一层。

  3. 依赖关系

    • 每一层的输出依赖于前一层的输出,损失函数对早期层的影响无法直接计算,而是依赖于它如何影响后面的层。因此,梯度必须通过从输出层向输入层的传递来计算。
总结
  • 梯度从输出层向前传播的本质原因是神经网络的损失函数首先直接依赖于输出层的结果,而每一层的输出依赖于前面所有层的参数。
  • 反向传播算法利用链式法则计算损失函数对每个参数的梯度,这个过程需要从输出层开始向前传递梯度,直到输入层。

3. 具体例子:一个简单的神经网络

假设我们有一个简单的三层神经网络:

  • 输入层:( X )
  • 隐藏层:使用权重 ( W_1 ) 和偏置 ( b_1 )
  • 输出层:使用权重 ( W_2 ) 和偏置 ( b_2 )

在前向传播中,我们计算:

  1. 隐藏层输出:( H = f(W_1 X + b_1) )
  2. 输出层输出:( \hat{y} = g(W_2 H + b_2) )

损失函数:

[
L = \text{Loss}(\hat{y}, y)
]

反向传播步骤
  1. 首先计算损失对输出层参数的偏导数

    • 我们从输出层开始,计算 ( \frac{\partial L}{\partial W_2} ) 和 ( \frac{\partial L}{\partial b_2} )。
  2. 然后计算隐藏层参数的偏导数

    • 利用链式法则,计算 ( \frac{\partial L}{\partial W_1} ) 和 ( \frac{\partial L}{\partial b_1} ) 的偏导数。这里的梯度依赖于前面已经计算好的 ( \frac{\partial L}{\partial H} ),因为隐藏层参数的影响通过输出层传递到了损失函数。

4. 总结:梯度的反向传播是因为链式法则的依赖性

  • 梯度从输出层向前传播的原因在于损失函数直接依赖于输出层的结果,而每一层的输出依赖于前面所有层的参数。为了计算损失对每一层参数的影响,我们必须利用链式法则,从输出层逐层向前计算梯度。

  • 反向传播算法通过这种梯度逐层传递的方式,确保神经网络中的每个参数都能得到相应的更新方向,从而使得模型能够通过梯度下降来最小化损失函数。


标准化(归一化)

1. 数值不稳定、梯度消失与梯度爆炸问题

1.1 数值不稳定

在神经网络的训练过程中,每层的神经元会接收到前一层的输出作为输入。如果每层的输出值的数值范围非常大或者非常小,就可能导致训练过程中的数值不稳定。这意味着:

  • 较大的激活值:可能会导致权重更新幅度过大,网络难以收敛。
  • 较小的激活值:可能会使网络的更新速度变得非常慢,甚至几乎无法更新。
1.2 梯度消失(Vanishing Gradient)

梯度消失指的是在深层网络中,随着反向传播计算的进行,网络中较早层的梯度会逐渐减小,导致这些层的参数几乎无法得到有效更新。这通常发生在**非线性激活函数(如 Sigmoid 或 Tanh)**的应用中,因为它们的导数在接近 0 时非常小,容易导致较早层的梯度趋于零。

梯度消失的后果

  • 深层网络的前几层参数更新缓慢,几乎不变,导致网络难以训练。
  • 深层网络无法有效学习复杂的特征。
1.3 梯度爆炸(Exploding Gradient)

梯度爆炸是梯度消失的对立问题。在某些情况下,神经网络中反向传播的梯度会在传播过程中变得越来越大,导致参数更新幅度过大,权重迅速失控。这种现象通常会导致网络训练不稳定,甚至损失值变得极大,训练失败。

梯度爆炸的后果

  • 参数更新过大,导致网络权重发散。
  • 损失函数值变得异常大,网络训练失败。

2. 为什么标准化能解决这些问题?

标准化(如层归一化、批归一化)能够帮助缓解或解决上述问题,其关键在于它控制每层输出的数值范围,从而使得每一层的激活值和梯度都保持在一个适当的范围内。接下来我们详细解释这些机制。

什么是归一化?

归一化的核心步骤是将数据通过减去均值除以标准差,从而得到一个具有均值为 0标准差为 1 的标准化数据分布。

给定输入数据 ( X = [x_1, x_2, \dots, x_n] ),其中 ( x_i ) 是数据中的一个元素,归一化的公式如下:

  1. 计算均值
    [
    \mu = \frac{1}{n} \sum_{i=1}^{n} x_i
    ]
    这是所有数的平均值。

  2. 计算方差
    [
    \sigma^2 = \frac{1}{n} \sum_{i=1}^{n} (x_i - \mu)^2
    ]
    方差衡量的是每个数值与均值之间的偏离程度。

  3. 归一化
    对每个数据点 ( x_i ),减去均值 ( \mu ) 并除以标准差 ( \sigma ),得到归一化后的数据:
    [
    \hat{x}_i = \frac{x_i - \mu}{\sigma}
    ]
    这里 ( \hat{x}_i ) 是归一化后的数据点。

经过这个过程,所有数据点的分布会集中在均值附近,并且这些数据的分布范围会变得更加紧凑和均匀。


为什么归一化后的数据会变得更加平均?

归一化的关键作用在于拉平数据的分布,使得每个数据点都围绕着一个统一的中心(即均值),并且其值的变化幅度被标准差缩小,这样较大的数值会被压缩,而较小的数值会被扩展。以下是它实现这一效果的原因:

减去均值:拉近数据与中心的距离

减去均值 ( \mu ) 的目的是让数据点分布围绕 0 对称。在未归一化之前,数据点可能会偏离中心。例如,假设有一些数据值远高于均值,它们会被减去一个较大的均值,从而缩短与中心的距离。反之,较小的数据点则会被减去一个较小的均值,增加与中心的距离。

举个例子:

  • 如果数据点 ( x_1 = 100 ),均值 ( \mu = 50 ),那么 ( x_1 - \mu = 100 - 50 = 50 ),数据点被向中心移动。
  • 如果数据点 ( x_2 = 10 ),均值 ( \mu = 50 ),那么 ( x_2 - \mu = 10 - 50 = -40 ),数据点被相对向中心移动。

这种操作会使得原本偏离中心的数据点向均值收缩,而原本靠近均值的数据点不会有明显的变化。

除以标准差:压缩大值,扩展小值

第二步,将数据点除以标准差 ( \sigma ),目的是缩放数据的变化幅度,使得所有数据点的波动被控制在一定的范围内。由于标准差反映的是数据的离散程度,较大的标准差意味着数据的波动较大,而较小的标准差意味着数据的波动较小。

通过除以标准差,大值被压缩,而小值被扩展:

  • 较大的数 ( x_i ) 被除以较大的标准差,会使得它的变化幅度缩小,从而数据点不再过度偏离均值。
  • 较小的数 ( x_i ) 被除以同样的标准差时,它的数值会变得相对较大一些。

继续上面的例子:

  • ( \hat{x}_1 = \frac{50}{20} = 2.5 )
  • ( \hat{x}_2 = \frac{-40}{20} = -2 )

此时,大的数值已经被压缩,小的数值在绝对值上有所增大,从而数据的整体分布变得更加均匀,数据的极端值被抑制。


数学上的解释:为什么归一化后更平均?

通过减去均值和除以标准差,数据在数学上发生了以下几种变化:

使分布围绕 0 对称

减去均值 ( \mu ) 后,数据的中心变成了 0,而不是原始数据的均值。即:
[
\text{新的均值} = \frac{1}{n} \sum_{i=1}^{n} (x_i - \mu) = 0
]
这意味着所有数据点的分布都围绕着 0 对称,避免了一部分数据点偏离中心过远。

让数据的标准差为 1

除以标准差 ( \sigma ) 后,数据的变化幅度被控制在标准范围内。由于标准差代表数据的离散程度,因此标准化后,数据的标准差变为 1:
[
\text{新的标准差} = \frac{1}{n} \sum_{i=1}^{n} \left(\frac{x_i - \mu}{\sigma}\right)^2 = 1
]
这个操作使得数据的波动范围变得一致,从而大值和小值的差距不再过于悬殊。

大数被压缩,小数被扩展

最终效果是:

  • 较大的值压缩到一个较小的范围内,避免数据点过度偏离中心。
  • 较小的值扩展,使得它们相对更加靠近均值。

这两个步骤结合起来,导致了原始数据经过标准化后,数据点更加均匀地分布在一个较小的范围内


示例:归一化的效果

让我们通过一个简单的例子来说明标准化的效果:

原始数据

假设我们有以下一组数据:
[ X = [100, 50, 10, 5, 1] ]

  1. 计算均值
    [
    \mu = \frac{100 + 50 + 10 + 5 + 1}{5} = 33.2
    ]

  2. 计算方差
    [
    \sigma^2 = \frac{1}{5} \left((100 - 33.2)^2 + (50 - 33.2)^2 + \dots + (1 - 33.2)^2\right) = 1600.16
    ]
    标准差为:
    [
    \sigma = \sqrt{1600.16} \approx 40
    ]

  3. 归一化每个数据点
    [
    \hat{x}_1 = \frac{100 - 33.2}{40} \approx 1.67, \quad \hat{x}_2 = \frac{50 - 33.2}{40} \approx 0.42, \quad \hat{x}_3 = \frac{10 - 33.2}{40} \approx -0.58
    ]
    [
    \hat{x}_4 = \frac{5 - 33.2}{40} \approx -0.71, \quad \hat{x}_5 = \frac{1 - 33.2}{40} \approx -0.81
    ]

归一化后的数据

[
\hat{X} = [1.67, 0.42, -0.58, -0.71, -0.81]
]
我们可以看到,原始数据中的极端值(如 100 和 1)经过归一化后,被压缩到了一个较小的范围内,并且所有数据点都围绕着 0,对称分布。


3. 总结:标准化如何解决数值不稳定、梯度消失与梯度爆炸问题

  • 数值不稳定:标准化将每层的输出控制在一个固定范围内,防止数值过大或过小,确保模型在训练时的更新幅度不会过大或过小。
  • 梯度消失:通过标准化输入,激活函数(如 Sigmoid、Tanh)不会在极端值下工作,确保其导数不会接近 0,从而保持有效的梯度传播。
  • 梯度爆炸:标准化防止输入值过大,从而避免反向传播时梯度指数级增长的问题,保持模型训练过程的稳定性。

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

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

相关文章

解密 Redis:如何通过 IO 多路复用征服高并发挑战!

文章目录 一、什么是 IO 多路复用?二、为什么 Redis 要使用 IO 多路复用?三、Redis 如何实现 IO 多路复用?四、IO 多路复用的核心机制:epoll五、IO 多路复用在 Redis 中的工作流程六、IO 多路复用的优点七、IO 多路复用使用中的注…

安装buildkit,并使用buildkit构建containerd镜像

背景 因为K8s抛弃Docker了,所以就只装了个containerd,这样就需要一个单独的镜像构建工具了,就用了buildkit,这也是Docker公司扶持的,他们公司的人出来搞的开源工具,官网在 https://github.com/moby/buildkit 简介 服务端为buildkitd,负责和runc或containerd后端连接干活,目前…

w~自动驾驶合集6

我自己的原文哦~ https://blog.51cto.com/whaosoft/12286744 #自动驾驶的技术发展路线 端到端自动驾驶 Recent Advancements in End-to-End Autonomous Driving using Deep Learning: A SurveyEnd-to-end Autonomous Driving: Challenges and Frontiers 在线高精地图 HDMa…

windows文件拷贝给wsl2的Ubuntu

参考: windows文件如何直接拖拽到wsl中_win 移到文件到wsl-CSDN博客 cp -r /mnt/盘名/目标文件 要复制到wsl中的位置e.g.cp -r /mnt/d/byt5 /home Linux文件复制、移动、删除等操作命令_linux移动命令-CSDN博客 Linux 文件、文件夹的复制、移动、删除 - Be-myse…

构建后端为etcd的CoreDNS的容器集群(二)、下载最新的etcd容器镜像

在尝试获取etcd的容器的最新版本镜像时,使用latest作为tag取到的并非最新版本,本文尝试用实际最新版本的版本号进行pull,从而取到想的最新版etcd容器镜像。 一、用latest作为tag尝试下载最新etcd的镜像 1、下载镜像 [rootlocalhost opt]# …

多品牌摄像机视频平台EasyCVR海康大华宇视视频平台如何接入多样化设备

在实际的工程项目里,我们常常会面临这样的情况:项目管理者可能会决定使用多个品牌的视频监控摄像头,或者有需求将现有的、多种类型的监控系统进行整合。现在,让我们来探讨一下如何实现不同品牌摄像头的连接和使用。 1、GB/T281协议…

2024版最新148款CTF工具整理大全(附下载安装包)含基础环境、Web 安全、加密解密、密码爆破、文件、隐写、逆向、PWN

经常会有大学生粉丝朋友私信小强,想通过打CTF比赛镀金,作为进入一线互联网大厂的门票。 但是在CTF做题很多的时候都会用到工具,所以在全网苦寻CTF比赛工具安装包! 关于我 有不少阅读过我文章的伙伴都知道,我曾就职于…

SSM框架实战小项目:打造高效用户管理系统 day3

前言 在前两篇博客中,后台已经搭建完毕,现在需要设计一下前端页面 webapp下的项目结构图 创建ftl文件夹,导入css和js 因为我们在后台的视图解析器中,设置了页面解析器,跳转路径为/ftl/*.ftl,所以需要ftl文件…

JAVA开源项目 网上订餐系统 计算机毕业设计

本文项目编号 T 018 ,文末自助获取源码 \color{red}{T018,文末自助获取源码} T018,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 新…

Pycharm通过ssh远程docker容器搭建开发环境

本地pycharm通过ssh方式远程连接服务器(Ubuntu)上的docker容器,搭建开发环境。实现功能:将环境依赖打包成docker镜像,并在远程服务器中启动容器(启动时做好端口映射和文件夹挂载),通…

负载箱的作用?

负载箱,顾名思义,就是用来承载电力设备的箱子。在电力系统中,负载箱的作用非常重要,它不仅可以模拟实际的电力负载,还可以对电力设备进行测试和调试,确保其正常运行。下面详细介绍负载箱的作用。 1. 模拟实…

15分钟学Go 第7天:控制结构 - 条件语句

第7天:控制结构 - 条件语句 在Go语言中,控制结构是程序逻辑的重要组成部分。通过条件语句,我们可以根据不同的条件采取不同的行动。今天我们将详细探讨Go语言中的两种主要条件结构:if语句和switch语句。理解这些控制结构对于编写…

复写零--双指针

一&#xff1a;题目描述 题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 二&#xff1a;算法原理分析 三&#xff1a;代码编写 void duplicateZeros3(vector<int>& arr) {int dest -1, cur 0, n arr.size();//1.找到要复写的最后一个数字while …

qiankun 应用之间数据传递

qiankun 应用之间数据传递 全局共享 initGlobalState qiankun initGlobalState API 单击前往 qiankun 内部提供了 initGlobalState 方法用于注册 MicroAppStateActions 实例用于通信&#xff0c;该实例有三个方法&#xff0c;分别是onGlobalStateChange、setGlobalState、of…

微软宣布了新的“智能代理”功能

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Elasticsearch:Redact(编辑) processor

Redact 处理器使用 Grok 规则引擎来隐藏输入文档中与给定 Grok 模式匹配的文本。该处理器可用于隐藏个人身份信息 (Personal Identifying Information - PII)&#xff0c;方法是将其配置为检测已知模式&#xff0c;例如电子邮件或 IP 地址。与 Grok 模式匹配的文本将被替换为可…

SpringBoot实现微信支付接口调用及回调函数(商户参数获取)

#1024程序员节 | 征文 # 一、具体业务流程 1. 用户下单 - 前端操作&#xff1a; - 用户在应用中选择商品、填写订单信息&#xff08;如地址、联系方式等&#xff09;&#xff0c;并点击“下单”按钮。 - 前端将订单信息&#xff08;商品ID、数量、价格等&#xff09;发送…

深度学习的一些数学基础

数学基础 万丈高楼平地起 怎么说呢&#xff0c;学的数二对于这些东西还是太陌生了&#xff0c;而且当时学的只会做题&#xff0c;不知道怎么使用/(ㄒoㄒ)/~~ 所以记下来一些不太清楚的前置知识点&#xff0c;主要来自《艾伯特深度学习》&#xff0c;书中内容很多&#xff0c…

动手学深度学习9.6. 编码器-解码器架构-笔记练习(PyTorch)

本节课程地址&#xff1a;61 编码器-解码器架构【动手学深度学习v2】_哔哩哔哩_bilibili 本节教材地址&#xff1a;9.6. 编码器-解码器架构 — 动手学深度学习 2.0.0 documentation (d2l.ai) 本节开源代码&#xff1a;...>d2l-zh>pytorch>chapter_multilayer-percep…

cnn_lstm_kan模型创新实现股票预测

获取更多完整项目代码数据集&#xff0c;点此加入免费社区群 &#xff1a; 首页-置顶必看 1. 项目简介 A002-cnn_lstm_kan模型创新实现股票预测项目旨在通过结合卷积神经网络&#xff08;CNN&#xff09;、长短期记忆网络&#xff08;LSTM&#xff09;以及知识注意网络&#…