AI异常检测方案实施-基于基准块的无监督学习
前言
上文讲到AI异常检测的几种方案规划,点击查看
由于我们只有“正确答案”,因此当前最符合的做法是使用autoencoder做无监督学习。
实施方案
- 背景
在网络设备配置、网络安全审计等场景中,配置文件的准确性和一致性至关重要。配置的错误或异常变动可能导致网络安全隐患和运营风险。通常情况下,设备配置块的内容有一定的“正常”格式和参数范围,若发生异常变化,则需及时检测并处理。
本方案旨在通过无监督学习的方法,利用大量的“基准块”数据,构建一个AI稽核系统,实现自动化的配置块异常检测。方案主要基于自编码器(Autoencoder)模型进行训练和检测,确保在缺乏明确异常数据的情况下,也能对新的配置块进行异常判断。 - 目标
- 利用已有的基准块数据,训练一个自编码器模型,使其学习基准块的“正常”特征。
- 在新的配置块输入时,自动判断其是否存在异常,并找出异常行及异常置信度。
- 实现一种灵活、可扩展的无监督学习方法,适用于多种配置块类型。
- 实施方案
3.1 数据预处理
为了确保模型的准确性,数据预处理是关键的一步。基准块中的每一行配置都需要被转换成模型可接受的输入特征。
3.1.1 基准块集合准备
- 收集各设备的配置块(如块)的多种“正常”配置,作为基准块的集合。这些基准块构成训练模型的输入数据,代表了不同设备配置的正确状态。
3.1.2 特征提取 - 文本嵌入:使用预训练的BERT模型或其他文本嵌入模型,将每一行配置转换为固定维度的向量表示。每行配置内容将被编码为一个768维的嵌入向量。
- 位置特征:为每行配置添加其在块中的位置,以捕获配置的顺序信息。可以简单地将行号作为一个特征值,附加到嵌入向量上。
3.1.3 数据集构建 - 块级特征矩阵:将一个配置块中所有行的嵌入向量拼接起来,形成块级特征矩阵,作为模型的输入。例如,一个包含10行的块将生成一个10×768的矩阵。
3.2 模型设计
我们选择使用**自编码器(Autoencoder)**模型来进行无监督异常检测。自编码器可以学习输入数据的特征,将其压缩到低维空间,再还原出来。基准块可以训练模型,使其能很好地还原“正常”配置,而对异常配置的还原误差会较大。
3.2.1 自编码器结构 - 输入层:每个配置块的特征矩阵(N×768,N为行数)。
- 编码器:由多层全连接神经网络组成,将输入特征压缩到低维的潜在空间。
- 解码器:将低维特征映射回到原始特征空间,生成与输入类似的输出。
- 输出层:与输入块的特征矩阵相同,用于计算重构误差。
3.2.2 模型训练 - 训练数据:使用所有收集的基准块特征矩阵进行训练。目标是让自编码器学习如何压缩和还原这些“正常”配置块。
- 损失函数:使用均方误差(MSE)来衡量输入与输出之间的差异,最小化该误差。
- 训练过程:对基准块进行多次迭代训练,直到模型能够较好地重构所有输入。
3.3 异常检测
在训练完成后,使用该自编码器模型对新的配置块进行检测,主要步骤如下:
3.3.1 输入新块 - 将新的配置块按照与基准块相同的方式进行预处理,提取特征矩阵。
3.3.2 计算重构误差 - 将预处理后的块特征输入到自编码器中,获取模型的重构输出。
- 计算新块特征矩阵与重构输出之间的误差(MSE),该误差反映了新块与基准块之间的差异程度。
3.3.3 异常判定 - 块级异常:设置一个全局重构误差阈值。若新块的整体误差超过阈值,则判定为异常块。
- 行级异常:逐行计算重构误差,找出每一行的异常程度,并根据误差大小确定异常置信度。可以为每行设置一个局部阈值,若某行的重构误差超过阈值,则标记为异常行。
3.4 输出异常信息 - 若判定一个配置块为异常,输出该块的异常行以及每行的异常置信度。
- 异常信息格式示例:
json
复制代码
{“block_name”: “aaa”,“is_anomalous”: true,“anomalous_lines”: [{“line_content”: “aaa-authorization-template 2003”,“confidence”: 0.85},{“line_content”: “aaa-authorization-type local”,“confidence”: 0.72}]}
3.5 异常阈值的确定 - 在模型训练后,需要使用验证集(从基准块中划分一部分数据)来确定异常检测的阈值。可以通过验证集的误差分布,选择一个合理的阈值,确保正常的配置块被识别为正常,而异常块能被准确检测出。
- 实施步骤
- 数据收集:收集多种基准配置块,准备数据集。
- 数据预处理:使用预训练的BERT模型提取配置块的行级别特征,构建块级特征矩阵。
- 模型训练:利用基准块特征训练自编码器模型,学习正常块的特征。
- 阈值确定:使用验证集确定块级和行级异常检测的误差阈值。
- 异常检测:将新的配置块输入模型,计算重构误差,判定是否异常,并输出异常行及其置信度。
- 持续改进:不断收集新的配置块,优化预处理、特征提取方法,提高模型的检测准确性。
- 优化与扩展
- 多块类型检测:可以针对不同类型的配置块(如块)构建多个自编码器模型,分别进行训练和检测。
- 异常解释性:结合基于规则的方法,对模型检测出的异常进行解释,辅助人工稽核。
- 持续学习:通过将检测到的异常块交由人工审核,积累更多数据,不断优化模型。
训练注意事项
对于基准块的数量,没有严格的下限要求,但为了让无监督模型(如自编码器)有效地学习配置块的正常特征,通常需要一定数量的基准块,以便模型能够捕捉到配置块中的变动范围和特征模式。以下是一些关于基准块数量的建议:
- 最小数量建议
- 最低 10-20 个基准块:对于相对简单的配置块(变化较少、行数较少),可能只需要 10 到 20 个基准块就可以开始训练模型,捕捉到最基本的正常特征。
- 更复杂的块:如果配置块的结构复杂,或者不同块之间的变动较大,建议至少准备 50-100 个基准块,以确保模型能充分学习到不同的“正常”模式。
- 基准块数量的影响
- 块数量越多,模型越稳健:更多的基准块可以让模型学到更广泛的配置变化范围,从而更好地识别异常。尤其是在有多种“正常”配置块的情况下,数量多的基准块能够提供更多的样本来训练模型,让模型区分正常变动和异常变动的能力更强。
- 过少的基准块可能导致过拟合:如果基准块数量过少,模型可能会过拟合于这些块,而不能很好地泛化到新的配置块上,导致误报异常。
- 增强数据的策略
如果很难收集到足够多的基准块,可以考虑以下数据增强策略:
- 插入变动:人为在已有的基准块中加入一些合理的变动,生成更多的基准块。例如,将参数值在合理范围内进行随机变化(如 IP 地址、端口号等)。
- 模糊匹配:对于类似的配置项,随机调整顺序或增加一些额外的配置,以模拟真实环境中可能出现的多样性。
接下来就是代码实现,实际只要选好了相关的模型、使用流程、损失函数,训练基本就没太大偏差了。有兴趣可以关注,留言交流。