深度学习杂乱知识
阿达玛乘积(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}
]
这就完成了反向传播的梯度计算过程。
总结
阿达玛乘积作为逐元素操作的工具,在几何意义上更注重局部的缩放和交互,而不是全局的变换。在机器学习中,它在神经网络的前向传播与反向传播、特征交互、注意力机制以及权重矩阵的控制等方面发挥了至关重要的作用。
它的逐元素特性使得复杂的计算任务更加高效,尤其是在大规模的矩阵运算中,通过阿达玛乘积可以简化多维数据的处理与优化。
梯度消失
例子:两层神经网络中的梯度消失现象
我们还是考虑之前的两层神经网络:
- 输入层:输入为 ( X )。
- 隐藏层:使用权重 ( W_1 ) 和偏置 ( b_1 ),激活函数为 ( f )(假设是 Sigmoid 激活函数)。
- 输出层:使用权重 ( W_2 ) 和偏置 ( b_2 ),输出层没有激活函数。
网络的前向传播公式如下:
- 隐藏层的输出:
[
H = f(W_1 X + b_1)
]
- 输出层的输出:
[
\hat{y} = W_2 H + b_2
]
- 损失函数(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}
]
接下来我们逐步计算:
- 损失对隐藏层输出 ( 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
]
- 隐藏层输出 ( 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. 解决梯度消失的常用方法:
为了防止梯度消失,我们可以采用以下策略:
-
ReLU 激活函数:
- ReLU 在正值区域的导数为 1,不会像 Sigmoid 那样导致梯度逐渐减小,因此 ReLU 减少了梯度消失的风险。
-
Batch Normalization:
- BatchNorm 可以对每一层的激活值进行标准化,使其保持在较为合适的范围内,避免梯度变得过小。
-
残差网络(ResNet):
- ResNet 通过引入跳跃连接(Skip Connections)允许梯度直接传递到前面的层,避免了梯度在层层传递过程中逐渐消失。
总结:
-
梯度消失的主要原因是:在使用 Sigmoid 或 Tanh 等激活函数时,它们的导数在远离 0 的区域非常小,导致梯度在反向传播过程中逐层变小。
-
梯度消失现象在深层网络中更容易出现,因为每一层的梯度传递到下一层时会被进一步缩小,导致靠近输入层的权重几乎不更新,模型难以训练。
-
解决方案包括使用 ReLU 激活函数、Batch Normalization 和 残差网络 等技术,来确保梯度在反向传播中保持稳定,不会逐层消失。
反向传播算法的原理
反向传播算法是用于训练神经网络的核心算法,它的目的是计算神经网络中各层参数的梯度,以便通过梯度下降来更新权重和偏置。
步骤:
-
前向传播(Forward Pass):输入数据从输入层开始,经过网络的各个层(通过权重、偏置和激活函数),最后输出结果。这个过程会计算每一层的输出值(即激活值)以及最终的损失函数(Loss)。
-
计算损失(Loss):在输出层计算模型的预测值与真实标签之间的误差(损失),通常使用损失函数(例如均方误差、交叉熵损失等)。
-
反向传播(Backward Pass):通过链式法则,从输出层开始计算损失函数对每个参数(权重和偏置)的梯度。梯度表示损失函数对参数的敏感性,帮助我们确定参数如何调整,以最小化损失。反向传播从输出层开始,一层一层地向前传递梯度,最终计算到输入层。
2. 为什么梯度从输出层向前传播?
梯度的定义:
- 在神经网络中,梯度表示某个参数(如权重)对损失函数的影响。
- 假设某层的权重为 ( W ),损失函数为 ( L ),我们需要计算损失对权重的偏导数 ( \frac{\partial L}{\partial W} )。这个偏导数告诉我们,当我们稍微调整权重 ( W ) 时,损失函数 ( L ) 会如何变化。
链式法则:
- 神经网络由多个层级组成,每一层的输出是下一层的输入。因此,损失函数不仅仅是直接依赖于某一层的权重,还会通过后面的层间接依赖该层的权重。
- 通过链式法则,我们可以逐层计算损失函数对每层参数的导数。
梯度从输出层传递到输入层的原因:
-
损失函数直接依赖于输出层的结果:
- 反向传播算法是从输出层开始的,因为损失函数 ( L ) 是基于网络的最终输出值与真实标签之间的差距来定义的。我们首先计算损失函数对输出层的参数(权重和偏置)的偏导数。
-
逐层传递梯度:
-
由于神经网络是逐层传递信息的,每一层的输出依赖于前一层的输出。因此,损失函数对前面每一层的参数的影响,必须通过后面所有层的信息传递来计算。这就是链式法则的应用。
-
损失函数 ( 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. 具体例子:一个简单的神经网络
假设我们有一个简单的三层神经网络:
- 输入层:( X )
- 隐藏层:使用权重 ( W_1 ) 和偏置 ( b_1 )
- 输出层:使用权重 ( W_2 ) 和偏置 ( b_2 )
在前向传播中,我们计算:
- 隐藏层输出:( H = f(W_1 X + b_1) )
- 输出层输出:( \hat{y} = g(W_2 H + b_2) )
损失函数:
[
L = \text{Loss}(\hat{y}, y)
]
反向传播步骤:
-
首先计算损失对输出层参数的偏导数:
- 我们从输出层开始,计算 ( \frac{\partial L}{\partial W_2} ) 和 ( \frac{\partial L}{\partial b_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 ) 是数据中的一个元素,归一化的公式如下:
-
计算均值:
[
\mu = \frac{1}{n} \sum_{i=1}^{n} x_i
]
这是所有数的平均值。 -
计算方差:
[
\sigma^2 = \frac{1}{n} \sum_{i=1}^{n} (x_i - \mu)^2
]
方差衡量的是每个数值与均值之间的偏离程度。 -
归一化:
对每个数据点 ( 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] ]
-
计算均值:
[
\mu = \frac{100 + 50 + 10 + 5 + 1}{5} = 33.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
] -
归一化每个数据点:
[
\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,从而保持有效的梯度传播。
- 梯度爆炸:标准化防止输入值过大,从而避免反向传播时梯度指数级增长的问题,保持模型训练过程的稳定性。
相关文章:
深度学习杂乱知识
阿达玛乘积(Hadamard Product)详解 1. 定义: 阿达玛乘积(Hadamard Product),又称为元素乘积或逐元素乘积,是指对两个维度相同的矩阵进行逐元素相乘的操作。 假设我们有两个维度相同的矩阵 ( …...

本地编译运行Thingsboard-gateway之python版本——modbus数据采集
1、ideal 我用的是2020版本,这个关系不大,随便 Thingsboard-gateway之python版本源码拉取(老版本是java写的,新版都是python写的) 地址:git clone https://github.com/thingsboard/thingsboard-gateway.git…...

京东笔试题
和谐敏感词 🔗 题目地址 🎉 模拟 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);int n scanner.nextInt();String s scanner.next();String[] words new String[…...

URP学习(一)
URP是unity出的比较简单的可供改造引擎渲染管线的流程。能实现用较低的代价消耗实现较好的效果。 现记录学习: 一.如何设置URP关键 这步结束后材质会被替换 加package Create/Rendering/URP Universal Rendering Setting设置为urp 材质也需要urp目录下的 几种…...

Linux中修改和查看Redis的内存大小
目录 一:修改redis内存大小1. 编辑配置文件2. 在命令行修改 二:查看redis内存大小1. get maxmemory2. info memory 一:修改redis内存大小 1. 编辑配置文件 sudo vim /etc/redis/redis.conf maxmemory 300MB1、Redis可用内存大小只能是整数&…...
uniapp中的页面跳转
1. uni.navigateTo用于跳转到应用内的某个非tabBar页面,并且会保留当前页面,将其推入页面栈中。 uni.navigateTo({url: path/to/page // 替换为你要跳转的页面路径 }); 2. uni.redirectTo 用于关闭当前页面,重定向到应用内的某个非tabBar页面…...
Redis|延迟双删策略的优点和缺点是什么?
延迟双删策略是什么? 延迟双删策略是一种保证缓存与数据库数据一致性的方法,特别适用于高并发场景下的缓存更新。其核心思想是:在更新数据库时,不仅删除一次缓存,还在短时间后再进行一次延迟删除,以避免并…...

【计算机网络 - 基础问题】每日 3 题(五十二)
✍个人博客:https://blog.csdn.net/Newin2020?typeblog 📣专栏地址:http://t.csdnimg.cn/fYaBd 📚专栏简介:在这个专栏中,我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞…...

LogStash架构分析
一、什么是LogStash LogStash 是一个类似实时流水线的开源数据传输引擎,它像一个两头连接不同数据源的数据传输管道,将数据实时地从一个数据源传输到另一个数据源中。在数据传输的过程中,LogStash 还可以对数据进行清洗、加工和整理…...

2024最新最全【大模型学习路线规划】零基础入门到精通!,大模型学习干货分享,总结的太详细了
第一阶段:基础理论入门 目标:了解大模型的基本概念和背景。 内容: 人工智能演进与大模型兴起。 大模型定义及通用人工智能定义。 GPT模型的发展历程。 第二阶段:核心技术解析 目标:深入学习大模型的关键技术和工…...

QT界面开发:图形化设计、资源文件添加
设计界面介绍 此时我们创建项目时就可以选择添加UI选项了。 添加完之后,我们可以看到,文件中多出了一个存放界面文件的目录,下面有个.ui的界面文件。甚至pro的项目文件中也会添加一项内容。 我们点击界面文件中的.ui文件,我们可以…...

科大讯飞:成本降低 60%,性能提升 10 倍,从 ES Loki 到 Apache Doris 可观测性存储底座升级
导读:科大讯飞星际日志中心经历了从 Elasticsearch 到 Loki,再到 Apache Doris 的可观测性存储分析底座升级,支持可观测三大支柱 Log Trace Metrics 的存储与分析,有效解决 Elasticsearch 成本高、Loki 查询慢的问题。Doris 能够在…...
ISO26262在汽车领域的意义
ISO 26262在汽车领域的意义非常重大,主要体现在以下几个方面: 一、提高汽车功能安全性 统一标准:ISO 26262是汽车电子系统的功能安全标准,为汽车制造商、供应商和相关行业提供了统一的框架和指南,确保汽车电子系统和软…...
11. 事件机制
① 事件模式必须基于 PSR-14 去实现。 ② Hyperf 的事件管理器默认由 hyperf/event 实现,该组件亦可用于其它框架或应用,只需通过 Composer 将该组件引入即可,默认已安装。 composer require hyperf/event一、概念 事件模式是一种非常适用于解耦的机制,分别存在以下 3 种角…...

MySQL 本地社区版安装(不登录) mysql官网链接
一、官网下载 官方地址 https://www.mysql.com/downloads/ 打开后先选择downloads 拉到最后选择 MySQL 社区版 然后继续选择社区版 在这此可以选择新版 选择 archives 可以选择其他版本下载 这里选择下面第一个就可以了 直接选择下载 下载后是安装包 直接双击安装 二…...
Redis Search系列 - 第三讲 拼写检查
拼写检查 - Spellchecking & Dict Spellchecking为拼写错误的搜索词提供建议。例如,术语“reids”可能是“redis”的拼写错误版本。 从v1.4开始,Redis Search可以为拼写错误的查询术语(term)生成替代的方案。拼写错误的术语是…...

Golang | Leetcode Golang题解之第492题构造矩形
题目: 题解: func constructRectangle(area int) []int {w : int(math.Sqrt(float64(area)))for area%w > 0 {w--}return []int{area / w, w} }...

Axure重要元件三——中继器函数
亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! 课程主题:中继器函数 主要内容:Item、Reperter、TargetItem 1、中继器的函数:Item\Reperter\TargetItem Item item:获取…...

MySQL8.0.40编译安装
近期MySQL发布了8.0.40版本,与之前的版本相比,部分依赖包发生了变化,因此重新编译一版,也便于大家参考。 1. 下载源码 选择对应的版本、选择源码、操作系统 如果没有登录或者没有MySQL官网账号,可以选择只下载 2. 进…...
JavaScript 第23章:WebSocket 与实时通讯
在JavaScript中使用WebSocket进行实时通信是一个非常实用且强大的功能。下面我们将详细介绍WebSocket协议的基础知识、如何使用WebSocket对象以及如何构建一个简单的实时通信应用。 WebSocket 协议 WebSocket是一个在单个TCP连接上进行全双工通信的协议。WebSocket使得数据可…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...

蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill
视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...