摘要

在线检测计算机系统的异常是保护系统不受恶意攻击或故障的关键。系统日志记录了详细信息,广泛用于系统状态分析。

本文提出了一种基于BERT的日志异常检测方法LogBERT,通过两个自监督训练任务学习正常日志序列的模式,并能够检测出底层模式偏离正常日志序列的异常。

介绍

系统日志记录了系统产生事件的详细信息,许多传统的机器学习模型被用来从日志消息中识别异常事件,需要从日志消息中提取特征。由于数据不平衡的问题,训练一个二进制分类器来检测异常日志序列是不可行的。因而许多无监督学习模型,如PCA,一分类模型被广泛用于异常检测;但传统的机器学习模型,如单类支持向量机,很难捕获离散日志消息的时间信息。

近年深度学习模型,特别是RNN由于能够对顺序数据建模,广泛应用于日志异常检测。但RNN对日志数据建模仍有一定的局限性。

首先RNN可以通过递归公式捕获序列信息,但不能使每个日志序列中编码左右上下文信息。而观察完整的上下文信息而不仅仅是前面步骤中的信息对恶意攻击是至关重要的。

其次,当前基于rnn的异常检测模型,通过给定先前的日志消息预测下一条日志消息来捕获正常序列的模式。该训练目标主要关注捕获正常序列日志消息之间的相关性。当日志序列中的这种相关性变化时,RNN模型就不能根据之前的日志消息正确预测下一个日志消息,而将该序列标记为异常序列。但仅用对下一个日志消息的预测作为目标函数,不能显式地编码所有正常序列所共有的共同模式。

为解决rnn模型的问题,本文提出了一种基于BERT的日志异常检测方法LogBERT。利用BERT捕获正常日志序列的模式,使用BERT的结构期望将每条日志的上下文都能捕获。

使用两个自监督训练任务:

1)掩码日志关键词预测,正确预测正常日志序列中随机掩码的词汇;

2)超球体积最小化,使正常日志序列在嵌入空间中彼此接近。

训练后LogBERT 可编码正常日志序列的信息,进而得到序列异常检测准则。

相关工作

传统的方法使用关键字或正则表达式检测异常日志,但不能检测基于序列的异常,即每条日志正常,但整个序列是异常的。

基于机器学习的方法;使用日志解析器将日志消息转换为日志键,使用TF-IDF等特征提取方法构建特征向量,并用滑动窗口中的日志键序列,采用无监督方法检测异常序列。

基于深度学习的日志异常检测方法,大多采用循环神经网络,LSTM或GRU对正常日志序列建模。

LogBERT

android 异常日志 日志异常检测_编码器

使用BERT捕获正常序列模式信息。

框架

给定日志消息序列,检测该序列正常或异常。

为标识日志消息,先使用日志解析器提取日志键。

将一个日志序列定义为一个有序的日志键S = [ki,…, kt, . ., kr)。

目的是使用只包含正常日志的序列训练数据集预测新的日志序列是否异常。LogBERT对正常序列进行建模,后接异常检测准识别异常序列。

输入表示

给定一个正常的日志序列S,在开头添加特殊的令牌DIST,作为第一个日志键,表示整个日志序列。LogBERT将每个日志模板表示为x,x是log词向量和位置想了的总和。随机生成矩阵E(k*d)作为log向量矩阵,其中d为日志向量的维数,而位置向量T(T*d)使用正弦函数将日志位置信息按顺序编码。日志模板输入表征:

android 异常日志 日志异常检测_android 异常日志_02

 

Transformer编码器

LogBERT使用Transformer编码器学习序列中日志模板的上下文关系。

编码器由多个Transformer层组成。每层Transformer包括一个多头自注意和一个位置前馈子层,两个子层使用残差连接,再进行层归一化。多头注意采用并行自注意,获取输入日志序列上不同位置的不同方面信息。

对于第 l 层注意力层,截取点积自注意力定义如下:

android 异常日志 日志异常检测_最小化_03

android 异常日志 日志异常检测_编码器_04

Xj 是日志序列的表征,

WQ,WK,WV是第 l 个头的线性映射的去权重,

dv是注意力层一个头的维度。

每个自注意力都使每条模板注意到序列中所有的日志模板,计算每个日志模板的隐藏表示 。

多头注意力应用平行的自注意力捕获不同日志模板不同方面的信息。

android 异常日志 日志异常检测_最小化_05

Wo是映射矩阵,do是多头注意力子层输出的维度。

目标函数

使用两种自监督训练捕获正常日志序列模式;

MLKP

为捕获日志序列双向上下文信息,训练LogBERT预测日志序列中掩盖的日志模板,目标是预测随机掩盖的日志模板,使LogBERT编码正常日志序列的前置知识。

将第j个日志序列中的第i个掩盖的上下文向量输入softmax函数,该函数输出整个日志模板集合的概率分布

android 异常日志 日志异常检测_编码器_06

Wc和Wb 是训练参数,使用交叉熵损失目标函数预测掩盖的日志模板;

android 异常日志 日志异常检测_异常检测_07

Yj[MASKi] 表示第i个掩码标识的真实日志模板,M为第j个日志序列中掩盖标识的总数;因为正常和异常日志序列的模式是不同的,LogBERT可以正确预测掩盖的日志模板,就可以区分正常和异常日志序列。

VHM

超球面体积最小化;使用球形目标函数控制正常日志序列分布。

在向量空间中,正常日志序列应该集中且彼此靠近,而异常日志序列远离球中心。

首先获得正常日志序列表征,使用均值计算中心表征,使用DIST表征日志序列

中心

android 异常日志 日志异常检测_编码器_08

,目标函数如下:

android 异常日志 日志异常检测_异常检测_09

 

最小化上式,使正常日志序列靠近中心,异常日志序列远离中心。

同时,Transformer编码器可以通过中心表示c利用来自其他日志序列的信息,因为c编码了普通日志序列的所有信息,模型能够以更高的精度预测正常日志序列的掩盖的日志模板,因为正常日志序列通常共享类似的模式。

LogBERT 的总体目标函数:

android 异常日志 日志异常检测_编码器_10

,α为超参数。

异常检测

训练后,LogBERT日志异常检测的核心是,模型在正常的日志序列上训练,如果测试日志序列是正常的,可以在预测掩盖的日志模板上达到较高的精度。根据MASK标记上的预测结果得出一个日志序列的异常得分。

给定一个测试日志序列,随机地用MASK标记替换一定比率的日志模板及标识,将随机屏蔽的日志序列作为LogBERT的输入。根据softmax计算概率分布,表示在MASK位置出现日志模板的可能性。构建了由g个正常日志键组成的候选集,其中最大的g个似然值由y[maski]计算获得。

如果真实的日志模板在候选集中,则为正常,如果观察到的日志模板不在LogBERT预测的top-g候选集中,则认为该模板为异常。

当一个日志序列包含超过r个异常日志键时,将这个日志序列标记为异常。

超参数 g 和 r,可通过验证集调整。

总结

日志异常检测是保护计算机系统免受恶意攻击或故障的必要手段。

为了只使用正常日志序列训练LogBERT,使用两个自监督训练任务。

一种是预测日志序列中被屏蔽的日志模板,

另一种是使正常日志序列在嵌入空间中彼此接近。

使用正常日志序列的训练后,LogBERT能够检测到异常的日志序列。

 

参考:


代码:GitHub - HelenGuohx/logbert: log anomaly detection via BERT