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

神经网络系列---损失函数


文章目录

    • 损失函数
      • 均方误差(Mean Squared Error,MSE):
      • 平均绝对误差(Mean Absolute Error,MAE):
      • 交叉熵损失函数(Cross-Entropy Loss):
      • Hinge Loss:
      • 交叉熵损失与对数似然损失(Log-Likelihood Loss):
      • KL 散度损失(Kullback-Leibler Divergence Loss,KL Loss):
      • 余弦相似度损失(Cosine Similarity Loss):
      • 信息熵损失(Entropy Loss):


损失函数

神经网络中的损失函数用于衡量模型预测结果与实际标签之间的差异。选择适当的损失函数对于训练一个高效且准确的神经网络至关重要。以下是一些常见的神经网络损失函数:

  • 我们假设y_truey_pred都是二维向量,表示批量样本的真实标签预测结果

均方误差(Mean Squared Error,MSE):

用于回归问题,计算预测值与实际值之间的平方差的均值。

均方误差(Mean Squared Error,MSE)是常用的回归问题中的损失函数,用于衡量模型预测结果与真实标签之间的差异。对于回归问题,我们预测的是连续值,而不是分类标签。均方误差计算方法是将每个预测值与对应的真实值之差的平方求和,然后再取平均,得到最终的损失值。

假设我们有一个批量样本,其中每个样本的真实标签为 y_true,模型预测结果为 y_pred。样本数为 N,则均方误差公式如下:

MSE = 1 N ∑ i = 1 N ( y true , i − y pred , i ) 2 \text{MSE} = \frac{1}{N} \sum_{i=1}^{N} (y_{\text{true},i} - y_{\text{pred},i})^2 MSE=N1i=1N(ytrue,iypred,i)2

其中:

  • y true , i y_{\text{true},i} ytrue,i 是第 i 个样本的真实标签值。
  • y pred , i y_{\text{pred},i} ypred,i 是第 i 个样本的模型预测结果。

均方误差衡量的是预测值与真实值之间的距离的平方,并求平均值。该值越小,表示模型的预测结果越接近真实标签,即模型的性能越好。

要计算均方误差(Mean Squared Error,MSE)损失函数对模型预测结果 y_pred 的偏导数,我们需要使用链式法则(Chain Rule)来求解。在以下偏导数公式中,y_true 表示真实标签,y_pred 表示模型预测的结果。

对于第 i 个样本的预测结果 y_pred[i],均方误差损失函数对 y_pred[i] 的偏导数公式如下:

∂ MSE ∂ y pred [ i ] = 2 N ( y pred [ i ] − y true [ i ] ) \frac{\partial \text{MSE}}{\partial y_{\text{pred}[i]}} = \frac{2}{N} (y_{\text{pred}[i]} - y_{\text{true}[i]}) ypred[i]MSE=N2(ypred[i]ytrue[i])

其中:

  • N N N 是样本数(Batch Size)。
  • y true [ i ] y_{\text{true}[i]} ytrue[i] 是第 i 个样本的真实标签值。
  • y pred [ i ] y_{\text{pred}[i]} ypred[i] 是第 i 个样本的模型预测结果。

这个公式表示在均方误差损失函数中,对于每个样本的预测结果 y_pred[i],偏导数的值是预测结果与真实标签之差的2倍除以样本数。

注意,这个偏导数的计算是针对每个样本的预测结果 y_pred[i] 的,而不是整个批量样本的预测结果 y_pred

在实际训练过程中,我们通常将均方误差损失函数的偏导数与其他梯度一起用于反向传播算法,从而更新网络参数。这样可以通过梯度下降等优化算法来最小化均方误差损失,从而提高回归模型的准确性和性能。

   MSE = (1/n) * Σ(y_pred - y_true)^2
#include <cmath>//单个数据
double meanSquaredError(double y_true, double y_pred) {return pow(y_true - y_pred, 2);
}//多个数据
double batchMeanSquaredError(const std::vector<double>& y_true, const std::vector<double>& y_pred) {int batch_size = y_true.size();double loss = 0.0;for (int i = 0; i < batch_size; i++) {loss += pow(y_true[i] - y_pred[i], 2);}return loss / batch_size;
}// 计算 MSE 损失函数对 y_pred 的偏导数
std::vector<double> mseLossDerivative(const std::vector<double>& y_true, const std::vector<double>& y_pred) {int size = y_true.size();std::vector<double> derivative(size);for (int i = 0; i < size; i++) {derivative[i] = 2 * (y_pred[i] - y_true[i]);}return derivative;
}// 计算 MSE 损失函数对 y_pred 的偏导数
std::vector<std::vector<double>> batchMSELossDerivative(const std::vector<std::vector<double>>& y_true,const std::vector<std::vector<double>>& y_pred) {int batch_size = y_true.size();int size = y_true[0].size();std::vector<std::vector<double>> derivative(batch_size, std::vector<double>(size, 0.0));for (int i = 0; i < batch_size; i++) {for (int j = 0; j < size; j++) {derivative[i][j] = 2 * (y_pred[i][j] - y_true[i][j]);}}return derivative;
}

平均绝对误差(Mean Absolute Error,MAE):

用于回归问题,计算预测值与实际值之间的绝对差的均值。

平均绝对误差(Mean Absolute Error,MAE)是常用的回归问题中的损失函数,用于衡量模型预测结果与真实标签之间的差异。对于回归问题,我们预测的是连续值,而不是分类标签。平均绝对误差计算方法是将每个预测值与对应的真实值之差的绝对值求和,然后再取平均,得到最终的损失值。

假设我们有一个批量样本,其中每个样本的真实标签为 y_true,模型预测结果为 y_pred。样本数为 N,则平均绝对误差公式如下:

MAE = 1 N ∑ i = 1 N ∣ y true , i − y pred , i ∣ \text{MAE} = \frac{1}{N} \sum_{i=1}^{N} \left| y_{\text{true},i} - y_{\text{pred},i} \right| MAE=N1i=1Nytrue,iypred,i

其中:

  • y true , i y_{\text{true},i} ytrue,i 是第 i 个样本的真实标签值。
  • y pred , i y_{\text{pred},i} ypred,i 是第 i 个样本的模型预测结果。

平均绝对误差衡量的是预测值与真实值之间的绝对距离,并求平均值。与均方误差相比,平均绝对误差更加鲁棒,因为它对异常值(离群点)不敏感。然而,均方误差在数学优化中更易处理,因为其导数计算较为简单。

要计算平均绝对误差(Mean Absolute Error,MAE)损失函数对模型预测结果 y_pred 的偏导数,我们需要使用链式法则(Chain Rule)来求解。在以下偏导数公式中,y_true 表示真实标签,y_pred 表示模型预测的结果。

对于第 i 个样本的预测结果 y_pred[i],平均绝对误差损失函数对 y_pred[i] 的偏导数公式如下:

∂ MAE ∂ y pred [ i ] = 1 N ∑ j = 1 N y pred [ j ] − y true [ j ] ∣ y pred [ j ] − y true [ j ] ∣ \frac{\partial \text{MAE}}{\partial y_{\text{pred}[i]}} = \frac{1}{N} \sum_{j=1}^{N} \frac{y_{\text{pred}[j]} - y_{\text{true}[j]}}{\left| y_{\text{pred}[j]} - y_{\text{true}[j]} \right|} ypred[i]MAE=N1j=1N ypred[j]ytrue[j] ypred[j]ytrue[j]

其中:

  • N N N 是样本数(Batch Size)。
  • y true [ j ] y_{\text{true}[j]} ytrue[j] 是第 j 个样本的真实标签值。
  • y pred [ j ] y_{\text{pred}[j]} ypred[j] 是第 j 个样本的模型预测结果。

