神经网络基础之正则化
引言:
正则化
(Regularization) 是机器学习中一种用于防止模型过拟合技术。核心思想是通过在模型损失函数中添加一个惩罚项 (Penalty Term),对模型的复杂度进行约束,从而提升模型在新数据上的泛化能力。
一、正则化目的
防止过拟合
:当模型过于复杂(例如神经网络层数过多、参数过多)时,容易在训练数据上“记忆”噪声或细节,导致在测试数据上表现差。简化模型
:正则化通过限制模型参数的大小或数量,迫使模型学习更通用的特征,而非过度依赖训练数据的细节。
二、正则化原理
正则化的本质是在损失函数(Loss Function)中添加一个 惩罚项
,其形式为:
总损失 = 原始损失 + λ ⋅ 惩罚项 \text{总损失} = \text{原始损失} + \lambda \cdot \text{惩罚项} 总损失=原始损失+λ⋅惩罚项
原始损失
:模型在训练数据上的误差(如均方误差、交叉熵等)。惩罚项
:对模型参数的约束,例如参数的大小或稀疏性。λ
:正则化系数,控制惩罚项的强度。λ越大,惩罚越强,模型越简单。
三、 常见正则化方法
1. L1 正则化(Lasso 正则化):
-
定义:通过在损失函数中添加权重的 L1 范数惩罚项,使部分权重趋于零达到特征选择的效果。
-
算法原理:
在机器学习中,模型通过最小化损失函数进行训练。L1 正则化在原始损失函数中添加一个基于参数 L1 范数的惩罚项,优化目标变为:
J ( θ ) = L ( θ ) + λ ⋅ R ( θ ) J(\theta) = L(\theta) + \lambda \cdot R(\theta) J(θ)=L(θ)+λ⋅R(θ)
其中:
- J ( θ ) J(\theta) J(θ):总损失函数(带正则化的目标函数)。
- L ( θ ) L(\theta) L(θ):原始损失函数(例如均方误差、交叉熵等),衡量模型预测与真实值的差距。
- R ( θ ) = ∥ θ ∥ 1 = ∑ i ∣ θ i ∣ R(\theta) = \|\theta\|_1 = \sum_{i} |\theta_i| R(θ)=∥θ∥1=∑i∣θi∣
惩罚项
:L1 正则化项,即参数绝对值之和
。 - λ \lambda λ:正则化强度的超参数(惩罚系数),控制正则化的影响程度, λ ≥ 0 \lambda \geq 0 λ≥0。
- θ \theta θ:模型的参数(权重)。
通过最小化 J ( θ ) J(\theta) J(θ),模型不仅要拟合数据,还要尽量减少参数的绝对值总和,这会导致部分参数被压缩到 0。
- 梯度更新原理:
由于 L1 范数的绝对值函数在 0 点不可导,梯度更新需要使用次梯度(subgradient)。以一个权重 w w w 为例:
- 原始梯度更新(无正则化): w ← w − η ∂ L ∂ w w \leftarrow w - \eta \frac{\partial L}{\partial w} w←w−η∂w∂L。
- 带 L1 正则化的次梯度更新:
w ← w − η ( ∂ L ∂ w + λ ⋅ sign ( w ) ) w \leftarrow w - \eta \left( \frac{\partial L}{\partial w} + \lambda \cdot \text{sign}(w) \right) w←w−η(∂w∂L+λ⋅sign(w))- η \eta η:学习率。
- ∂ L ∂ w \frac{\partial L}{\partial w} ∂w∂L:原始损失对权重的梯度。
- sign ( w ) \text{sign}(w) sign(w):符号函数, w > 0 w > 0 w>0时为 1, w < 0 w < 0 w<0时为 -1, w = 0 w = 0 w=0时次梯度取值范围为 [ − 1 , 1 ] [-1, 1] [−1,1]。
当 w w w 的更新步长不足以抵消 λ ⋅ sign ( w ) \lambda \cdot \text{sign}(w) λ⋅sign(w) 时, w w w会被压缩到 0,从而产生稀疏性。
-
作用:
稀疏解
:L1 正则化倾向于将不重要的参数直接置为 0,形成稀疏的权重向量。这使得模型只保留对预测最重要的特征。特征选择
:由于部分权重变为 0,L1 正则化可以自动识别和剔除不相关或冗余的特征,特别适用于高维数据。防止过拟合
:通过减少有效参数数量,L1 正则化降低了模型复杂度,从而提升了泛化能力。
-
优缺点:
- 优点:
- 特征选择能力: L1 正则化能够生成稀疏模型,自动筛选重要特征,适用于特征维度高或需要解释性的场景。
- 降低模型复杂度:通过剔除不必要参数,简化模型结构,减少计算开销。
- 对噪声鲁棒:忽略不相关特征后,模型对数据中的噪声更不敏感。
- 缺点:
- 不稳定性:当特征之间高度相关时,L1 正则化可能随机选择其中一个特征置为非 0,而忽略其他相关特征,导致结果不稳定。
- 优化难度:由于 L1 范数不可导,优化过程需要使用次梯度或近端梯度下降等方法,计算复杂度可能高于 L2 正则化。
- 依赖超参数 λ \lambda λ:正则化强度 λ \lambda λ 的选择至关重要,过大可能导致重要特征也被置为 0,过小则正则化效果不足。
- 优点:
import numpy as np
from sklearn.linear_model import LinearRegression, Lasso
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error# 1、生成模拟数据
X, y = make_regression(n_samples=100, n_features=10, noise=0.1, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 2、普通线性回归
lr = LinearRegression()
lr.fit(X_train, y_train)
y_predict_lr = lr.predict(X_test)
mse_lr = mean_squared_error(y_test, y_predict_lr)
print(f"普通线性回归 MSE: {mse_lr:.4f}")# 3、L1 正则化(Lasso)
lasso = Lasso(alpha=0.1) # alpha 是正则化强度,对应 λ
lasso.fit(X_train, y_train)
y_predict_lasso = lasso.predict(X_test)
mse_lasso = mean_squared_error(y_test, y_predict_lasso)
print(f"L1 正则化(Lasso) MSE: {mse_lasso:.4f}")# 4、查看权重
print("普通线性回归权重:", lr.coef_[:10])
print("L1 正则化权重:", lasso.coef_[:10])
普通线性回归 MSE: 0.0103
L1 正则化(Lasso) MSE: 0.1824
普通线性回归权重: [16.7712358 54.13782324 5.18097686 63.64362199 93.61309994 70.63686589 87.0713662 10.43882574 3.15690876 70.90887261]
L1 正则化权重: [16.68551572 54.04466658 5.03023843 63.54923618 93.45872786 70.54211442 86.95689868 10.27114941 3.06974112 70.78354482]
2. L2 正则化(Ridge 正则化):
- 定义:在损失函数中添加权重的 L2 范数平方惩罚项,防止权重过大,促进模型的平滑性。
- 算法原理:
在机器学习中,模型通常通过最小化一个损失函数(例如均方误差)来训练。L2 正则化通过在原始损失函数中添加一个额外的项,改变优化的目标。数学上,带 L2 正则化的损失函数可以表示为:
J ( θ ) = L ( θ ) + λ ⋅ R ( θ ) J(\theta) = L(\theta) + \lambda \cdot R(\theta) J(θ)=L(θ)+λ⋅R(θ)
其中:
- J ( θ ) J(\theta) J(θ):总损失函数(带正则化的目标函数)。
- L ( θ ) L(\theta) L(θ):原始损失函数(例如均方误差、交叉熵等),衡量模型预测与真实值之间的差距。
- R ( θ ) = 1 2 ∥ θ ∥ 2 2 = 1 2 ∑ i θ i 2 R(\theta) = \frac{1}{2} \|\theta\|_2^2 = \frac{1}{2} \sum_{i} \theta_i^2 R(θ)=21∥θ∥22=21∑iθi2:L2 正则化项,即参数的 L2 范数平方,即
参数权重平方和
。 - λ \lambda λ:正则化强度的超参数(也叫惩罚系数),控制正则化的影响程度, λ ≥ 0 \lambda \geq 0 λ≥0。
- θ \theta θ:模型的参数(权重)。
优化目标变为同时最小化原始损失 L ( θ ) L(\theta) L(θ) 和正则化项 λ ⋅ R ( θ ) \lambda \cdot R(\theta) λ⋅R(θ),从而平衡模型的拟合能力和复杂性。
- 梯度更新:
在梯度下降优化中,L2 正则化会影响参数的更新规则。以一个权重 ( w ) 为例:
- 原始梯度更新(无正则化): w ← w − η ∂ L ∂ w w \leftarrow w - \eta \frac{\partial L}{\partial w} w←w−η∂w∂L。
- 带 L2 正则化的梯度更新:
w ← w − η ( ∂ L ∂ w + λ w ) w \leftarrow w - \eta \left( \frac{\partial L}{\partial w} + \lambda w \right) w←w−η(∂w∂L+λw)- η \eta η:学习率。
- ∂ L ∂ w \frac{\partial L}{\partial w} ∂w∂L:原始损失对权重的梯度。
- λ w \lambda w λw: L 2 L2 L2 正则化的梯度贡献。
可以看到,L2 正则化在每次更新时额外引入了一个衰减
项 λ w \lambda w λw,使得权重倾向于变小。因此,L2 正则化也被称为 权重衰减
(weight decay)。
-
作用:
避免过拟合
:只需在损失函数中添加一项即可,计算和优化都很直接。使参数值整体变小
(但不会变为 0),避免参数过大导致过拟合。提升模型的稳定性
:通过限制权重大小,L2 正则化使模型更能抵抗数据中的异常值或噪声。 提升模型的稳定性(减少参数波动)。广泛适用
:可用于线性回归、逻辑回归、神经网络等多种模型。
-
局限性:
无法产生稀疏解
:与 L1 正则化(Lasso)不同,L2 正则化不会将权重变为 0,因此不具备特征选择的能力。依赖超参数
:正则化强度 𝜆需要通过交叉验证等方法调整,过大可能导致欠拟合,过小则效果不足。
import numpy as np
from sklearn.linear_model import LinearRegression, Ridge
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error# 1、生成模拟数据
X, y = make_regression(n_samples=100, n_features=10, noise=0.1, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 2、普通线性回归
lr = LinearRegression()
lr.fit(X_train, y_train)
y_predict_lr = lr.predict(X_test)
mse_lr = mean_squared_error(y_test, y_predict_lr)
print(f"普通线性回归 MSE: {mse_lr:.4f}")# 3、L2 正则化(Ridge alpha=λ是正则化强度)
ridge = Ridge(alpha=3.0)
ridge.fit(X_train, y_train)
y_predict_ridge = ridge.predict(X_test)
mse_ridge = mean_squared_error(y_test, y_predict_ridge)
print(f"L2 正则化(Ridge) MSE: {mse_ridge:.4f}")# 4、查看权重
print("普通线性回归权重:", lr.coef_[:10])
print("L2 正则化权重:", ridge.coef_[:10])
普通线性回归 MSE: 0.0103
L2 正则化(Ridge) MSE: 99.6320
普通线性回归权重: [16.7712358 54.13782324 5.18097686 63.64362199 93.61309994 70.63686589 87.0713662 10.43882574 3.15690876 70.90887261]
L2 正则化权重: [17.26631225 51.58306238 5.07374538 60.93844646 89.34000194 67.95302325 83.99492712 8.91228771 3.41758485 67.23661507]
3. Dropout 正则化:
- 定义:在训练过程中随机丢弃部分神经元,减少神经元间的共适应性,防止过拟合。
- 算法原理:在训练时随机“关闭”(置零)部分神经元,强制网络学习更鲁棒的特征。
假设某一层的输入是 x x x,经过 Dropout 后的输出为 y y y:
- 训练时: r ∼ Bernoulli ( p ) (生成 0/1 掩码,1 的概率为 1 − p ) r \sim \text{Bernoulli}(p) \quad \text{(生成 0/1 掩码,1 的概率为 } 1-p\text{)} r∼Bernoulli(p)(生成 0/1 掩码,1 的概率为 1−p)
y = r ⋅ x 1 − p (其中 r 是随机掩码, p 是丢弃概率) y = \frac{r \cdot x}{1-p} \quad \text{(其中 \( r \) 是随机掩码,\( p \) 是丢弃概率)} y=1−pr⋅x(其中 r 是随机掩码,p 是丢弃概率)
- 推理时: y = x y = x y=x 不丢弃任何神经元,直接使用完整输出。
-
位置:
输入 -> 全连接/卷积 -> 激活函数 -> Dropout -> 输出
-
作用:
防止过拟合
:通过随机丢弃神经元,减少了神经元之间的“共适应”(co-adaptation),即避免模型过度依赖某些特定的神经元组合。类似集成学习
:Dropout 相当于在训练过程中生成了多个不同的子网络,最终的模型可以看作这些子网络的平均效果,具有类似集成学习的正则化作用。简单高效
:Dropout 实现简单,只需在网络中添加一层操作,且计算开销低。提高泛化能力
:模型在训练时无法依赖单一路径或特征,使得其在测试数据上的表现更鲁棒。
-
局限性:
训练时间增加
:由于引入了随机性,Dropout 可能需要更多的迭代才能收敛。不适用于所有场景
:对于小型网络或数据量不足的情况,Dropout 可能会削弱模型的表达能力,反而降低性能。推理阶段无随机性
:Dropout 只在训练时起作用,推理时不丢弃神经元,因此其正则化效果仅通过训练过程间接体现。
import torch
import torch.nn as nn
import torch.optim as optim# 定义一个带 Dropout 的简单网络
class DropNet(nn.Module):def __init__(self):super(DropNet, self).__init__()# 定义输入输出维度self.fc1 = nn.Linear(10, 20)# 丢弃概率 0.5self.dropout = nn.Dropout(p=0.5)self.fc2 = nn.Linear(20, 1)# 使用ReLU激活函数self.relu = nn.ReLU()def forward(self, x):x = self.fc1(x)x = self.relu(x)x = self.dropout(x) # 应用 Dropoutx = self.fc2(x)return x# 1、生成随机数据(共64个样本,每个样本10个特征)
X = torch.randn(64, 10)
y = torch.randn(64, 1)
print(f"第一个条样本: {X[:1]}")
print(f"第一个目标值: {y[:1]}")# 2、初始化模型、损失函数和优化器
model = DropNet()
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)# 3、训练模型
model.train()
for epoch in range(100):# 清除上次梯度optimizer.zero_grad()# 前向传播,计算模型的输出output = model(X)# 计算损失函数loss = criterion(output, y)# 反向传播,计算梯度loss.backward()# 更新模型参数optimizer.step()if epoch % 20 == 0:print(f"Epoch {epoch}, 损失: {loss.item():.4f}")# 4、推理模式
model.eval() # 设置为评估模式(Dropout 关闭)
with torch.no_grad():predict = model(X)print("推理结果:", predict[:1])
第一个条样本: tensor([[-0.3384, -0.3127, 0.4141, 1.0404, 0.8872, -1.2251, -0.1888, 0.4323, 0.0642, -1.3889]])
第一个目标值: tensor([[-0.6342]])
Epoch 0, 损失: 1.0907
Epoch 20, 损失: 1.0641
Epoch 40, 损失: 0.9568
Epoch 60, 损失: 0.9666
Epoch 80, 损失: 0.9806
推理结果: tensor([[0.0403]])
4. 批归一化(Batch Normalization):
- 定义:对每一层的输入进行归一化处理,稳定数据分布,加速训练并具有一定的正则化效果。
- 原理:在每一层的输入上,对每个小批量(mini-batch)的数据进行标准化 ,使得每层的输入分布更稳定,从而加速训练并提升模型性能。
对于一个小批量数据 B = { x 1 , x 2 , . . . , x m } B = \{x_1, x_2, ..., x_m\} B={x1,x2,...,xm}( m m m是批量大小),计算:
- 均值: μ B = 1 m ∑ i = 1 m x i \mu_B = \frac{1}{m} \sum_{i=1}^m x_i μB=m1∑i=1mxi
- 方差: σ B 2 = 1 m ∑ i = 1 m ( x i − μ B ) 2 \sigma_B^2 = \frac{1}{m} \sum_{i=1}^m (x_i - \mu_B)^2 σB2=m1∑i=1m(xi−μB)2
x ^ i = x i − μ B σ B 2 + ϵ ( ϵ 是防止除零的小常数,如 1 × 1 0 − 5 ) \hat{x}_i = \frac{x_i - \mu_B}{\sqrt{\sigma_B^2 + \epsilon}} \quad \text{(\(\epsilon\) 是防止除零的小常数,如 \(1 \times 10^{-5}\))} x^i=σB2+ϵxi−μB(ϵ 是防止除零的小常数,如 1×10−5)
为了保留模型的表达能力,批量归一化引入两个可学习的参数 γ \gamma γ和偏移 β \beta β(平移),对标准化后的值进行线性变换:
y i = γ x ^ i + β ( γ 控制输出的标准差; β 控制输出的均值) y_i = \gamma \hat{x}_i + \beta \quad \text{($\gamma$ 控制输出的标准差;$\beta$ 控制输出的均值)} yi=γx^i+β(γ 控制输出的标准差;β 控制输出的均值)
- 位置:
输入 -> 卷积/全连接 -> 批量归一化 -> 激活函数 -> 输出
- 作用:
加速训练
:通过标准化输入,减少了梯度消失或爆炸的风险,使模型可以使用更高的学习率,从而加快收敛。提高稳定性
:减少了每一层输入分布的变化,使训练过程更稳定。正则化效果
:批量归一化引入了噪声(由于小批量均值和方差的随机性),一定程度上具有正则化作用,可能减少对 Dropout 等其他正则化方法的需求。对初始化不敏感
:减少了对参数初始化的依赖,即使初始值不太理想,模型也能较好地收敛。
- 局限性:
依赖批量大小
:当批量大小(batch size)太小时,均值和方差的估计不够准确,会影响效果。通常需要较大的批量大小(如 32 或 64)。推理阶段的处理
:在训练时,BN 使用小批量的均值和方差;但在推理(测试)时,小批量不可用。因此,BN 会维护一个全局的移动均值和移动方差(通过训练时的指数移动平均计算),用于推理阶段。不适用于某些任务
:对于动态网络(如 RNN)或小批量难以定义的场景(如在线学习),BN 的效果可能不佳。
import torch
import torch.nn as nn
import torch.optim as optim# 定义一个简单的网络
class Net(nn.Module):def __init__(self):super(Net, self).__init__()# 定义输入输出维度self.fc1 = nn.Linear(10, 20)# 使用nn对20个特征进行批量归一化self.bn = nn.BatchNorm1d(20) self.fc2 = nn.Linear(20, 1)# 使用ReLU激活函数self.relu = nn.ReLU()def forward(self, x):x = self.fc1(x)# 应用批量归一化x = self.bn(x)x = self.relu(x)x = self.fc2(x)return x# 1、生成随机数据(共64个样本,每个样本10个特征)
X = torch.randn(64, 10)
y = torch.randn(64, 1)
print(f"第一个条样本: {X[:1]}")
print(f"第一个目标值: {y[:1]}")# 2、初始化模型、损失函数和优化器
model = Net()
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)# 3、训练模型
model.train()
for epoch in range(100):# 清除上次梯度optimizer.zero_grad()# 前向传播,计算模型的输出output = model(X)# 计算损失函数loss = criterion(output, y)# 反向传播,计算梯度loss.backward()# 更新模型参数optimizer.step()if epoch % 20 == 0:print(f"Epoch {epoch}, 损失: {loss.item():.4f}")# 4、推理模式
model.eval() # 设置为评估模式(使用移动均值和方差)
with torch.no_grad():predict = model(X)print("推理结果:", predict[:1])
第一个条样本: tensor([[-0.4048, 1.3088, -1.8305, 0.6533, -0.3900, -1.1319, 0.3992, 1.9025, -0.0115, -0.1645]])
第一个目标值: tensor([[0.0327]])
Epoch 0, 损失: 1.0700
Epoch 20, 损失: 0.7397
Epoch 40, 损失: 0.6255
Epoch 60, 损失: 0.5578
Epoch 80, 损失: 0.5163
推理结果: tensor([[-0.1543]])
四、总结
正则化方法 | 描述 | 公式表示 | 特点 |
---|---|---|---|
L1 正则化(Lasso) | 在损失函数中加入权重的 L1 范数惩罚项,鼓励模型产生稀疏权重,即部分权重被压缩为零,从而实现特征选择。 | J ( θ ) = Loss + λ ∑ i ∣ θ i ∣ J(\theta) = \text{Loss} + \lambda \sum_{i} \vert\theta_i\vert J(θ)=Loss+λ∑i∣θi∣ | 有助于特征选择,产生稀疏模型,但可能导致解的不稳定性。 |
L2 正则化(Ridge) | 在损失函数中加入权重的 L2 范数惩罚项,防止权重过大,使模型更加平滑。 | J ( θ ) = Loss + λ ∑ i θ i 2 J(\theta) = \text{Loss} + \lambda \sum_{i} \theta_i^2 J(θ)=Loss+λ∑iθi2 | 防止权重过大,适用于处理多重共线性问题,但不会导致权重为零。 |
Dropout | 在训练过程中以一定概率随机丢弃神经元,减少神经元间的共适应性,防止过拟合。 | - | 简单有效,适用于神经网络,但增加了训练时间。 |
早停法(Early Stopping) | 在验证集性能不再提升时停止训练,防止模型过度拟合训练数据。 | - | 简单易行,但需要验证集,可能错过最佳模型。 |
数据增强(Data Augmentation) | 通过对训练数据进行随机变换,增加数据量,增强模型的泛化能力。 | - | 增强模型鲁棒性,但可能增加训练时间。 |
批归一化(Batch Normalization) | 对每一层的输入进行归一化处理,稳定数据分布,加速训练并具有一定的正则化效果。 | - | 加速训练,稳定性强,但增加了模型复杂度。 |
相关文章:
神经网络基础之正则化
引言:正则化 (Regularization) 是机器学习中一种用于防止模型过拟合技术。核心思想是通过在模型损失函数中添加一个惩罚项 (Penalty Term),对模型的复杂度进行约束,从而提升模型在新数据上的泛化…...
JAVA序列化与反序列化URLDNS链CC1链
1、序列化的实现 java序列化的是对象属性的,只有实现了Serializable或者Externalizable接口的类的对象才能被序列化为字节序列。(不是则会抛出异常),静态成员变量是属于类的,所以静态成员变量是不能被序列化的&#x…...
孤儿进程和僵尸进程
本文讲述了什么是孤儿进程和僵尸进程,会带来怎样的问题以及如何处理 一、孤儿进程 1)什么是孤儿进程 孤儿进程,顾名思义,就是父进程提前终止,但是子进程还在运行中,父进程无法对子进程进行监管&#…...
用ASCII字符转化图片
代码 from PIL import Image# 定义 ASCII 字符集,从最暗到最亮 ASCII_CHARS "%#*-:. "def resize_image(image, new_width100):width, height image.sizeratio height / widthnew_height int(new_width * ratio)resized_image image.resize((new_wi…...
从WebRTC到嵌入式:EasyRTC如何借助大模型提升音视频通信体验
随着人工智能技术的快速发展,WebRTC与大模型的结合正在为音视频通信领域带来革命性的变革。WebRTC作为一种开源实时通信技术,以其低延迟、跨平台兼容性和强大的音视频处理能力,成为智能硬件和物联网设备的重要技术支撑。 而EasyRTC作为基于W…...
自动化测试工具-Playwright介绍和快速实例
Playwright 是什么 Playwright 是由 Microsoft 开发的开源自动化测试工具,专为现代 Web 应用设计。它支持 Chromium、Firefox 和 WebKit 内核的浏览器,能够跨平台(Windows、macOS、Linux)运行,提供强大的浏览器自动化能力,适用于测试、爬虫和监控等场景。 Playwright的…...
Java:Apache HttpClient中HttpRoute用法的介绍
当使用Apache HttpClient组件时,经常会用到它的连接池组件。典型的代码如下: PoolingHttpClientConnectionManager connectionManager new PoolingHttpClientConnectionManager();connectionManager.setMaxTotal(httpConfig.getMaxPoolTotal());connect…...
万字长文详解|蚂蚁数据湖深度探索与业务应用实践
作者介绍:黄超傑,蚂蚁数据智能部实时数据团队数据研发工程师,致力于数据湖技术在蚂蚁落地应用、蚂蚁广告实时数仓建设、蚂蚁数据成本治理等工作。 在开始之前 如果: 你想要提升数据时效,能够接受分钟级延迟你好奇准实…...
rk3568 以太网eth1 , 定制板 phy调试问题。
问题: 客户定制底板的 phy 网络不通。 解决逻辑: phy 问题, 就是 照着 公司底板对硬件就行,完全是硬件问题,不用改 软件。 原理图如下:...
React相关面试题
以下是150道React面试题及其详细回答,涵盖了React的基础知识、组件、状态管理、路由、性能优化等多个方面,每道题目都尽量详细且简单易懂: React基础概念类 1. 什么是React? React是一个用于构建用户界面的JavaScript库ÿ…...
IT工具 | node.js 进程管理工具 PM2 大升级!支持 Bun.js
P(rocess)M(anager)2 是一个 node.js 下的进程管理器,内置负载均衡,支持应用自动重启,常用于生产环境运行 node.js 应用,非常好用👍 🌼概述 2025-03-15日,PM2发布最新版本v6.0.5,这…...
php 高性能,高并发,有哪些框架,扩展,推荐一下,或者技术的实现有哪些
以下是针对PHP高性能、高并发场景的框架、扩展及技术实现推荐,结合最新技术趋势和行业实践进行总结: 一、高性能框架推荐 1. C扩展类框架 YAF (Yet Another Framework) 特点:由C语言编写,直接嵌入PHP内核,仅提供核心M…...
golang单机锁实现
1、锁的概念引入 首先,为什么需要锁? 在并发编程中,多个线程或进程可能同时访问和修改同一个共享资源(例如变量、数据结构、文件)等,若不引入合适的同步机制,会引发以下问题: 数据竞…...
面试中JVM常被问到的问题以及对应的答案
在面试中,关于JVM常被问到的问题以及对应的答案可能包括: 什么是JVM?它的作用是什么? 答:JVM是Java虚拟机的缩写,是Java程序运行的环境。它负责将Java源代码编译成字节码并运行在不同平台上。 请解释一下J…...
算法——广度优先搜索——跨步迷宫
原题链接 思路:找出最短路径,然后判断是否存在连续三个点是横纵坐标相等的,如果有就步数减1 但是有两个样例过不了 错误原因:在错误的测试案例中,最短路径可能有多条,而我刚好选了一条比较曲折的&#x…...
Python pyqt+flask做一个简单实用的自动排班系统
这是一个基于Flask和PyQt的排班系统,可以将Web界面嵌入到桌面应用程序中。 系统界面: 功能特点: - 读取员工信息和现有排班表 - 自动生成排班表 - 美观的Web界面 - 独立的桌面应用程序 整体架构: 系统采用前后端分离的架构…...
链表操作:分区与回文判断
目录 链表分区(Partition) 功能概述 代码实现 要点与难点 注意事项 链表回文判断(PalindromeList) 功能概述 代码实现 要点与难点 注意事项 总结 在链表相关的算法问题中,理解链表的基本结构和操作至关重要…...
基于大模型的腮腺多形性腺瘤全周期诊疗方案研究报告
目录 一、引言 1.1 研究背景与目的 1.2 研究现状与趋势 二、大模型预测原理与方法 2.1 大模型概述 2.2 数据收集与预处理 2.3 模型训练与优化 三、术前预测与评估 3.1 肿瘤特征预测 3.2 风险评估 3.3 案例分析 四、术中方案制定与实施 4.1 手术方案选择 4.2 面神…...
Vue3 界面设计插件 microi-pageengine 入门教程一
系列文章目录 一、Vue3空项目快速集成 microi-pageengine 插件 文章目录 系列文章目录一、前言二、排版布局2.1 功能导航区2.2 组件容器区2.3 属性面板区 三、数据来源配置3.1 json数据源3.2 html数据源 四、事件穿透五、数据保存持久化六、总结 一、前言 上一篇文章介绍了 v…...
如何选择合适的SSL服务器证书
在数字化时代,网络安全已成为企业不可忽视的重要环节。SSL(Secure Sockets Layer,安全套接层)服务器证书作为保障网站数据传输安全的关键工具,其选择和使用至关重要。 一、SSL证书类型:基础与进阶 SSL证书…...
STC89C52单片机学习——第26节: [11-2]蜂鸣器播放音乐
写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难,但我还是想去做! 本文写于:2025.03.19 51单片机学习——第26节: [11-2]蜂鸣器播放音乐 前言开发板说明引用解答和科普一…...
ABC396题解
A 算法标签: 模拟 问题陈述 给你一个长度为 N N N 的整数序列: A ( A 1 , A 2 , … , A N ) A (A_1, A_2, \ldots, A_N) A(A1,A2,…,AN)。 请判断在 A A A 中是否有相同元素连续出现三次或三次以上的位置。 更正式地说,请判断是否存在一个整…...
如何用Python和Selenium实现表单的自动填充与提交?
在今天的数字化时代,自动化工具可以极大地提高工作效率。很多人可能会觉得填表单是个繁琐的任务,不过你知道吗?用Python和Selenium可以轻松解决这一问题!本文将带你走进如何利用这两个强大的工具,实现表单的自动填充和…...
使用`plot_heatmap`绘制热力图时
在Python中,使用plot_heatmap绘制热力图时,颜色图例(colorbar)的定制化设置是关键步骤。以下是实现方法及优化建议: 一、基础图例绘制 自动生成颜色条 使用seaborn.heatmap()时,默认会生成颜色条࿰…...
极简桌面待办清单软件,❌不会增加工作量
工作邮件、会议安排、生活琐事……事情多到根本记不住,又怕错过重要事项,焦虑感油然而生。相信这是很多职场朋友遇到的问题,也急需一款好用的极简桌面待办清单软件来辅助我们。 今天我要给大家推荐一款拯救我们于水火的神器——好用便签&…...
QT学习笔记4
一、音视频播放(Qt Multimedia) 1. 多媒体框架架构 核心类关系 : mermaid #mermaid-svg-mwHLYcpaJDU14uFM {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-mwHLYcpaJDU14uFM .e…...
软考 中级软件设计师 考点知识点笔记总结 day06
文章目录 6、树和二叉树6.1、树的基本概念6.2、二叉树的基本概念6.3、二叉树的遍历6.4、查找二叉树(二叉排序树)BST6.5、构造霍夫曼树6.6、线索二叉树6.7、 平衡二叉树 7、 图7.1 、 存储结构 - 邻接矩阵7.2 、 存储结构 - 邻接表7.3、图的遍历7.4、拓扑…...
爬虫基础之爬取猫眼Top100 可视化
网站: TOP100榜 - 猫眼电影 - 一网打尽好电影 本次案例所需用到的模块 requests (发送HTTP请求) pandas(数据处理和分析 保存数据) parsel(解析HTML数据) pyecharts(数据可视化图表) pymysql(连接和操作MySQL数据库) lxml(数据解析模块) 确定爬取的内容: 电影名称 电影主演…...
微信小程序面试内容整理-如何使用wx.request()进行网络请求
wx.request() 是微信小程序中用于发送网络请求的 API,类似于浏览器中的 fetch 或 XMLHttpRequest。通过 wx.request(),开发者可以向服务器发送 HTTP 请求,获取数据或者提交数据。 基本用法 wx.request() 通过提供一个配置对象来进行配置,配置对象中包括请求的 URL、请求方法…...
力扣100二刷——图论、回溯
第二次刷题不在idea写代码,而是直接在leetcode网站上写,“逼”自己掌握常用的函数。 标志掌握程度解释办法⭐Fully 完全掌握看到题目就有思路,编程也很流利⭐⭐Basically 基本掌握需要稍作思考,或者看到提示方法后能解答⭐⭐⭐Sl…...
该错误是由于`KuhnMunkres`类未定义`history`属性导致的
该错误是由于KuhnMunkres类未定义history属性导致的。以下是具体分析及解决方案: 错误原因分析 属性缺失 代码中试图访问km.history,但KuhnMunkres类未在初始化或算法执行过程中定义该属性,因此触发AttributeError。动画实现逻辑不完整 用户…...
DAPO:一个开源的大规模大型语言模型LLM强化学习系统
推断扩展赋予了大型语言模型前所未有的推理能力,强化学习作为激发复杂推理的核心技术,清华大学联合字节提出了解耦片段与动态采样策略优化(DAPO)算法,并全面开源了一个最先进的大规模强化学习系统,该系统使用Qwen2.5-32B基础模型在AIME 2024上取得了50分的高分。还开源了…...
数据结构中的引用管理对象体系
数据结构中的引用管理对象体系 (注:似复刻变量即实例对象) 引用管理对象的,有引用就能管理到它所指向的对象,我们拿引用最终的目的就是管理那些我们需要管理的最终直接对象,引用也是对象,同时…...
【自学笔记】智能合约基础知识点总览-持续更新
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 智能合约基础知识点总览目录1. 智能合约简介2. 以太坊与Solidity示例代码:Hello World智能合约 3. Solidity基础语法示例代码:简单的计数器合…...
Linux的Shell编程
一、什么是Shell 1、为什么要学习Shell Linux运维工程师在进行服务器集群管理时,需要编写Shell程序来进行服务器管理。 对于JavaEE和Python程序员来说,工作的需要。Boss会要求你编写一些Shell脚本进行程序或者是服务器的维护,比如编写一个…...
【八股文】volatile关键字的底层原理是什么
volatile只能保证可见性和有序性 volatile如何保证可见性 当对volatile变量进行写操作的时候,JVM会向处理器发送一条lock前缀的命令,将这个缓存中的变量会写到系统内存中。 所以,如果一个变量被volatile所修饰,每次数据变化之后…...
一种基于大规模语言模型LLM的数据分析洞察生成方法
从复杂数据库中提取洞察对数据驱动决策至关重要,但传统手动生成洞察的方式耗时耗力,现有自动化数据分析方法生成的洞察不如人工生成的有洞察力,且存在适用场景受限等问题。下文将介绍一种新的方法,通过生成高层次问题和子问题,并使用SQL查询和LLM总结生成多表数据库中的见…...
三大供应链管理模式——解决方案与实操案例详解
库存压到喘不过气,紧急订单却总赶不上交付?这是许多企业的真实困境——推式供应链盲目备货导致积压,拉式供应链又因响应慢而丢单。供应链管理,本质上是在“计划”与“变化”之间把握平衡。上篇文章,我们系统梳理了供应…...
【C++】STL库面试常问点
STL库 什么是STL库 C标准模板库(Standard Template Libiary)基于泛型编程(模板),实现常见的数据结构和算法,提升代码的复用性和效率。 STL库有哪些组件 STL库由以下组件构成: ● 容器…...
集成学习之随机森林
目录 一、集成学习的含义 二、集成学习的代表 三、集成学习的应用 1、分类问题集成。(基学习器是分类模型) 2、回归问题集成。(基学习器是回归模型) 3、特征选取集成。 四、Bagging之随机森林 1、随机森林是有多个决策树&a…...
【SpringBatch】03步骤对象 (Step)控制与执行流程设计
目录标题 六、步骤对象 Step6.1 步骤介绍6.2 简单Tasklet6.3 chunk居于块Tasklet**ChunkTasklet 泛型** 6.4 步骤监听器6.5 多步骤执行6.6 步骤控制6.6.1 条件分支控制-使用默认返回状态6.6.2 条件分支控制-使用自定义状态值 6.7 步骤状态6.8 流式步骤 六、步骤对象 Step 前面…...
走进Java:String字符串的基本使用
❀❀❀ 大佬求个关注吧~祝您开心每一天 ❀❀❀ 目录 一、什么是String 二、如何定义一个String 1. 用双引号定义 2. 通过构造函数定义 三、String中的一些常用方法 1 字符串比较 1.1 字符串使用 1.2 字符串使用equals() 1.3 使用 equalsIgnoreCase() 1.4 cpmpareTo…...
AI如何变革亚马逊广告投放?DeepBI的智能优化解析
在亚马逊平台上,广告投放的方式正经历着从人工精细化运营到AI自动化优化的深刻变革。传统的广告投放依赖人工操作,涉及海量数据分析、手动调价、竞价策略优化等环节,既耗时又易受人为因素影响。而AI驱动的智能投放系统,如DeepBI&a…...
小程序电子画册制作,用户体验为王!
家人们,现在小程序电子画册超火,不管是展示产品还是分享故事都超实用。但在小程序电子画册制作过程中,用户体验真的得好好考量!今天就和大家唠唠这其中的门道。 1、加载速度:快才是王道 打开小程序的瞬间,…...
【商城实战(49)】解锁小程序端适配与优化,让商城飞起来
【商城实战】专栏重磅来袭!这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建,运用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用户、商品、订单等核心模块开发,再到性能优化、安全加固、多端适配…...
英伟达GTC 2025大会产品全景剖析与未来路线深度洞察分析
【完整版】3月19日,黄仁勋Nvidia GTC 2025 主题演讲|英伟达 英伟达GTC 2025大会产品全景剖析与未来路线深度洞察分析 一、引言 1.1 分析内容 本研究主要采用了文献研究法、数据分析以及专家观点引用相结合的方法。在文献研究方面,广泛收集了…...
《TCP/IP网络编程》学习笔记 | Chapter 19:Windows 平台下线程的使用
《TCP/IP网络编程》学习笔记 | Chapter 19:Windows 平台下线程的使用 《TCP/IP网络编程》学习笔记 | Chapter 19:Windows 平台下线程的使用内核对象内核对象的定义内核对象归操作系统所有 基于 Windows 的线程创建进程与线程的关系Windows 中线程的创建方…...
线性规划的基本解、基本可行解和可行解
在线性规划中,基本解、基本可行解和可行解是非常重要的概念,特别是在使用单纯形法求解时。下面详细解释这些概念,并说明如何计算它们。 1. 线性规划问题的标准形式 线性规划的标准形式为: 其中: A 是 mn 的矩阵&…...
【AVRCP】服务发现互操作性:CT 与 TG 的 SDP 协议契约解析
目录 一、服务发现的核心目标:能力画像对齐 二、控制器(CT)服务记录:控制能力的声明 2.1 必选字段:角色与协议的刚性契约 2.1.1 服务类标识(Service Class ID List) 2.1.2 协议描述列表&am…...
[从零开始学习JAVA] Stream流
前言: 本文我们将学习Stream流,他就像流水线一样,可以对我们要处理的对象进行逐步处理,最终达到我们想要的效果,是JAVA中的一大好帮手,值得我们了解和掌握。(通常和lambda 匿名内部类 方法引用相…...