一、设计目标
输出一个通用化的匹配模型,可以通过日志内容实现快速识别,实现日志快速分类。
二、设计思路
通过现有的部分日志数据作为基本训练数据。
通过日志文字进行分类,并让模型进行学习,让模型对于文字具备识别能力。
设计符合设计目标的计算模型。
通过基本验证标准后,将计算模型应用于日志更新的策略中,实现快速日志识别目标。
三、基本实现策略
1、提取部分有效的日志数据
2、进行关键数据分析,划分数据列,并提取具备共性的核心关键特征
3、将日志中表现关键指标的数据作为训练的X和Y
4、在X数据中进行关键词的分词,提取训练所需的词库,并形成id数据
5、转换X数据,将数据转换为数据矩阵
6、设计基本计算模型,形成合理的多层模型,确保计算的稳定性以及可靠性
7、进行多轮验证,直到寻求到最佳模型结构以及训练结果,并保存。
8、提取保存的模型,动态刷新es日志数据,并使用模型进行预测
9、将预测结果批量刷新至es数据库中,实现日志分类
10、将结果进行二次运用于其他分析和问题排查操作中。
四、核心算法
本系统主要涉及以下几个核心算法
1、分词算法
分词是本系统的核心需求,有效的分词能够帮助模型记忆数据含义。最终进行预测时,可以根据词意进行理解,提高最终识别的有效性和稳定性。
日志分词的特殊性在于日志文字的复杂性,往往是中文、英文、数字和特殊字符的混合体。因为在一般自然语言处理时,会考虑忽略特殊字符,但日志系统中的特殊字符往往具有其含义,因此实现分词时,保留特殊字符也是尤为重要。也因此,本系统的分词算法是实现最终目标的第一重要算法。
算法涉及主要方法的方法名伪代码如下:
change_mark_to_sp_word()
first_split_sentence('\W+')
analysis_word_for_chn_and_split_ag()
get_and_save_word_index()
append_word_index_array()
2、有效词分类算法
有效分词是分词系统中一个比较重要的子算法。主要解决的问题是,由于在我们的分词过程中,会遇到大量特殊的字符,例如hashcode,token等。这些字符在日志中往往不具备分类表意的作用,但在分词时,会因为他的不重复性,形成大量的无效分词。而矩阵计算时,需要实现定长矩阵的计算才能实现结果,因此必须要控制词库的容量在一定范围内。同时词库的增加也会增加计算的复杂度以及最终预测时的干扰性。
综上,务必在分词时,尽可能排除对于分类含义读取无效的字符干扰,将无效词不计入分类中。
本算法以文字形态表达:
排除以下文字进入有效词库:
超过特定长度的字符
唱过特定长度的数字
不排除所有中文字符
引入较大的英文词库,并根据英文词库,对单词进行有效性划分。
排除其他特定的无效字符。
其他字符作为有效字符进入到分词词库中。
3、模型构建算法
最终的训练和预测模型是整个算法最终落地的环节,因此选择合理的模型是至关重要的。
本模型考虑过基于卷积算法的深度卷积文字算法和基于循环神经网络的seq2seq模型算法。
基于卷积算法的特点在于模型理解比较简单,训练时匹配度也比较高而且训练收敛速度快,但缺陷也非常明显,基于卷积算法的逻辑在于基于一般词的特征向量计算目标关联度,以此判断计算结果和目标的有效性,但一旦模型顺序发生变更以及词意发生变更,预测结果会变得相当不稳定。但优点是
基于循环神经网络的seq2seq算法来进行计算,最大的缺点是计算速度慢,收敛度远不如卷积算法的收敛速度,但优点是根据词意进行记忆的模型,明显更趋于理解句意,更不容易受到环境变更的影响,稳定性也更好。
经过多次调整,最终模型结构如下:
Model: "sequential"
Layer (type) Output Shape Param #
embedding (Embedding) (None, 1000, 64) 4480000
dropout (Dropout) (None, 1000, 64) 0
batch_normalization (BatchNo (None, 1000, 64) 256
gru (GRU) (None, 1000, 32) 9408
gru_1 (GRU) (None, 5) 585
Total params: 4,490,249
Trainable params: 4,490,121
Non-trainable params: 128
因为本应用目标为特定多分类,因此分类函数使用了softmax,损失函数使用了CategoricalCrossentropy,梯度下降函数使用Adam函数。
模型中使用了两次dropout和一次batchNormalization来降低模型训练的拟合度,提高了模型的适应性。
最终测试集的测试结果如下:
test loss 0.09884617477655411
accuracy 0.978004515171051
五、实现平台
基于anaconda框架的python3.7版本平台实现。
基础环境依赖了部分es的接口和mysql数据库。
深度学习框架采用了tensorflow2.2版本。
六、实现结果
最终实现结果的几个描述维度:
结果运行设备的配置为:2.8GHz主频的CPU,2C8G配置。
1、平均预测速度
在不考虑es性能的情况下,提取出的数据进行转换然后预测的耗时,约为80-120s每2w条日志(取决于数据的长度和复杂度)。
2、预测精度
大约95%左右的预测准确度,识别误差更多来自于未学习过内容的判定偏差,通过扩展学习范畴可以改善。
3、语义理解能力
基本实现了自主语义识别,经过查询确认了部分应当标记为异常的日志数据保存时未作为异常数据保存,但仍然被模型识别为异常,且语句中并不包含常见的关键字,例如ERROR,异常等。
七、后续扩展考虑
1、扩展应用范围
因为本模型具备一般性,因此应用范围可以从目前的日志范围扩展到更大范围,从运维到研发层面,帮助用户快速发现和识别问题。
2、提升准确性
通过对分析数据的二次分析,增加学习的维度数据,继续训练模型,提升模型的预测准确度。
3、分类深度分析
在数据分析上,如果继续进行异常等级分类,可以将异常划分为不同等级,帮助开发和用户快速发现和识别问题。
4、异常统计
根据识别结果,快速生成特定服务的异常统计结果,并汇总为报表,实现质量报告以及用户异常行为报告等。
5、自动文本摘要
根据语义识别,形成语义文本摘要,但本目标涉及NLG(自然语言生成),当前模型更多为NLP(自然语言处理)。实现逻辑上仍然有一定偏差,实现复杂度会更高。