这个公式表示在平均绝对误差损失函数中,对于每个样本的预测结果 y_pred[i],偏导数的值是每个样本的预测结果与真实标签之差的符号(正负号)的平均值。

注意,这个偏导数的计算是针对每个样本的预测结果 y_pred[i] 的,而不是整个批量样本的预测结果 y_pred

   MAE = (1/n) * Σ|y_pred - y_true|
#include <cmath>
//单个数据
double meanAbsoluteError(double y_true, double y_pred) {return fabs(y_true - y_pred);
}//多个数据
double batchMeanAbsoluteError(const std::vector<double>& y_true, const std::vector<double>& y_pred) {int batch_size = y_true.size();double loss = 0.0;for (int i = 0; i < batch_size; i++) {loss += fabs(y_true[i] - y_pred[i]);}return loss / batch_size;
}// 计算 MAE 损失函数对 y_pred 的偏导数
std::vector<double> maeLossDerivative(const std::vector<double>& y_true, const std::vector<double>& y_pred) {int size = y_true.size();std::vector<double> derivative(size);for (int i = 0; i < size; i++) {derivative[i] = (y_pred[i] > y_true[i]) ? 1 : -1;}return derivative;
}// 计算 MAE 损失函数对 y_pred 的偏导数
std::vector<std::vector<double>> batchMAELossDerivative(const std::vector<std::vector<double>>& y_true,const std::vector<std::vector<double>>& y_pred) {int batch_size = y_true.size();int size = y_true[0].size();std::vector<std::vector<double>> derivative(batch_size, std::vector<double>(size, 0.0));for (int i = 0; i < batch_size; i++) {for (int j = 0; j < size; j++) {derivative[i][j] = (y_pred[i][j] > y_true[i][j]) ? 1 : -1;}}return derivative;
}

交叉熵损失函数(Cross-Entropy Loss):

用于分类问题,衡量模型输出概率分布与实际标签的差异。
交叉熵损失函数(Cross-Entropy Loss)是用于衡量分类模型预测结果与真实标签之间差异的常用损失函数。对于多类别分类问题,它是一种广泛使用的损失函数。以下是交叉熵损失函数的数学公式:

假设我们有一个批量样本,其中每个样本有 C 个类别。y_true 表示真实标签的独热编码形式,y_pred 表示模型预测的类别概率向量。

交叉熵损失函数公式如下:

CrossEntropyLoss = − 1 N ∑ i = 1 N ∑ j = 1 C y true , i , j ⋅ log ⁡ ( y pred , i , j ) \text{CrossEntropyLoss} = - \frac{1}{N} \sum_{i=1}^{N} \sum_{j=1}^{C} y_{\text{true},i,j} \cdot \log(y_{\text{pred},i,j}) CrossEntropyLoss=N1i=1Nj=1Cytrue,i,jlog(ypred,i,j)

其中:

  • N N N 是批量样本的数量(Batch Size)。
  • C C C 是类别的数量。
  • y true , i , j y_{\text{true},i,j} ytrue,i,j 表示第 i 个样本的真实标签中类别 j 的值,它是一个0或1的独热编码。
  • y pred , i , j y_{\text{pred},i,j} ypred,i,j 表示第 i 个样本的模型预测结果中类别 j 的概率。

交叉熵损失函数是一个非负数,当模型预测结果与真实标签完全匹配时,损失为0。它的值越小表示模型的预测结果与真实标签越接近,即模型的性能越好。

在实际应用中,通常结合梯度下降等优化算法,将交叉熵损失函数用于训练神经网络,从而调整网络参数以最小化损失函数。这样可以提高分类模型的准确性和性能。
要计算交叉熵损失函数对模型预测结果 y_pred 的偏导数,我们需要使用链式法则(Chain Rule)来求解。在以下偏导数公式中,y_true 表示真实标签的独热编码形式,y_pred 表示模型预测的类别概率向量。

对于第 i 个样本的第 j 个类别,交叉熵损失函数对 y_pred[i][j] 的偏导数公式如下:

∂ CrossEntropyLoss ∂ y pred [ i ] [ j ] = − y true [ i ] [ j ] y pred [ i ] [ j ] \frac{\partial \text{CrossEntropyLoss}}{\partial y_{\text{pred}[i][j]}} = - \frac{y_{\text{true}[i][j]}}{y_{\text{pred}[i][j]}} ypred[i][j]CrossEntropyLoss=ypred[i][j]ytrue[i][j]

其中:

  • y true [ i ] [ j ] y_{\text{true}[i][j]} ytrue[i][j] 是第 i 个样本的真实标签中类别 j 的值,它是一个0或1的独热编码。
  • y pred [ i ] [ j ] y_{\text{pred}[i][j]} ypred[i][j] 是第 i 个样本的模型预测结果中类别 j 的概率。

这个公式表示在交叉熵损失函数中,对于每个样本的每个类别,偏导数的值是真实标签中类别值与模型预测结果中类别概率的比值的负数。

请注意,交叉熵损失函数对于真实标签中非零值(即对应真实类别的位置)的偏导数是负无穷大,因为在这些位置上 y true [ i ] [ j ] y_{\text{true}[i][j]} ytrue[i][j] 是1,而 y pred [ i ] [ j ] y_{\text{pred}[i][j]} ypred[i][j] 逼近于0,导致分母接近于0。这就是为什么在实际应用中,通常使用计算机的浮点数精度范围内的小值(如1e-9)来避免除以0的情况,从而保证计算的稳定性。

对于二分类问题:

   Binary Cross-Entropy = -[y_true * log(y_pred) + (1 - y_true) * log(1 - y_pred)]

对于多分类问题:

   Categorical Cross-Entropy = -Σ(y_true * log(y_pred))
#include <cmath>// 单个数据 - 二分类double NetWork::binaryCrossEntropyLoss(double y_pred, double y_true){y_pred = std::max(std::min(y_pred, 1.0 - 1e-15), 1e-15); // 避免log(0)的情况return -(y_true * log(y_pred) + (1 - y_true) * log(1 - y_pred));}// 计算交叉熵损失函数对 y_pred 的偏导数 - 单个数据 - 二分类double binaryCrossEntropyLossDerivative(double y_pred, double y_true){// 计算predicted_prob对于损失函数L1和L2的偏导数double d_L1 = -y_true / std::max(std::min(y_pred, 1.0 - 1e-15), 1e-15);double d_L2 = (1.0 - y_true) / (1.0 - std::max(std::min(y_pred, 1.0 - 1e-15), 1e-15));// 计算predicted_prob对于总损失L的偏导数double d_L = d_L1 + d_L2;return d_L;}//单个数据 - 多分类double NetWork::categoricalCrossEntropyLoss(const Eigen::VectorXd& y_true,const Eigen::VectorXd& y_pred){int class_size = y_true.rows();// 类别数double loss = 0.0;for (int i = 0; i < class_size; i++){loss -= y_true(i) * log(std::max(std::min(y_pred(i), 1.0 - 1e-15), 1e-15));}return loss;// 求平均损失}// 计算交叉熵损失函数对 y_pred 的偏导数 - 单个数据 - 多分类Eigen::VectorXd NetWork::categoricalCrossEntropyLossDerivative(const Eigen::VectorXd& y_true, const Eigen::VectorXd& y_pred){int size = y_true.size();Eigen::VectorXd derivative(size);for (int i = 0; i < size; i++){derivative[i] = -y_true[i] / std::max(std::min(y_pred[i], 1.0 - 1e-15), 1e-15);}return derivative;}//多个数据 - 多分类double batchCategoricalCrossEntropy(const std::vector<std::vector<double>>& y_true,const std::vector<std::vector<double>>& y_pred) {int batch_size = y_true.size();int num_classes = y_true[0].size();double loss = 0.0;for (int i = 0; i < batch_size; i++) {for (int j = 0; j < num_classes; j++) {loss += -y_true[i][j] * log(std::max(std::min(y_pred[i][j], 1.0 - 1e-15), 1e-15));}}return loss / batch_size;}// 计算交叉熵损失函数对 y_pred 的偏导数 - 多分类
std::vector<std::vector<double>> batchCrossEntropyLossDerivative(const std::vector<std::vector<double>>& y_true,const std::vector<std::vector<double>>& y_pred) {int batch_size = y_true.size();int size = y_true[0].size();std::vector<std::vector<double>> derivative(batch_size, std::vector<double>(size, 0.0));for (int i = 0; i < batch_size; i++) {for (int j = 0; j < size; j++) {derivative[i][j] = -y_true[i][j] / std::max(std::min(y_pred[i][j], 1.0 - 1e-15), 1e-15);}}return derivative;
}

