共计 1833 个字符,预计需要花费 5 分钟才能阅读完成。
背景痛点
CMAPSS 数据集是 NASA 开发的航空发动机退化仿真数据,其中 FD004 子集包含多工况(6 种飞行条件)和小样本(仅 249 个训练序列)特性。这些特性使得传统 LSTM 模型极易过拟合:

- 训练损失快速下降至 0.1 以下,而验证损失在 20epoch 后开始上升
- 测试集 MAE 高达 35.2,比训练集指标(12.7)高出近 3 倍
- 模型对某些工况的预测误差显著高于其他工况
技术方案
数据层增强
-
滑窗增强 :将原始序列切分为固定长度(128 时间步)的滑动窗口,步长设为 32,使样本量扩大 4 倍
-
特征筛选 :
- 计算 21 个传感器信号与 RUL 的互信息得分
- 保留 Top15 特征(如 T24、T30 等核心温度传感器)
- 剔除低相关性特征(如 P15 燃油流量)
模型架构
class BiLSTM_Attn(nn.Module):
def __init__(self, input_dim=15):
super().__init__()
self.bilstm = nn.LSTM(input_dim, 64, bidirectional=True)
self.attention = nn.Sequential(nn.Linear(128, 32),
nn.Tanh(),
nn.Linear(32, 1, bias=False)
)
def forward(self, x):
lstm_out, _ = self.bilstm(x) # [seq_len, batch, 128]
attn_weights = F.softmax(self.attention(lstm_out), dim=0)
return (attn_weights * lstm_out).sum(dim=0)
正则化策略
- DropPath:以 0.2 概率随机丢弃 LSTM 的隐藏状态转移路径
- Label Smoothing:将硬标签替换为 ε =0.1 的平滑标签
- 梯度裁剪 :限制梯度范数不超过 5.0
代码实现
数据加载器
class CMAPSSDataset(Dataset):
def __init__(self, df, window_size=128, stride=32):
self.windows = []
for unit_id in df['unit'].unique():
unit_data = df[df['unit']==unit_id].sort_values('cycle')
for i in range(0, len(unit_data)-window_size, stride):
self.windows.append(unit_data.iloc[i:i+window_size])
def __getitem__(self, idx):
window = self.windows[idx]
x = torch.FloatTensor(window[SELECTED_FEATURES].values)
y = torch.FloatTensor([window['RUL'].iloc[-1]])
return x, y
训练循环
def train_epoch(model, loader, optimizer):
model.train()
total_loss = 0
for x, y in loader:
optimizer.zero_grad()
pred = model(x.to(device))
loss = F.mse_loss(pred, y.to(device))
loss.backward()
torch.nn.utils.clip_grad_norm_(model.parameters(), 5.0)
optimizer.step()
total_loss += loss.item()
return total_loss / len(loader)
实验对比
| 方案 | MAE | RMSE | 训练时间 (hr) |
|---|---|---|---|
| 原始 LSTM | 35.2 | 41.7 | 1.2 |
| + 数据增强 | 28.4 | 36.1 | 1.5 |
| +BiLSTM-Attn | 25.3 | 32.8 | 1.8 |
| 完整方案 | 21.6 | 29.4 | 2.1 |
生产建议
- 分段归一化 :按工况类别分别计算均值和方差
- 超参数搜索 :
- 学习率:对数空间 [1e-4, 1e-2]
- DropPath 率:[0.1, 0.3]
- 窗口大小:{64, 128, 256}
- 模型量化 :
- 使用 PyTorch 的 quantization 模块进行 INT8 量化
- 对 Attention 层保留 FP16 精度
开放问题
如何设计工况自适应的正则化强度?当前固定比例的 DropPath 可能不适合所有飞行条件,未来可探索:
- 基于工况特征的动态 DropPath 率
- 元学习策略自动调整正则化强度
- 在线学习过程中的自适应调整
正文完
