循环神经网络检测异常操作
Posted Neil-Yale
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了循环神经网络检测异常操作相关的知识,希望对你有一定的参考价值。
神经网络可以当做是能够拟合任意函数的黑盒子,只要训练数据足够,给定特定的x,就能得到希望的y,结构图如下:
将神经网络模型训练好之后,在输入层给定一个x,通过网络之后就能够在输出层得到特定的y,那么既然有了这么强大的模型,为什么还需要RNN(循环神经网络)呢?
他们都只能单独的取处理一个个的输入,前一个输入和后一个输入是完全没有关系的。但是,某些任务需要能够更好的处理序列的信息,即前面的输入和后面的输入是有关系的。
标准的全连接神经网络(fully connected neural network)处理序列会有两个问题:1)全连接神经网络输入层和输出层长度固定,而不同序列的输入、输出可能有不同的长度,选择最大长度并对短序列进行填充(pad)不是一种很好的方式;2)全连接神经网络同一层的节点之间是无连接的,当需要用到序列之前时刻的信息时,全连接神经网络无法办到,一个序列的不同位置之间无法共享特征。而循环神经网络(Recurrent Neural Network,RNN)可以很好地解决问题。
在介绍循环神经网络之前,先来了解一些序列数据:
当然,本次我们使用的数据集中的一系列异常操作的命令也可以看做是序列
接下来看看一个经典的循环神经网络
对于 RNN,一个非常重要的概念就是时刻。RNN 会对每一个时刻的输入结合当前模型的状态给出一个输出。上图中,t 时刻 RNN 的主体结构 A 的输入除了来自输入层x-t,还有一个循环的边来提供从 t−1 时刻传递来的隐藏状态。
RNN 可以被看作是同一个神经网络结构按照时间序列复制的结果,下图展示了一个展开的 RNN
从 RNN 的展开结构可以很容易知道它最擅长解决的问题是与时间序列相关的。RNN 也是处理这类问题时最自然的神经网络结构。
RNN 的主体结构 A 按照时间序列复制了多次,结构 A 也被称之为循环体。如何设计循环体 A 的网络结构是 RNN 解决实际问题的关键。和卷积神经网络(CNN)过滤器中参数共享类似,在 RNN 中,循环体 A 中的参数在不同时刻也是共享的。
下图展示了一个最简单的使用单个全连接层作为循环体 A 的 RNN,图中黄色的 tanh 小方框表示一个使用 tanh 作为激活函数的全连接层
t时刻循环体 A 的输入包括 Xt 和从t-1时刻传递来的隐藏状态 ht-1(上图红色标注的位置)。循环体 A 的两部分输入如何处理呢?将 Xt和 ht-1直接拼接起来,成为一个更大的矩阵/向量 [Xt,ht-1]。假设Xt和 ht-1的形状分别为 [1, 3] 和 [1, 4],则最后循环体 A 中全连接层输入向量的形状为 [1, 7]。拼接完后按照全连接层的方式进行处理即可。为了将当前时刻的隐含状态 ht转化为最终的输出yt,循环神经网络还需要另一个全连接层来完成这个过程。这和卷积神经网络中最后的全连接层意义是一样的。(如果不考虑 RNN 的输出还需要一个全连接层的情况,那么 ht和yt的值是一样的)
RNN 的前向传播计算过程如下图所示:
上图很清晰地向我们展示了 RNN 循环体 A 中具体的计算流程,以及当前隐藏状态 ht转化为最终输出yt的过程
RNN 面临的一个技术挑战是长期依赖(long-term dependencies)问题,即当前时刻无法从序列中间隔较大的那个时刻获得需要的信息。在理论上,RNN 完全可以处理长期依赖问题,但实际处理过程中,RNN 表现得并不好。
但是 GRU 和 LSTM(门控循环单元(Gated Recurrent Unit,GRU)和 长短时记忆网络(Long Short Term Memory,LSTM)) 可以处理梯度消散问题和长期依赖问题
相比于基础的RNN,GRU 和 LSTM 与之不同的地方在于循环体 A 的网络结构。
GRU 和 LSTM 都引入了一个的概念,门(gate)。GRU 有两个“门”(“更新门”和“重置门”),而 LSTM 有三个“门”(“遗忘门”、“输入门”和“输出门”)。
LSTM如下所示
GRU如下所示
GRU 和 LSTM 靠一些“门”的结构让信息有选择地影响循环神经网络中每个时刻的状态。所谓“门”结构,就是一个使用 sigmoid 的全连接层和一个按位做乘法的操作,这两个操作合起来就是一个“门”结构,如下图所示
之所以叫“门”结构,是因为使用 sigmoid 作为激活函数的全连接神经网络层会输出一个 0 到 1 之间的数值,描述当前输入有多少信息量可以通过这个结构。于是这个结构的功能就类似于一扇门,当门打开时(sigmoid 全连接层输出为 1 时),全部信息可以通过;当门关上时(sigmoid 神经网络层输出为 0 时),任何信息都无法通过。
LSTM 有三个门,分别是“遗忘门”(forget gate)、“输入门”(input gate)和“输出门”(output gate)。“遗忘门”的作用是让循环神经网络“忘记”之前没有用的信息。“输入门”决定哪些信息进入当前时刻的状态。通过“遗忘门”和“输入门”,LSTM 结构可以很有效地决定哪些信息应该被遗忘,哪些信息应该得到保留。LSTM 在得到当前时刻状态Ct之后,需要产生当前时刻的输出,该过程通过“输出门”完成。
GRU 的两个门:一个是“更新门”(update gate),它将 LSTM 的“遗忘门”和“输入门”融合成了一个“门”结构;另一个是“重置门”(reset gate)。从直观上来说,‘重置门’决定了如何将新的输入信息与前面的记忆相结合,‘更新门’定义了前面记忆保存到当前时刻的量。那些学习捕捉短期依赖关系的单元将趋向于激活‘重置门’,而那些捕获长期依赖关系的单元将常常激活‘更新门’。
了解了循环神经网络的基础结构后,我们来看看如何将其应用于异常操作的检测。
本次实验使用的数据集来自SEA数据集。
2001年Schonlau等人第一次将内部攻击者分类成叛徒(Traitor)与伪装者(Masquerader),其中叛徒指攻击者来源于组织内部,本身是内部合法用户,而伪装者指外部攻击者窃取了内部合法用户的身份凭证,从而利用内部用户身份实施内部攻击。随后该团队构造了一个公开的检测伪装者攻击的数据集SEA,该数据被广泛用于内部伪装者威胁检测研究。
SEA数据集涵盖70多个UNIX系统用户的行为日志,这些数据来自于UNIX系统acct机制记录的用户使用的命令。SEA数据集中每个用户都采集了15000条命令,从用户集合中随机抽取50个用户作为正常用户,剩余用户的命令块中随机插入模拟命令作为内部伪装者攻击数据。SEA数据集中的用户日志类似于下面的命令序列:
{cpp, sh,cpp, sh, xrdb, mkpts…}
每个用户的数据按照100命令长度分为150个块,前三分之一数据块用作训练该用户正常行为模型,剩余三分之二数据块随机插入了测试用的恶意数据。SEA数据集中恶意数据的分布具有统计规律,任意给定一个测试集命令块,其中含有恶意指令的概率为1%;而当一个命令块中含有恶意指令,则后续命令块也含有恶意指令的概率达到80%。可以看出SEA中的数据集将连续数据块看作一个会话,只能模拟连续会话关联的攻击行为;此外由于缺乏用户详细个人信息(职位、权限等)、数据维度单一(仅有命令信息)以及构造性(恶意数据由人工模拟)等因素,数据集在内部威胁检测研究中作用有限。不过作为实验,使用该数据集是没有问题的。
我们来尝试识别Masquerader的异常操作,文件夹中的文件如下所示
打开任何一个
可以看到和介绍的一样,都是由命令序列组成。我们在后面代码实现过程中,可以将每个命令当成一个单词,使用词集模型进行处理
另外这里还有一个label.txt,里面已经打好了标签
0表示正常指令,1表示恶意指令
来看看代码实现部分
逐行读取文件并加载命令,并且每100个命令组成1个向量。把每个命令当成一个单词,使用词集模型处理
使用生成词集的词汇表对操作命令进行编码,将操作命令序列化
获取label.txt中的标签
搭建网络,下面的代码中我们使用了两层lstm,在全连接层(fully_connected)设置激活函数为softmax,在回归层(regression)需要指定一个TensorFlow梯度下降优化器,这里指定为adam,并设置学习速率为0.1
开始训练模型并进行交叉验证
tflearn.DNN是TFLearn中提供的一个模型wrapper,相当于我们将很多功能包装起来,我们给它一个net结构,生成一个model对象,然后调用model对象的训练、预测、存储等功能在fit()函数中epoch=5表示会跑5epoch,batch_size=32表示一次用32个数据计算参数的更新。
测试结果如下
Python3 Abnormal-Op.py
可以看到训练集为80,测试集为70.
准确率(acc)一开始就有84.8%,1个epoch表示过了1遍训练集中的所有样本,后面随着epoch增加到适当的情况下,会从欠拟合往过拟合走,所以我们从上图也可以看到,并不是约到后来准确率越高,这一点大家自己在进行机器学习代码编写过程中一定要注意。
参考:
1.https://www.cnblogs.com/wuliytTaotao/p/9512963.html
2.https://zhuanlan.zhihu.com/p/30844905
3.《web安全与机器学习》
4.https://github.com/duoergun0729/1book/
以上是关于循环神经网络检测异常操作的主要内容,如果未能解决你的问题,请参考以下文章
《异常检测——从经典算法到深度学习》19 OmniAnomaly:基于随机循环网络的多元时间序列鲁棒异常检测
《异常检测——从经典算法到深度学习》19 OmniAnomaly:基于随机循环网络的多元时间序列鲁棒异常检测