Hinge Loss:

用于支持向量机(SVM)和一些特定的分类问题。

Hinge Loss(合页损失)是一种常用的用于支持向量机(SVM)和一些分类任务的损失函数。它在处理二分类问题时非常常见,特别是用于支持向量机中的线性分类和最大间隔分类。

对于二分类问题,假设我们有一个批量样本,其中每个样本的真实标签为 y_true,模型预测的结果为 y_pred。Hinge Loss 的计算方法如下:

Hinge Loss = 1 N ∑ i = 1 N max ⁡ ( 0 , 1 − y true , i ⋅ y pred , i ) \text{Hinge Loss} = \frac{1}{N} \sum_{i=1}^{N} \max(0, 1 - y_{\text{true},i} \cdot y_{\text{pred},i}) Hinge Loss=N1i=1Nmax(0,1ytrue,iypred,i)

其中:

  • N N N 是样本数(Batch Size)。
  • y true , i y_{\text{true},i} ytrue,i 是第 i 个样本的真实标签,取值为+1或-1。
  • y pred , i y_{\text{pred},i} ypred,i 是第 i 个样本的模型预测结果,也是一个+1或-1的值。

Hinge Loss 衡量的是模型预测结果与真实标签之间的差异,并利用了间隔(margin)的概念。如果模型的预测结果与真实标签的符号相同,意味着预测正确,Hinge Loss 为0。如果预测结果与真实标签的符号相反,意味着预测错误,Hinge Loss 此时正比于预测结果与真实标签之差,当它大于1时损失开始增加。

Hinge Loss 的特点是,对于预测结果与真实标签的差异小于1的情况,损失为0,这被称为“合页点”(hinge point)。只有当预测结果与真实标签的差异大于等于1时,损失开始增加。

Hinge Loss 是一个非平滑的损失函数,因此其偏导数在某些点上不存在或为零。在通常情况下,Hinge Loss 的导数在预测结果与真实标签之差等于1的时候是不可导的(不连续)。然而,我们可以使用次梯度(subgradient)的概念来处理这个问题。

对于第 i 个样本的预测结果 y_pred[i],Hinge Loss 对 y_pred[i] 的偏导数公式如下:

$$
\frac{\partial \text{Hinge Loss}}{\partial y_{\text{pred}[i]}} =
\begin{cases}

  • y_{\text{true}[i]} & \text{if } 1 - y_{\text{true}[i]} \cdot y_{\text{pred}[i]} > 0 \
    0 & \text{otherwise}
    \end{cases}
    $$

其中:

  • y true [ i ] y_{\text{true}[i]} ytrue[i] 是第 i 个样本的真实标签,取值为+1或-1。
  • y pred [ i ] y_{\text{pred}[i]} ypred[i] 是第 i 个样本的模型预测结果,也是一个+1或-1的值。

在上面的偏导数公式中,如果预测结果与真实标签之差大于1(即 1 − y true [ i ] ⋅ y pred [ i ] > 0 1 - y_{\text{true}[i]} \cdot y_{\text{pred}[i]} > 0 1ytrue[i]ypred[i]>0),则偏导数为 -y_{\text{true}[i]}。否则,偏导数为0。

由于 Hinge Loss 在预测结果与真实标签之差等于1的点是不可导的,因此我们在这些点上使用次梯度 -y_{\text{true}[i]} 来近似表示导数的方向。

   Hinge Loss = max(0, 1 - y_true * y_pred)
#include <vector>
#include <algorithm>double hingeLoss(double y_true, double y_pred) {return std::max(0.0, 1 - y_true * y_pred);
}double batchHingeLoss(const std::vector<std::vector<double>>& y_true,const std::vector<std::vector<double>>& y_pred) {int batch_size = y_true.size();double loss = 0.0;for (int i = 0; i < batch_size; i++) {double max_margin = 0.0;for (size_t j = 0; j < y_true[i].size(); j++) {max_margin = std::max(max_margin, 1 - y_true[i][j] * y_pred[i][j]);}loss += max_margin;}return loss / batch_size;
}// 计算 Hinge Loss 函数对 y_pred 的偏导数
std::vector<double> hingeLossDerivative(const std::vector<double>& y_true, const std::vector<double>& y_pred) {int size = y_true.size();std::vector<double> derivative(size);for (int i = 0; i < size; i++) {derivative[i] = (y_true[i] * y_pred[i] < 1) ? -y_true[i] : 0;}return derivative;
}// 计算 Hinge Loss 函数对 y_pred 的偏导数
std::vector<std::vector<double>> batchHingeLossDerivative(const std::vector<std::vector<double>>& y_true,const std::vector<std::vector<double>>& y_pred) {int batch_size = y_true.size();int size = y_true[0].size();std::vector<std::vector<double>> derivative(batch_size, std::vector<double>(size, 0.0));for (int i = 0; i < batch_size; i++) {for (int j = 0; j < size; j++) {derivative[i][j] = (y_true[i][j] * y_pred[i][j] < 1) ? -y_true[i][j] : 0;}}return derivative;
}

交叉熵损失与对数似然损失(Log-Likelihood Loss):

  1. 对数似然损失(Log-Likelihood Loss)的偏导数:

假设我们有一个批量样本,其中每个样本有 C 个类别。y_true 表示真实标签的独热编码形式,y_pred 表示模型预测的类别概率向量。

对数似然损失函数的数学公式如下:

LogLikelihoodLoss = − 1 N ∑ i = 1 N ∑ j = 1 C y true , i , j ⋅ log ⁡ ( y pred , i , j ) \text{LogLikelihoodLoss} = -\frac{1}{N} \sum_{i=1}^{N} \sum_{j=1}^{C} y_{\text{true},i,j} \cdot \log(y_{\text{pred},i,j}) LogLikelihoodLoss=N1i=1Nj=1Cytrue,i,jlog(ypred,i,j)

其中:

  • N N N 是批量样本的数量(Batch Size)。
  • C C C 是类别的数量。
  • y true , i , j y_{\text{true},i,j} ytrue,i,j 表示第 i 个样本的真实标签中类别 j 的值,它是一个0或1的独热编码。
  • y pred , i , j y_{\text{pred},i,j} ypred,i,j 表示第 i 个样本的模型预测结果中类别 j 的概率。

对数似然损失函数对 y_pred 的偏导数公式如下:

∂ LogLikelihoodLoss ∂ y pred [ i ] [ j ] = − y true [ i ] [ j ] y pred [ i ] [ j ] \frac{\partial \text{LogLikelihoodLoss}}{\partial y_{\text{pred}[i][j]}} = -\frac{y_{\text{true}[i][j]}}{y_{\text{pred}[i][j]}} ypred[i][j]LogLikelihoodLoss=ypred[i][j]ytrue[i][j]

用于多类别分类问题,类似于分类问题中的交叉熵损失。

   Log-Likelihood Loss = -log(y_pred[y_true])
