You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在TensorFlow(Keras)中基于LSTM实现无监督学习?

无监督LSTM适配实时网络异常检测的实现建议

一、跳过BINGO/NEO的成熟替代方案

直接实现这两种算法在Keras中没有现成工具,可先从通用无监督时序检测范式入手快速验证:

  • LSTM自编码器结构:这是无监督流量异常检测的常用方案,核心是让模型学习正常流量的重构模式,通过实时数据的重构误差判断异常。完全基于Keras原生组件实现,无需依赖特殊算法,且无需数据源标签对齐,只需要保证时序特征维度统一即可。
    示例代码框架:
    from keras.models import Model
    from keras.layers import Input, LSTM, RepeatVector, TimeDistributed, Dense
    
    # 输入为时序流量特征:(时间步长, 特征数)
    input_seq = Input(shape=(timesteps, n_features))
    # LSTM编码器压缩特征
    encoder = LSTM(latent_dim, activation='relu')(input_seq)
    # 重复向量匹配解码器输入维度
    repeat_vec = RepeatVector(timesteps)(encoder)
    # LSTM解码器重构输入
    decoder = LSTM(n_features, activation='relu', return_sequences=True)(repeat_vec)
    output = TimeDistributed(Dense(n_features))(decoder)
    
    autoencoder = Model(input_seq, output)
    autoencoder.compile(optimizer='adam', loss='mse')
    
    训练阶段仅投喂UNSW-NB15中的正常流量数据,实时检测时计算输入数据的重构MSE,超过预设阈值则标记为异常。
  • 预训练+微调的半监督思路:先用无监督自编码器预训练LSTM提取通用流量特征,再用少量标注的UNSW-NB15数据微调分类头,平衡无监督的通用性和有监督的检测精度。

二、BINGO/NEO在Keras中的手动实现思路

若一定要落地这两种算法,核心是自定义训练逻辑,因为Keras默认训练循环针对有监督任务,需手动实现损失计算与梯度更新:

  • BINGO(Binary Information Gain Optimization):核心目标是最大化模型隐层输出与输入之间的互信息(适配二分类场景的信息增益)。需自定义损失函数计算二进制特征与LSTM隐层的互信息,再通过tf.GradientTape手动执行训练步骤。
  • NEO(Nonparametric Entropy Optimization):核心是通过非参数方法估计熵,优化模型使正常数据的隐层分布熵最小、异常数据熵最大。需自定义损失函数,用核密度估计(KDE)等方法计算隐层特征的熵,再结合梯度下降更新模型参数。

示例训练框架(伪代码):

import tensorflow as tf
from keras.layers import LSTM

# 基础LSTM特征提取模型
lstm_model = LSTM(latent_dim, return_state=False)

# 简化版NEO损失函数(需自行实现熵计算逻辑)
def neo_loss(normal_features, abnormal_features):
    normal_entropy = calculate_entropy(normal_features)  # 用KDE等方法实现
    abnormal_entropy = calculate_entropy(abnormal_features)
    return normal_entropy - abnormal_entropy  # 目标:最小化正常熵,最大化异常熵

# 手动训练循环
optimizer = tf.keras.optimizers.Adam()
for epoch in range(epochs):
    with tf.GradientTape() as tape:
        normal_hidden = lstm_model(normal_seq_batch)
        abnormal_hidden = lstm_model(abnormal_seq_batch)
        loss = neo_loss(normal_hidden, abnormal_hidden)
    grads = tape.gradient(loss, lstm_model.trainable_variables)
    optimizer.apply_gradients(zip(grads, lstm_model.trainable_variables))

三、实时数据预处理简化方案

即使采用无监督模型,也可通过以下方式降低多数据源适配成本:

  • 提取通用流量时序特征:例如包大小序列、包间隔时间序列、协议类型编码序列等,避免依赖UNSW-NB15特有的字段,统一为固定维度的时序输入。
  • 固化标准化流水线:训练阶段保存StandardScaler等标准化工具,实时数据直接加载该工具完成预处理,无需手动调整参数。

内容的提问来源于stack exchange,提问作者Alvinus Melius

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 10:40:49