sklearn中lstm_基于lstm的日志异常检测工具包

sklearn中lstm_基于lstm的日志异常检测工具包_第1张图片

1. 前言


日志异常检测模型从模型角度可以分为机器学习和深度学习两大方向,目前基于机器学习的已经有港中文开源的loglizer框架。
鉴于使用rnn为主的深度模型在训练以及预测过程中api与基于机器学习(sklearn)的有较大差别,因此在实践过程中本人针对近两年发布的有关基于rnn的日志异常检测论文进行总结并提炼出了一个工具包

logdeep​github.com

方便其他研究者继续在此基础上进行创新的工作。


2. 算法描述


本工具包主要实现了DeepLog、LogAnomaly、RobustLog这几篇文章的日志异常检测结果
以下介绍只涉及论文异常检测模型构建的部分,其他细节请阅读原论文。

  • DeepLog


采取的思路为使用日志模板进行异常检测,使用lstm来进行分类,类别个数即为模板的个数,交叉熵为损失函数。

训练数据全部为正常日志数据(无监督模型),设定滑窗窗口后,此窗口直接使用原始的模板序列特征,送进lstm网络的输出为滑窗下一时刻的模板日志的概率分布。

在进行异常检测时,如果概率最大的前k个预测结果中包含真实出现的日志模板,则认为正常,否则为异常序列。

sklearn中lstm_基于lstm的日志异常检测工具包_第2张图片
DeepLog 流程图
  • LogAnomaly


LogAnomaly在异常检测模型构建地方与DeepLog较为相似,在训练过程中也是使用日志模板进行异常检测(预测的过程对于oov问题使用语义向量来寻找最近邻的日志模板),使用lstm进行分类,类别为日志模板的个数,损失函数为交叉熵函数。

训练数据全部为正常日志数据,设定滑窗窗口后,此窗口使用原始的日志序列特征(Template Vector Sequence)再加上此窗口的统计特征(Count Vector),送进lstm网络的输出为滑窗下一时刻的模板日志的概率分布。

在进行异常检测时,如果概率最大的前k个预测结果中包含真实出现的日志模板,则认为正常,否则为异常序列。

sklearn中lstm_基于lstm的日志异常检测工具包_第3张图片
LogAnomaly 流程图
  • LogRobust

LogRobust思想与前两篇文章较为不同,前两篇文章日志异常检测都是建立在日志模板提取的前提基础上的,而LogRobust直接舍弃了日志模板提取这一流程转而用语义向量来替代。

与前面采用滑窗(Sliding Window)来取样的策略不同,此处直接选取对应的磁盘序列为采样对象(Session window),采用有监督的训练方式,训练用到的磁盘序列数据人工标记为正常和异常。

对应磁盘序列的语义特征序列送入到lstm网络后直接训练一个二分类网络,预测时直接得到磁盘序列异常与否。

sklearn中lstm_基于lstm的日志异常检测工具包_第4张图片
LogRobust 流程图

3. 实现要点


抽离出来以上模型不同之处寻求共同点、设计了logdeep结构
logdeep主要有三个模块构成

sklearn中lstm_基于lstm的日志异常检测工具包_第5张图片
  • sampling method
    即为对原始的日志序列的不同采样方式
  1. fixed window为固定窗口采样,在实际生产应用较少
  2. sliding window为滑动窗口采样
  3. session winodw为直接选取磁盘编号序列为指定对象

目前实现了sliding window对应DeepLog和LogAnomaly的无监督模型
session window对应LogRobust的有监督模型

  • feature extraction

采样后如何对对象进行特征提取来得到送入lstm网络训练的特征,
这里原始序列特征、滑窗统计特征以及语义特征都实现了,可以自己组合来复现不同文章的结果

  • deep model:

这里就是不同的lstm结构,可以自行调整超参数以及是否使用attention模块。


以LogAnomaly为例来看主要参数模块定义:

# sampling method
options['sample'] = "sliding_window" # 采样方式
options['window_size'] = 10 # 窗口大小

# feature extraction
options['sequentials'] = True # 序列特征
options['quantitatives'] = True # 统计特征
options['semantics'] = False # 语义特征

# deep model
Model = loganomaly(input_size=options['input_size'],
                   hidden_size=options['hidden_size'],
                   num_layers=options['num_layers'],
                   num_keys=options['num_classes']) # lstm网络的具体参数


目前已经在HDFS数据集上进行测试,使用和测试方法在github界面:

logdeep​github.com


工具可能还有不完善的地方,欢迎各位提issue以及pr!

你可能感兴趣的:(sklearn中lstm)