#include <cmath>double logLikelihoodLoss(double y_true[], double y_pred[], int classes) {double loss = 0.0;for (int i = 0; i < classes; i++) {loss -= y_true[i] * log(y_pred[i]);}return loss;
}double batchLogLikelihoodLoss(const std::vector<std::vector<double>>& y_true,const std::vector<std::vector<double>>& y_pred) {int batch_size = y_true.size();int num_classes = y_true[0].size();double loss = 0.0;for (int i = 0; i < batch_size; i++) {for (int j = 0; j < num_classes; j++) {loss += -y_true[i][j] * log(y_pred[i][j]);}}return loss / batch_size;
}// 对数似然损失函数对 y_pred 的偏导数
std::vector<std::vector<double>> batchLogLikelihoodLossDerivative(const std::vector<std::vector<double>>& y_true,const std::vector<std::vector<double>>& y_pred) {int batch_size = y_true.size();int num_classes = y_true[0].size();std::vector<std::vector<double>> derivative(batch_size, std::vector<double>(num_classes, 0.0));for (int i = 0; i < batch_size; i++) {for (int j = 0; j < num_classes; j++) {derivative[i][j] = -y_true[i][j] / y_pred[i][j];}}return derivative;
}

KL 散度损失(Kullback-Leibler Divergence Loss,KL Loss):

用于衡量两个概率分布之间的差异。

  1. KL 散度(Kullback-Leibler Divergence)的偏导数:

KL 散度用于衡量两个概率分布之间的距离。假设有两个概率分布 P P P Q Q Q,其中 y_true 表示真实概率分布的独热编码形式,y_pred 表示模型预测的概率分布。

KL 散度的数学公式如下:

KL ( P ∥ Q ) = ∑ i = 1 C P ( i ) ⋅ log ⁡ ( P ( i ) Q ( i ) ) \text{KL}(P \| Q) = \sum_{i=1}^{C} P(i) \cdot \log\left(\frac{P(i)}{Q(i)}\right) KL(PQ)=i=1CP(i)log(Q(i)P(i))

其中:

  • C C C 是类别的数量。
  • P ( i ) P(i) P(i) 表示真实概率分布中类别 i 的概率。
  • Q ( i ) Q(i) Q(i) 表示模型预测概率分布中类别 i 的概率。

KL 散度对 y_pred 的偏导数公式如下:

∂ KL ( P ∥ Q ) ∂ y pred [ i ] = − P ( i ) y pred [ i ] \frac{\partial \text{KL}(P \| Q)}{\partial y_{\text{pred}[i]}} = -\frac{P(i)}{y_{\text{pred}[i]}} ypred[i]KL(PQ)=ypred[i]P(i)

请注意,KL 散度是非对称的,即 KL ( P ∥ Q ) ≠ KL ( Q ∥ P ) \text{KL}(P \| Q) \neq \text{KL}(Q \| P) KL(PQ)=KL(QP),因此在计算时需要注意分子和分母的位置。

   KL Loss = Σ(y_true * log(y_true / y_pred))
#include <cmath>//单个数据
double klDivergenceLoss(double y_true[], double y_pred[], int classes) {double loss = 0.0;for (int i = 0; i < classes; i++) {if (y_true[i] != 0.0) {loss += y_true[i] * log(y_true[i] / y_pred[i]);}}return loss;
}
//多个数据
double batchKLDivergenceLoss(const std::vector<std::vector<double>>& y_true,const std::vector<std::vector<double>>& y_pred) {int batch_size = y_true.size();int num_classes = y_true[0].size();double loss = 0.0;for (int i = 0; i < batch_size; i++) {for (int j = 0; j < num_classes; j++) {if (y_true[i][j] != 0.0) {loss += y_true[i][j] * log(y_true[i][j] / y_pred[i][j]);}}}return loss / batch_size;
}// KL 散度对 y_pred 的偏导数
std::vector<std::vector<double>> batchKLDivergenceDerivative(const std::vector<std::vector<double>>& P,const std::vector<std::vector<double>>& Q) {int batch_size = P.size();int num_classes = P[0].size();std::vector<std::vector<double>> derivative(batch_size, std::vector<double>(num_classes, 0.0));for (int i = 0; i < batch_size; i++) {for (int j = 0; j < num_classes; j++) {derivative[i][j] = -P[i][j] / Q[i][j];}}return derivative;
}

余弦相似度损失(Cosine Similarity Loss):

用于度量向量之间的余弦相似度。

余弦相似度损失(Cosine Similarity Loss)是用于衡量向量之间相似度的一种损失函数。它通常用于训练嵌入模型(Embedding Model)或进行相关性学习任务,特别是在自然语言处理(NLP)和推荐系统等领域。

假设我们有一个批量样本,其中每个样本有两个向量表示,分别是 v1v2,余弦相似度损失的计算方法如下:

Cosine Similarity Loss = 1 N ∑ i = 1 N 1 − cosine_similarity ( v 1 i , v 2 i ) \text{Cosine Similarity Loss} = \frac{1}{N} \sum_{i=1}^{N} 1 - \text{cosine\_similarity}(v1_i, v2_i) Cosine Similarity Loss=N1i=1N1cosine_similarity(v1i,v2i)

其中:

  • N N N 是样本数(Batch Size)。
  • v 1 i v1_i v1i 是第 i 个样本的第一个向量。
  • v 2 i v2_i v2i 是第 i 个样本的第二个向量。
  • cosine_similarity ( v 1 i , v 2 i ) \text{cosine\_similarity}(v1_i, v2_i) cosine_similarity(v1i,v2i) 是计算向量 v1_iv2_i 之间的余弦相似度。

余弦相似度是一个衡量两个向量方向之间相似程度的指标,取值范围在 -1 到 1 之间。当余弦相似度为1时,表示两个向量完全相似;当余弦相似度为-1时,表示两个向量完全相反;当余弦相似度为0时,表示两个向量正交(垂直)。

余弦相似度损失的计算是通过计算向量之间的余弦相似度并将其从1中减去,然后对所有样本取平均得到最终的损失值。这样做的目的是使余弦相似度尽可能接近1,从而提高向量之间的相似度。

为了计算余弦相似度损失(Cosine Similarity Loss)对向量 v1_iv2_i 的偏导数,我们需要先计算余弦相似度对向量的偏导数,然后再根据链式法则将其传递给损失函数。在以下偏导数公式中,v1_iv2_i 表示第 i 个样本的两个向量。

设余弦相似度为 cos_sim \text{cos\_sim} cos_sim,则余弦相似度损失对向量 v1_i 的偏导数为:

∂ Cosine Similarity Loss ∂ v 1 i = − 1 N ( 1 − cos_sim ( v 1 i , v 2 i ) ) ∂ cos_sim ( v 1 i , v 2 i ) ∂ v 1 i \frac{\partial \text{Cosine Similarity Loss}}{\partial v1_i} = - \frac{1}{N} \left(1 - \text{cos\_sim}(v1_i, v2_i)\right) \frac{\partial \text{cos\_sim}(v1_i, v2_i)}{\partial v1_i} v1iCosine Similarity Loss=N1(1cos_sim(v1i,v2i))v1icos_sim(v1i,v2i)

余弦相似度损失对向量 v2_i 的偏导数为:

∂ Cosine Similarity Loss ∂ v 2 i = − 1 N ( 1 − cos_sim ( v 1 i , v 2 i ) ) ∂ cos_sim ( v 1 i , v 2 i ) ∂ v 2 i \frac{\partial \text{Cosine Similarity Loss}}{\partial v2_i} = - \frac{1}{N} \left(1 - \text{cos\_sim}(v1_i, v2_i)\right) \frac{\partial \text{cos\_sim}(v1_i, v2_i)}{\partial v2_i} v2iCosine Similarity Loss=N1(1cos_sim(v1i,v2i))v2icos_sim(v1i,v2i)

