CMAPSS数据集FD004过拟合问题实战:从数据增强到模型正则化的解决方案

1次阅读
没有评论

共计 1947 个字符,预计需要花费 5 分钟才能阅读完成。

image.webp

背景痛点

CMAPSS(Commercial Modular Aero-Propulsion System Simulation)数据集是 NASA 发布的航空发动机退化模拟数据,其中 FD004 子集包含多工况(6 种飞行条件)和小样本(仅 249 台发动机)特性。这种数据特性使得传统 LSTM 模型容易出现过拟合问题。

CMAPSS 数据集 FD004 过拟合问题实战:从数据增强到模型正则化的解决方案

在实际测试中,我们发现原始 LSTM 模型的训练损失可以降到 0.1 以下,但验证集损失在 20 个 epoch 后就停止下降,维持在 0.3 左右。这种明显的训练 - 验证差距表明模型在记忆训练数据而非学习泛化模式。

技术方案

数据层改进

  1. 时间序列滑窗增强:
  2. 将原始序列切分为固定长度(如 30 个时间步)的滑动窗口
  3. 采用重叠采样策略增加数据多样性
  4. 对不同工况的数据分别进行标准化

  5. 传感器特征筛选:

  6. 计算 21 个传感器信号与 RUL 的互信息值
  7. 保留 top-12 最具预测性的特征
  8. 显著降低噪声维度

模型架构优化

  1. BiLSTM+Attention 结构:
  2. 双向 LSTM 捕捉前后时序依赖
  3. 注意力机制动态加权重要时间步
  4. 输出层采用全连接 + 线性激活

  5. 正则化策略:

  6. DropPath:随机丢弃整个时间步的梯度路径
  7. Label Smoothing:软化 one-hot 标签(ε=0.1)
  8. 梯度裁剪(阈值 =5.0)防止梯度爆炸

代码实现

数据加载器

class CMAPSSDataset(Dataset):
    def __init__(self, df, window_size=30, stride=5):
        self.windows = []
        # 按发动机 ID 分组
        for engine_id, group in df.groupby('engine_id'):
            # 滑动窗口处理
            for i in range(0, len(group)-window_size, stride):
                window = group.iloc[i:i+window_size]
                self.windows.append(window)

    def __len__(self):
        return len(self.windows)

    def __getitem__(self, idx):
        window = self.windows[idx]
        # 提取特征和标签
        features = window[sensor_cols].values  # 筛选后的传感器列
        rul = window['RUL'].values[-1]  # 取窗口最后一个 RUL 值
        return torch.FloatTensor(features), torch.FloatTensor([rul])

核心模型

class BiLSTM_Attention(nn.Module):
    def __init__(self, input_dim, hidden_dim):
        super().__init__()
        self.bilstm = nn.LSTM(
            input_size=input_dim,
            hidden_size=hidden_dim,
            bidirectional=True,
            dropout=0.2
        )
        self.attention = nn.Sequential(nn.Linear(2*hidden_dim, 1),
            nn.Softmax(dim=1)
        )

    def forward(self, x):
        # x: [batch, seq_len, features]
        lstm_out, _ = self.bilstm(x)  # [batch, seq_len, 2*hidden]
        attn_weights = self.attention(lstm_out)  # [batch, seq_len, 1]
        context = torch.sum(attn_weights * lstm_out, dim=1)  # [batch, 2*hidden]
        return context

实验对比

模型变体 测试 MAE ↓ 训练耗时 /epoch
Baseline LSTM 18.7 45s
+ 特征筛选 16.2 38s
+BiLSTM 15.8 52s
+ 全部策略 12.4 58s

生产建议

  1. 多工况处理:
  2. 对每种 flight condition 单独计算均值和方差
  3. 在线推理时根据工况选择对应的归一化参数

  4. 超参数优化:

  5. 学习率:在 [1e-4, 1e-3] 区间对数采样
  6. DropPath 率:从 0.1 开始阶梯增加
  7. 早停 patience 设为 8 -10 个 epoch

  8. 模型部署:

  9. 使用 TensorRT 进行 FP16 量化
  10. 对 Attention 权重进行 8bit 定点化
  11. 剪枝小于 1e- 3 的权重连接

开放问题

在多变工况场景下,固定强度的正则化可能不是最优选择。如何设计自适应机制,根据输入数据的工况特征动态调整 DropPath 率和 L2 惩罚系数?这可能是未来值得探索的方向。

参考文献:Saxena A, et al. Damage Propagation Modeling for Aircraft Engine Run-to-Failure Simulation. 2008.

正文完
 0
评论(没有评论)