接下来,我们需要计算余弦相似度对向量的偏导数。假设向量 v1_iv2_i 的维度都为 d,则余弦相似度 cos_sim ( v 1 i , v 2 i ) \text{cos\_sim}(v1_i, v2_i) cos_sim(v1i,v2i) 的计算方法为:

cos_sim ( v 1 i , v 2 i ) = v 1 i ⋅ v 2 i ∥ v 1 i ∥ ⋅ ∥ v 2 i ∥ \text{cos\_sim}(v1_i, v2_i) = \frac{v1_i \cdot v2_i}{\|v1_i\| \cdot \|v2_i\|} cos_sim(v1i,v2i)=v1iv2iv1iv2i

其中 ⋅ \cdot 表示向量的点积, ∥ ⋅ ∥ \| \cdot \| 表示向量的范数(模长)。

现在,我们计算余弦相似度对向量 v1_i 的偏导数:

∂ cos_sim ( v 1 i , v 2 i ) ∂ v 1 i = v 2 i ∥ v 1 i ∥ ⋅ ∥ v 2 i ∥ − v 1 i ⋅ v 2 i ∥ v 1 i ∥ 3 ⋅ ∥ v 2 i ∥ v 1 i \frac{\partial \text{cos\_sim}(v1_i, v2_i)}{\partial v1_i} = \frac{v2_i}{\|v1_i\| \cdot \|v2_i\|} - \frac{v1_i \cdot v2_i}{\|v1_i\|^3 \cdot \|v2_i\|} v1_i v1icos_sim(v1i,v2i)=v1iv2iv2iv1i3v2iv1iv2iv1i

接着,我们计算余弦相似度对向量 v2_i 的偏导数:

∂ cos_sim ( v 1 i , v 2 i ) ∂ v 2 i = v 1 i ∥ v 1 i ∥ ⋅ ∥ v 2 i ∥ − v 1 i ⋅ v 2 i ∥ v 1 i ∥ ⋅ ∥ v 2 i ∥ 3 v 2 i \frac{\partial \text{cos\_sim}(v1_i, v2_i)}{\partial v2_i} = \frac{v1_i}{\|v1_i\| \cdot \|v2_i\|} - \frac{v1_i \cdot v2_i}{\|v1_i\| \cdot \|v2_i\|^3} v2_i v2icos_sim(v1i,v2i)=v1iv2iv1iv1iv2i3v1iv2iv2i

最后,我们将上述结果代入余弦相似度损失对向量的偏导数公式,得到最终的偏导数计算公式。

请注意,对于余弦相似度损失函数的偏导数计算,需要根据具体的向量表示和损失函数的定义进行推导。以上给出的是一种常见情况下的计算方法,实际应用中可能会根据具体的问题和模型定义进行调整。

   Cosine Similarity Loss = 1 - (y_true * y_pred) / (||y_true|| * ||y_pred||)
#include <cmath>
//单个数据
double cosineSimilarityLoss(double y_true[], double y_pred[], int dimensions) {double dotProduct = 0.0;double norm_y_true = 0.0;double norm_y_pred = 0.0;for (int i = 0; i < dimensions; i++) {dotProduct += y_true[i] * y_pred[i];norm_y_true += pow(y_true[i], 2);norm_y_pred += pow(y_pred[i], 2);}norm_y_true = sqrt(norm_y_true);norm_y_pred = sqrt(norm_y_pred);double similarity = dotProduct / (norm_y_true * norm_y_pred);return 1 - similarity;
}//多个数据
double batchCosineSimilarityLoss(const std::vector<std::vector<double>>& y_true,const std::vector<std::vector<double>>& y_pred) {int batch_size = y_true.size();int dimensions = y_true[0].size();double loss = 0.0;for (int i = 0; i < batch_size; i++) {double dotProduct = 0.0;double norm_y_true = 0.0;double norm_y_pred = 0.0;for (int j = 0; j < dimensions; j++) {dotProduct += y_true[i][j] * y_pred[i][j];norm_y_true += pow(y_true[i][j], 2);norm_y_pred += pow(y_pred[i][j], 2);}norm_y_true = sqrt(norm_y_true);norm_y_pred = sqrt(norm_y_pred);double similarity = dotProduct / (norm_y_true * norm_y_pred);loss += 1 - similarity;}return loss / batch_size;
}// 计算余弦相似度损失函数对 y_pred 的偏导数
std::vector<double> cosineSimilarityLossDerivative(const std::vector<double>& y_true, const std::vector<double>& y_pred) {int size = y_true.size();std::vector<double> derivative(size);double norm_y_true = 0.0;double norm_y_pred = 0.0;double dotProduct = 0.0;for (int i = 0; i < size; i++) {dotProduct += y_true[i] * y_pred[i];norm_y_true += pow(y_true[i], 2);norm_y_pred += pow(y_pred[i], 2);}norm_y_true = sqrt(norm_y_true);norm_y_pred = sqrt(norm_y_pred);for (int i = 0; i < size; i++) {derivative[i] = (y_true[i] / (norm_y_true * norm_y_pred)) - (dotProduct * pow(y_true[i], 2) / pow(norm_y_true, 3) * norm_y_pred);}return derivative;
}// 计算余弦相似度损失函数对 y_pred 的偏导数
std::vector<std::vector<double>> batchCosineSimilarityLossDerivative(const std::vector<std::vector<double>>& y_true,const std::vector<std::vector<double>>& y_pred) {int batch_size = y_true.size();int size = y_true[0].size();std::vector<std::vector<double>> derivative(batch_size, std::vector<double>(size, 0.0));for (int i = 0; i < batch_size; i++) {double norm_y_true = 0.0;double norm_y_pred = 0.0;double dotProduct = 0.0;for (int j = 0; j < size; j++) {dotProduct += y_true[i][j] * y_pred[i][j];norm_y_true += pow(y_true[i][j], 2);norm_y_pred += pow(y_pred[i][j], 2);}norm_y_true = sqrt(norm_y_true);norm_y_pred = sqrt(norm_y_pred);for (int j = 0; j < size; j++) {derivative[i][j] = (y_true[i][j] / (norm_y_true * norm_y_pred)) - (dotProduct * pow(y_true[i][j], 2) / pow(norm_y_true, 3) * norm_y_pred);}}return derivative;
}

信息熵损失(Entropy Loss):

用于最大化预测的不确定性,通常在生成模型中使用。

信息熵损失(Entropy Loss),也称为交叉熵损失(Cross-Entropy Loss),是一种用于衡量分类模型预测结果与真实标签之间差异的常用损失函数。它通常用于多类别分类问题,尤其是在神经网络中用于训练分类任务。

假设我们有一个批量样本,其中每个样本的真实标签用独热编码表示为 y_true,模型预测的类别概率向量为 y_pred。信息熵损失的计算方法如下:

Entropy Loss = − 1 N ∑ i = 1 N ∑ j = 1 C y true , i , j ⋅ log ⁡ ( y pred , i , j ) \text{Entropy Loss} = - \frac{1}{N} \sum_{i=1}^{N} \sum_{j=1}^{C} y_{\text{true},i,j} \cdot \log(y_{\text{pred},i,j}) Entropy Loss=N1i=1Nj=1Cytrue,i,jlog(ypred,i,j)

其中:

  • N N N 是样本数(Batch Size)。
  • C C C 是类别的数量。
  • y true , i , j y_{\text{true},i,j} ytrue,i,j 表示第 i 个样本的真实标签中类别 j 的值,它是一个0或1的独热编码。
  • y pred , i , j y_{\text{pred},i,j} ypred,i,j 表示第 i 个样本的模型预测结果中类别 j 的概率。

信息熵是信息论中的概念,用于衡量随机变量的不确定性。在分类任务中,信息熵损失函数的作用是最小化模型预测的类别概率分布与真实标签的差异,使得模型能够更好地预测正确类别。当模型的预测结果与真实标签完全匹配时,损失为0。信息熵损失越小,表示模型的预测结果与真实标签越接近,即模型的性能越好。

要计算信息熵损失(Entropy Loss)对模型预测结果 y_pred 的偏导数,我们需要使用链式法则(Chain Rule)来求解。在以下偏导数公式中,y_true 表示真实标签的独热编码形式,y_pred 表示模型预测的类别概率向量。

对于第 i 个样本的第 j 个类别,信息熵损失函数对 y_pred[i][j] 的偏导数公式如下:

∂ Entropy Loss ∂ y pred [ i ] [ j ] = − y true [ i ] [ j ] y pred [ i ] [ j ] \frac{\partial \text{Entropy Loss}}{\partial y_{\text{pred}[i][j]}} = - \frac{y_{\text{true}[i][j]}}{y_{\text{pred}[i][j]}} ypred[i][j]Entropy Loss=ypred[i][j]ytrue[i][j]

其中:

  • y true [ i ] [ j ] y_{\text{true}[i][j]} ytrue[i][j] 是第 i 个样本的真实标签中类别 j 的值,它是一个0或1的独热编码。
  • y pred [ i ] [ j ] y_{\text{pred}[i][j]} ypred[i][j] 是第 i 个样本的模型预测结果中类别 j 的概率。

这个公式表示在信息熵损失函数中,对于每个样本的每个类别,偏导数的值是真实标签中类别值与模型预测结果中类别概率的比值的负数。

请注意,信息熵损失函数对于真实标签中非零值(即对应真实类别的位置)的偏导数是负无穷大,因为在这些位置上 y_{\text{true}[i][j]} 是1,而 y_{\text{pred}[i][j]} 逼近于0,导致分母接近于0。这就是为什么在实际应用中,通常使用计算机的浮点数精度范围内的小值(如1e-9)来避免除以0的情况,从而保证计算的稳定性。

   Entropy Loss = -Σ(y_pred * log(y_pred))
#include <cmath>
//单个数据
double entropyLoss(double y_pred[], int classes) {double loss = 0.0;for (int i = 0; i < classes; i++) {if (y_pred[i] != 0.0) {loss -= y_pred[i] * log(y_pred[i]);}}return loss;
}//多个数据
double batchEntropyLoss(const std::vector<std::vector<double>>& y_pred) {int batch_size = y_pred.size();int num_classes = y_pred[0].size();double loss = 0.0;for (int i = 0; i < batch_size; i++) {for (int j = 0; j < num_classes; j++) {if (y_pred[i][j] != 0.0) {loss += y_pred[i][j] * log(y_pred[i][j]);}}}return -loss / batch_size;
}// 计算信息熵损失函数对 y_pred 的偏导数
std::vector<double> entropyLossDerivative(const std::vector<double>& y_pred) {int size = y_pred.size();std::vector<double> derivative(size);for (int i = 0; i < size; i++) {derivative[i] = -log(y_pred[i]) - 1;}return derivative;
}// 计算信息熵损失函数对 y_pred 的偏导数
std::vector<std::vector<double>> batchEntropyLossDerivative(const std::vector<std::vector<double>>& y_pred) {int batch_size = y_pred.size();int size = y_pred[0].size();std::vector<std::vector<double>> derivative(batch_size, std::vector<double>(size, 0.0));for (int i = 0; i < batch_size; i++) {for (int j = 0; j < size; j++) {derivative[i][j] = -log(y_pred[i][j]) - 1;}}return derivative;
}

我们假设输入数据是一个二维矩阵,其中每一行代表一个样本,每一列代表样本的特征。我们将使用C++标准库的向量来表示这些矩阵,并根据需要实现批量样本的损失函数。

相关文章:

神经网络系列---损失函数

文章目录 损失函数均方误差&#xff08;Mean Squared Error&#xff0c;MSE&#xff09;&#xff1a;平均绝对误差&#xff08;Mean Absolute Error&#xff0c;MAE&#xff09;&#xff1a;交叉熵损失函数&#xff08;Cross-Entropy Loss&#xff09;&#xff1a;Hinge Loss&a…...

LeetCode每日一题 有效的字母异位词(哈希表)

题目描述 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。注意&#xff1a;若 s 和 t 中每个字符出现的次数都相同&#xff0c;则称 s 和 t 互为字母异位词。 示例 1&#xff1a; 输入: s "anagram", t "nagaram" 输…...

设计模式学习笔记 - 面向对象 - 8.实践:贫血模型和充血模型的原理及实践

1.Web开发常用的贫血MVC架构违背OOP吗&#xff1f; 前面我们依据讲过了面向对象四大特性、接口和抽象类、面向对象和面向过程编程风格&#xff0c;基于接口而非实现编程和多用组合少用继承设计思想。接下来&#xff0c;通过实战来学习如何将这些理论应用到实际的开发中。 大部…...

AI新纪元:可能的盈利之道

本文来源于Twitter大神宝玉&#xff08;dotey&#xff09;在聊 Sora 的时候&#xff0c;总结了 Sora 的价值和可能的盈利方向&#xff0c;我把这部分内容单独摘出来再整理一下。现在的生成式 AI 大家应该不陌生&#xff0c;用它总结文章、翻译、写作、画图&#xff0c;当然真正…...

k8s的svc流量通过iptables和ipvs转发到pod的流程解析

文章目录 1. k8s的svc流量转发1.1 service 说明1.2 endpoints说明1.3 pod 说明1.4 svc流量转发的主要工作 2. iptables规则解析2.1 svc涉及的iptables链流程说明2.2 svc涉及的iptables规则实例2.2.1 KUBE-SERVICES规则链2.2.2 KUBE-SVC-EFPSQH5654KMWHJ5规则链2.2.3 KUBE-SEP-L…...

【踩坑】修复报错 you should not try to import numpy from its source directory

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.cn] 报错如下&#xff1a; 修复方法一&#xff1a; pip install pyinstaller5.9 修复方法二&#xff1a; pip install numpy1.24.1...

预测脱碳企业的信用评级-论文代码复现

文献来源 【Forecasting credit ratings of decarbonized firms: Comparative assessmentof machine learning models】 文章有代码复现有两个基本工作&#xff0c;1.是提取每个算法的重要性&#xff1b;2.计算每个算法的评价指标 算法有 CRT 分类决策树 ANN 人工神经网络 R…...

目标检测——KITTI目标跟踪数据集

KITTI目标跟踪数据集是由德国卡尔斯鲁厄理工学院和丰田美国技术研究院联合创建的一个大规模自动驾驶场景下的计算机视觉算法评测数据集。这个数据集主要用于评估立体图像、光流、视觉测距、3D物体检测和3D跟踪等计算机视觉技术在车载环境下的性能这个数据集包含了在市区、乡村和…...

25-k8s集群中-RBAC用户角色资源权限

一、RBAC概述 1&#xff0c;k8s集群的交互逻辑&#xff08;简单了解&#xff09; 我们通过k8s各组件架构&#xff0c;知道各个组件之间是使用https进行数据加密及交互的&#xff0c;那么同理&#xff0c;我们作为“使用”k8s的各种资源的使用者&#xff0c;也是通过https进行数…...

Android 面试问题 2024 版(其二)

Android 面试问题 2024 版&#xff08;其二&#xff09; 六、多线程和并发七、性能优化八、测试九、安全十、Material设计和 **UX/UI** 六、多线程和并发 Android 中的进程和线程有什么区别&#xff1f; 答&#xff1a;进程是在自己的内存空间中运行的应用程序的单独实例&…...

SpringMVC的异常处理

异常分类 : 预期异常(检查型异常)和运行时异常 1、使用@ExceptionHandle注解处理异常 @ExceptionHandle(value={***.class} 异常类型) public modelandview handelException(){} 仅限当前类使用 2、全局处理方式 @ControllerAdvice + @ExceptionHandle 新建类 @Cont…...

【计算机网络】1 因特网概述

一.网络、互联网和因特网 1.网络&#xff08;network&#xff09;&#xff0c;由若干结点&#xff08;node&#xff09;和连接这些结点的链路&#xff08;link&#xff09;组成。 2.多个网络还可以通过路由器互联起来&#xff0c;这样就构成了一个覆盖范围更大的网络&#xf…...

【Ubuntu】Anaconda的安装和使用

目录 1 安装 2 使用 1 安装 &#xff08;1&#xff09;下载安装包 官网地址&#xff1a;Unleash AI Innovation and Value | Anaconda 点击Free Download 按键。 然后 点击下图中的Download开始下载安装包。 &#xff08;2&#xff09;安装 在安装包路径下打开终端&#…...

OpenAI推出首个AI视频模型Sora:重塑视频创作与体验

链接&#xff1a;华为OD机考原题附代码 Sora - 探索AI视频模型的无限可能 随着人工智能技术的飞速发展&#xff0c;AI视频模型已成为科技领域的新热点。而在这个浪潮中&#xff0c;OpenAI推出的首个AI视频模型Sora&#xff0c;以其卓越的性能和前瞻性的技术&#xff0c;引领着…...

mybatis总结传参三

十、&#xff08;不推荐&#xff09;多个参数-按位置传参 参数位置从 0 开始&#xff0c; 引用参数语法 #{ arg 位置 } &#xff0c; 第一个参数是 #{arg0}, 第二个是 #{arg1} 注意&#xff1a; mybatis-3.3 版本和之前的版本使用 #{0},#{1} 方式&#xff0c; 从 myba…...

JSONVUE

1.JSON学习 1.概念: JSON是把JS对象变成字符串. 2.作用: 多用于网络中数据传输. JavaScript对象 let person{name:"张三",age:18}//将JS对象转换为 JSON数据let person2JSON{"name":"张三","age":18}; 3.JS对象与JSON字符串转换…...

OSCP靶机--Medjed

OSCP靶机–Medjed 考点&#xff1a;(1.ftp文件上传 2.sql注入写shell 3.第三软件提权) 1.nmap ┌──(root㉿kali)-[~/Desktop] └─# nmap 192.168.200.127 -sV -sC -p- --min-rate 5000 Starting Nmap 7.92 ( https://nmap.org ) at 2024-02-25 19:42 EST Nmap scan repo…...

【Unity】Unity与安卓交互

问题描述 Unity和安卓手机进行交互&#xff0c;是我们开发游戏中最常见的场景。本教程将从一个简单的例子来演示一下。 本教程需要用到Android Studio2021.1.1 1.Android Studio新建一个工程 2.选择Empty Activity 然后点击Next 3.点击Finish完成创建 4.选择File-New-New Mo…...

QYFB-02 无线风力报警仪 风速风向超限声光报警

产品概述 无线风力报警仪是由测控报警仪、无线风速风向传感器和太阳能供电盒组成&#xff0c;可观测大气中的瞬时风速&#xff0c;具有风速报警设定和报警输出控制功能&#xff1b;风力报警仪采用无线信号传输、显示屏输出&#xff0c;风速显示采用高亮LED数码管显示&#xff…...

css知识:盒模型盒子塌陷BFC

1. css盒模型 标准盒子模型&#xff0c;content-box 设置宽度即content的宽度 width content 总宽度content&#xff08;width设定值&#xff09; padding border IE/怪异盒子模型&#xff0c;border-box width content border padding 总宽度 width设定值 2. 如何…...

Nginx的反向代理:实现灵活的请求转发和内容缓存

一、引言&#xff1a;代理服务器的简介 本节介绍代理服务器的基本配置。学习如何通过不同协议将 NGINX 请求传递给代理的服务器&#xff0c;修改发送到代理服务器的客户端请求标头&#xff0c;以及配置来自代理服务器的响应缓冲。 代理通常用于在多个服务器之间分配负载&…...

免费享受企业级安全:雷池社区版WAF,高效专业的Web安全的方案

网站安全成为了每个企业及个人不可忽视的重要议题。 随着网络攻击手段日益狡猾和复杂&#xff0c;选择一个强大的安全防护平台变得尤为关键。 推荐的雷池社区版——一个为网站提供全面安全防护解决方案的平台&#xff0c;它不仅具备高效的安全防护能力&#xff0c;还让网站安…...

基于SpringBoot的航班进出港管理系统

文章目录 项目介绍主要功能截图&#xff1a;部分代码展示设计总结项目获取方式 &#x1f345; 作者主页&#xff1a;超级无敌暴龙战士塔塔开 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 &…...

Odoo系统安装部署并结合内网穿透实现固定域名访问本地ERP系统

文章目录 前言1. 下载安装Odoo&#xff1a;2. 实现公网访问Odoo本地系统&#xff1a;3. 固定域名访问Odoo本地系统 前言 Odoo是全球流行的开源企业管理套件&#xff0c;是一个一站式全功能ERP及电商平台。 开源性质&#xff1a;Odoo是一个开源的ERP软件&#xff0c;这意味着企…...

幻兽帕鲁(Palworld 1.4.1)私有服务器搭建(docker版)

文章目录 说明客户端安装服务器部署1Panel安装和配置docker服务初始化设置设置开机自启动设置镜像加速 游戏服务端部署游戏服务端参数可视化配置 Palworld连接服务器问题总结 说明 服务器硬件要求&#xff1a;Linux系统/Window系统&#xff08;x86架构&#xff0c;armbian架构…...

好书推荐丨细说Python编程:从入门到科学计算

文章目录 写在前面Python简介推荐图书内容简介编辑推荐作者简介 推荐理由粉丝福利写在最后 写在前面 本期博主给大家推荐一本Python基础入门的全新正版书籍&#xff0c;对Python、机器学习、人工智能感兴趣的小伙伴们快来看看吧~ Python简介 Python 是一种广泛使用的高级、解…...

智慧城市与数字孪生:共创未来城市新篇章

一、引言 随着科技的飞速发展&#xff0c;智慧城市与数字孪生已成为现代城市建设的核心议题。智慧城市注重利用先进的信息通信技术&#xff0c;提升城市治理水平&#xff0c;改善市民生活品质。而数字孪生则通过建立物理城市与数字模型之间的连接&#xff0c;为城市管理、规划…...

Java数据结构---初识集合框架

目录 一、什么是集合框架 二、集合框架的重要性 三、背后涉及的数据结构及算法 1.什么是数据结构 2.容器背后对应的数据结构 3.相关的Java知识 4.什么是算法 一、什么是集合框架 Java 集合框架 Java Collection Framework &#xff0c;又被称为容器 container &#xff0…...

Spring Cloud学习

1、什么是SpringCloud Spring cloud 流应用程序启动器是基于 Spring Boot 的 Spring 集成应用程序&#xff0c;提供与外部系统的集成。Spring cloud Task&#xff0c;一个生命周期短暂的微服务框架&#xff0c;用于快速构建执行有限数据处理的应用程序。Spring cloud 流应用程…...

【计算机网络】1.4 接入网和物理媒体

1.4 接入网和物理媒体 问题&#xff1a;怎样将端系统和边缘路由器连接&#xff1f; 答&#xff1a;有线方式&#xff08;住宅接入网络、单位接入网络等&#xff09;或无线方式&#xff08;无线接入网络&#xff09;。 有线接入方式 光纤同轴混合网是基于已有的有线电视网开发的…...

关于螺栓的基本拧紧技术了解多少——SunTorque智能扭矩系统

螺栓是机械中常见的紧固件之一&#xff0c;用于将两个或多个部件连接在一起&#xff0c;并保持它们之间的紧密配合。拧紧螺栓是一项基本的技术&#xff0c;但在实际操作中&#xff0c;许多工人并不了解正确的拧紧方法&#xff0c;从而导致螺栓松动、连接失效等问题的出现。因此…...

C# .Net 发布后,把dll全部放在一个文件夹中,让软件目录更整洁

PublishFolderCleaner – Github 测试环境: .Net 8 Program.cs 代码 // https://github.com/dotnet-campus/dotnetcampus.DotNETBuildSDK/tree/master/PublishFolderCleanerusing System.Diagnostics; using System.Text;// 名称, 不用写 .exe var exeName "AbpDemo&…...

[更新]ARCGIS之土地耕地占补平衡、进出平衡系统报备坐标txt格式批量导出工具(定制开发版)

序言 之前开发的耕地占补平衡报备格式&#xff0c;现在之前的基础上集成了耕地进出平衡报备格式导出。 之前版本软件详见&#xff1a;软件介绍 一、软件简介 本软件是基于arcgis二次开发的工具&#xff08;插件&#xff09;&#xff0c;需要授权后才能使用&#xff1b; 本软件…...

todolist

一开始想自己写个todolist的网页&#xff0c;一直没时间&#xff0c;直接拿这个博客记录了&#xff0c;因为仅我可见比较麻烦&#xff0c;就放在全部可见记录了 目录 2024年3月todoes了解一下深入学习k8s&#xff0c;比如pod运行多个容器 &#xff0c;编写自己的镜像 2024年2月…...

【Java程序设计】【C00307】基于Springboot的基Hadoop的物品租赁管理系统(有论文)

基于Springboot的基Hadoop的物品租赁管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的基于 Hadoop的物品租赁系统的设计与实现&#xff0c;本系统有管理员、用户二种角色权限&#xff1b; 前台首页&#…...

GIT中对子仓库的使用方法介绍

git 子仓库 主仓库中添加子仓库 git submodule add <url> <path>更新子代码代码 git submodule update --init克隆含有子仓库的仓库 git clone --recurse-submodules <url>主仓库中删除子仓库 1、进入包含子仓库的父仓库的根目录 2、使用以下命令将子仓…...

ClickHouse 指南(三)最佳实践 -- 跳数索引

Data Skipping Indexes Data Skipping Indexes 2 1、简介 影响ClickHouse查询性能的因素很多。在大多数情况下&#xff0c;关键因素是ClickHouse在计算查询WHERE子句条件时是否可以使用主键。因此&#xff0c;选择适用于最常见查询模式的主键对于有效的表设计至关重要。 然…...

Mybatis总结--传参二

#叫做占位符 Mybatis是封装的JDBC 增强版 内部还是用的jdbc 每遇到一个#号 这里就会变为&#xff1f;占位符 一个#{}就是对应一个问号 一个占位符 用这个对象执行sql语句没有sql注入的风险 八、多个参数-使用Param 当 Dao 接口方法有多个参数&#xff0c;需要通过名称使…...

2024年数字化转型风口趋势大赏

人工智能和自动化确实为提高效率和数据驱动的见解提供了巨大的潜力&#xff0c;但这些技术无法完全取代人类技能和情境决策。在混合模型中将人工智能功能与人类专业知识相结合的企业将实现最大的效益。 随着人工智能和自动化的不断发展&#xff0c;企业必须调整其战略、流程和人…...

某款服务器插上4张TDP功耗75瓦PCIE卡无法开机的调试过程

1.服务器厂家说这款服务器测过别家的4卡&#xff0c;所以一开始并没有怀疑服务器硬件有问题 2.拔掉另外三张&#xff0c;只保留cpu0对应的riser0 slot0上的一张卡&#xff0c;仍然无法开机。 3.怀疑是这张pcie卡bar空间太大导致。换另一款bar空间小的卡&#xff0c;仍然无法开…...

数据结构与算法——排序算法

目录 文章目录 前言 一.排序的基本概念 1.什么是就地排序 2.什么是内部排序和外部排序 3.什么是稳定排序 4.判定一个排序算法的是稳定的 二.插入排序算法 1.直接插入排序 1.1基本思想 1.2复杂度 1.3稳定性 1.4代码演示 2.折半插入排序 2.1基本思想 2.2性能 3.…...

阿里巴巴alibaba API商品详情接口系列(商品属性,价格,主图)阿里巴巴alibaba根据ID取商品详情 API 返回值说明

阿里巴巴Alibaba的API商品详情接口系列通常用于获取指定商品的详细信息&#xff0c;包括商品属性、价格、主图等。与来赞达Lazada的API类似&#xff0c;具体的返回值可能会根据API的版本和阿里巴巴平台的更新而有所不同。 以下是一个假设的阿里巴巴API商品详情接口的返回值示例…...

lcd画圆

//****************************************************************** //函数名&#xff1a; _draw_circle_8 //功能&#xff1a; 8对称性画圆算法(内部调用) //输入参数&#xff1a;(xc,yc) :圆中心坐标 // (x,y):光标相对于圆心的坐标 // c:填…...

React组件详解

React组件分为两大类 1.函数组件 2.类组件&#xff08;最常用&#xff09; 组件化 import ReactDom from "react-dom";// // 1.通过函数创建一个组件 // 2.函数名字必须大写开头 // 3.函数必须有返回值 function Func1() {return <h2>这是一个基础组件</h…...

C++面试:内存溢出、内存泄漏的原因与解决

目录 内存溢出&#xff08;Memory Overflow&#xff09; 内存溢出介绍 解决内存溢出问题的方法 内存泄漏&#xff08;Memory Leak&#xff09; 内存泄露基础 解决内存泄漏问题的方法 内存溢出&#xff08;Memory Overflow&#xff09; 内存溢出介绍 内存溢出是指程序在执…...

【Java程序员面试专栏 算法思维】二 高频面试算法题:二分查找

一轮的算法训练完成后,对相关的题目有了一个初步理解了,接下来进行专题训练,以下这些题目就是汇总的高频题目,本篇主要聊聊二分查找,包括基础二分,寻找目标值的左右边界,搜索旋转数组以及波峰,以及x的平方根问题,所以放到一篇Blog中集中练习 题目关键字解题思路时间空…...

kaldi 详细安装教程、PyTorch-Kaldi、TIMIT下载、Librispeech下载

kaldi 详细安装教程 本kaldi 安装教程 转载于该链接kaldi 详细安装教程 安装系统依赖&#xff08;如果经常使用linux 服务器&#xff0c;一般都会有&#xff09; apt-get updateapt-get install -y --no-install-recommends g make automake autoconf bzip2 unzip wget sox …...

EtherCAT 转 ModbusTCP 网关

功能概述 本产品是 EtherCAT 和 Modbus TCP 网关&#xff0c;使用数据映射方式工作。 本产品在 EtherCAT 侧作为 EtherCAT 从站&#xff0c;接 TwinCAT 、CodeSYS 、PLC 等&#xff1b;在 ModbusTCP 侧做为 ModbusTCP 主站&#xff08;Client&#xff09;或从站&#xff08;Se…...

iMazing2024Windows和Mac的iOS设备管理软件(可以替代iTunes进行数据备份和管理)

iMazing2024是一款兼容 Windows 和 Mac 的 iOS 设备管理软件&#xff0c;可以替代 iTunes 进行数据备份和管理。以下是一些 iMazing 的主要功能和优点&#xff1a; 数据备份和恢复&#xff1a;iMazing 提供了强大的数据备份和恢复功能&#xff0c;可以备份 iOS 设备上的各种数据…...

carpower

车载android 电源管理 车载音响电源管理器_definitely的技术博客_51CTO博客...