system: [SYSTEM]

user: 4. 基于深度置信网络的入侵检测方法 4.1. 深度置信网络用于入侵检测的特点 入侵检测系统一般部署在局域网网络环境中，用于保护该网络，及时检测和发现网络中的入侵行为，这就要求入侵检测系统要实时地对网络环境中进出的大量数据包进行检测。 首先涉及到检测速度问题：传统基于误用的检测方法事先在规则库中存有大量入侵判断的规则，检测时通过抓取网络数据包，并逐一与规则库中的全部规则进行对比，来确定该数据包是否属于入侵及入 Table 1 Contrastive Divergence algorith Algorithm. Contrastive Divergence (CD算法) Input: RBM（ V 1 ， ⋯ ， V m ， H 1 ， ⋯ ， H n )，training batch S Output： Δ w i j ， Δ b j ， Δ c i ， for i = 1 ， ⋯ ， n ; j = 1 ， ⋯ ， m init Δ w i j = Δ b j = Δ c i = 0 for i = 1 ， ⋯ ， n ; j = 1 ， ⋯ ， m for all the v ∈ S do v ( 0 ) ← v do for t = 0 ， ⋯ ， k − 1 do for i = 1 ， ⋯ ， n do sample for j = 1 ， ⋯ ， m do sample v j ( t + 1 ) ~ p ( v j | h ( t ) ) for i = 1 ， ⋯ ， n ， j = 1 ， ⋯ ， m do Δ w i j ← Δ w i j + p ( H i = 1 | v ( 0 ) ) ⋅ v j ( 0 ) − p ( H i = 1 | v ( k ) ) ⋅ v j ( k ) Δ b j ← Δ b j + v j ( 0 ) − v j ( k ) Δ c i ← Δ c i + p ( H i = 1 | v ( 0 ) ) − p ( H i = 1 | v ( k ) ) 表1. 对比散度算法 侵的类别，检测的时间复杂度按规则库中规则数量的幂基数增长。当网络流量不大时，基于误用的检测方法速度还能满足检测要求，但是当网络流量增大到一定水平时，检测速度就无法实时对所有数据包进行检测，甚至出现丢包现象。而基于深度置信网络的检测方法则不存在这种问题，因为基于深度置信网络的检测方法中没有规则库，而只有一个训练好的网络，网络的输入是预处理后的数据包，网络的输出是数据包的入侵类别，即使网络流量成倍增加，检测的时间复杂度也是同网络流量相等速率的增加，检测速度的上限较误用检测方法有了极大的提升。 其次是检测数据的属性问题，在基于误用的检测方法和基于异常的检测方法中，均要处理数据包中字符取值的属性，这就要用到字符串匹配算法，就不可避免的降低了数据包的处理速度，而基于深度置信网络的检测算法中不存在该问题，因为在将数据包送入深度置信网络计算之前，已经经过了预处理过程，将字符取值的属性转化为了合理取值范围内的数值型数据，网络只需要进行简单的数值数据的计算，这也在一定程度上提高了深度置信网络算法的检测速度。 当然基于深度置信网络的检测方法也有需要特殊处理的地方。入侵检测数据是从实际数据包中提取出的原始特征，不同于图片识别、视频处理这些场景仅涉及0~255之间的数值型数据，数据包中的数据特征有数值型和非数值型，离散型和连续型之分，并且不同特征的取值范围差异很大，这就导致需要先对数据进行数值化，归一化等预处理，以屏蔽量纲上的差异。其次，入侵检测数据集是从实际网络环境中抓取到的数据，是对真实网络环境的反映，所以不可避免地存在正常数据较多，而异常数据相对较少的问题，因此也需要对数据分布差异较大这一问题做特殊处理。 4.2. 少数类标签处理 在用网络数据包进行深度置信网络训练时，存在一个数据集中的类别数目差异问题，当某类标签的数据在全部数据集中的比重很大，而有些标签的数据所占比重很小时，少类别的数据往往会被预测为多类别的标签。本文采用过取样的处理方法：对少类别的样本，通过复制并加入随机噪音的方法产生出较多的新样本，将新生成的样本和原始样本一起送入网络进行训练。对多类别的样本没有采取删除部分样本的欠取样方式，是为了避免可能会丢失未知信息。在过取样之前，训练样本的类别分布如表2所示。 过取样后，所有数目少于600的类别都通过加入随机噪音的方法将数目增加到600。 Table 2 Number distribution of training data se 入侵类别 数量 入侵类别 数量 Normal 13416 guess_password 10 neptune 8262 ftp_wirte 1 warezclient 180 multihop 2 ipsweep 709 Rootkit 4 Portsweep 586 buffer_overflow 6 Teadrop 187 imap 5 namp 301 warezmaster 7 satan 689 Phf 2 smurf 529 land 1 Pod 38 LoadModule 1 Back 196 spy 1 表2. 训练数据集类别数量分布 4.3. 数据归一化处理 在大多数深度学习的实验中，都是将训练数据和测试数据先数值化再归一化，且一般都是归一化到[0， 1]区间，但是在实际操作中，训练数据和测试数据在一个具体的特征上，其取值范围是不同的，尤其是测试集中出现大量训练集从未出现的新记录时，这样就会导致对于一个特征，同一个数值分别在训练集和测试集归一化后的取值是不同的。如果特征原始值为字符型，经过这样就会导致同一字符在训练集和测试集中归一化后的取值也不相同，这显然不合逻辑。比如对于某一个字符型特征，训练集中可能的取值范围为(A， B， C， D， E)，测试集中的取值范围为(A， B， C， D， E， F)。对训练集数值化再归一化，可以得到对应的(0，0.25， 0.5， 0.75， 1.0)，对测试集数值化再归一化，可以得到(0， 0.2， 0.4， 0.6， 0.8， 1.0)，可以看出，对于同一个取值为B的特征值，它在训练阶段和测试阶段参与计算的取值分别为0.25和0.2，这样的计算结果就不严谨，对于这种情况，本文采取的方法是不归一化到[0， 1]区间，而是根据训练集的取值区间来决定测试集的取值区间。步骤如下： 1) 训练集数据的非数值特征数值化； 2) 对数值化后训练集所有的特征归一化，归一化到[0， 1]区间； 3) 测试集数据的非数值特征数值化； 4) 按照训练集中所有特征的取值把测试集中的相同特征进行归一化，测试集中新出现的特征按比例归一化到[0， 1]区间外； 虽然当测试集的取值区间比训练集大时，测试集的归一化区间会超过[0， 1]，但是保证了在测试集出现新取值时，训练集和测试集归一化结果是一致的。比如上例中，测试集归一化后的结果是(0， 0.25， 0.5， 0.75， 1.0， 1.25)。这样只有测试集中新出现的F使用了新的数值1.25，而其他的A，B，C，D，E均保留了和训练集中一样的取值。 4.4. 整体结构 基于深度置信网络的入侵检测方法采用若干层(由实验确定)RBM堆叠构建RBM栈，在RBM栈的最后加上一个有监督的BP神经网络，以最后一层RBM的输出作为BP神经网络的输入，以训练集数据的标签和BP输出的均方差作为损失函数，训练BP网络，使整个DBN网络具备分类的能力。 整个模型的训练过程如下： 先对RBM堆叠栈使用贪心无监督方法逐层构建，训练集在不使用标签的情况下被用来训练RBM栈的参数空间 θ ( w ， b ， c ) ，这一过程也叫作无监督学习阶段。 使用梯度下降算法优化BP神经网络，训练集在附带标签的情况下用来训练BP神经网络的参数空间 θ ( w ， b ) 。这一过程也叫作有监督学习阶段。 4.5. 参数训练方法 基于深度置信网络的入侵检测方法中存在两处参数训练的过程，分别是无监督学习阶段的参数训练和有监督学习阶段的参数训练，无监督学习阶段主要是对RBM栈的参数进行训练，使RBM栈能准确地对原始数据进行特征提取，方法是对比散度算法；有监督学习阶段训练的是BP网络的参数，使BP网络能在类别标签的指导下准确识别出特征提取后的数据包类别。在这两个参数训练过程中，均存在一定的缺陷，传统的对比散度算法每次只训练一个样本数据，迭代次数多，效率较低；BP算法容易陷入局部最小值，收敛速度慢 [ 20 ] ，以及没有兼顾少类别标签，针对这些问题，本文提出了一种新的方法来训练参数。 首先在无监督学习阶段，采用批梯度下降的对比散度算法来加快参数的训练过程。将训练集随机划分为若干批次，不再针对每个数据进行参数更新，而是以批次为单位，计算每批次的权重和偏置的更新量，更新公式如下： 权值的修正量： Δ w = α Δ w + η ( c 1 − c 2 ) / n (1) 隐含层偏置的修正量： Δ c = α Δ c + η ( h 1 − h 2 ) / n (2) 可见层偏置的修正量： Δ b = α Δ b + η ( v 1 − v 2 ) / n (3) 其中 c 1 = v 1 h 1 ， c 2 = v 2 h 2 ，v 1 是对比散度算法中可见层第一次取值，h 1 是根据v 1 计算出的隐含层第一次取值，v 2 是根据h 1 计算出的可见层第二次取值，h 2 是根据v 2 计算出的隐含层第二次取值，n是每批次中包含的样本数目，α，η分别为学习动量和学习率。 在有监督学习阶段，采用批梯度区分下降的可变学习率算法来训练参数，误差计算公式如下： 输出层的误差： δ k = o k ( 1 − o k ) ( t k − o k ) (4) 隐含层的误差： δ j = o j ( 1 − o j ) ∑ k δ k w k j (5) 对于每批次，输出层误差为： δ o = ∑ 1 n δ k ρ k (6) ρ k = n k ⋅ N / n ⋅ N k 隐含层误差为： δ h = ∑ 1 n δ j ρ k (7) 其中 ρ k = n k ⋅ N / n ⋅ N k 表示不同类别样本在误差度量上的区分度，n k 表示在该批次中k所代表的样本类别出现的次数，n是该批次的总样本数，N k 表示k所代表的类别在整个训练样本中出现的次数，N是整个样本的总数目。通过加入区分度可以提高少类别样本误差在批度误差中的比重，进而加强对少类样本的拟合。 根据上面求出的训练误差，权值和偏置的修正量为： Δ w = α Δ w + η δ o o j (8) Δ c = α Δ c + η δ h (9) 上面两个过程中α，η分别为学习动量和学习率，学习动量表示每一次权重和偏置的变化量受上一次变化量的影响程度，学习率表示权重和偏置的变化量随误差更新的步长。α和η的更新规则如下： 如果训练误差在权值更新后增加了，并且超过了设定的一个阈值ξ (根据经验ξ可以取3%到10%之间，一般取5%)，则权值更新被取消，学习速率η被乘以一个因子 ρ ( 0 < ρ < 1 ) ，动量系数α被设置为0。 如果训练误差在权值更新后减小了，则权值更新被接受，学习速率η被乘以一个因子 ρ ′ ( ρ ′ > 1 ) ，如果动量系数α被设置为0，则恢复到0之前的值；如果α没有被设置为0，则将α也乘以因子 ρ ′ 。 如果训练误差在权值更新后增加了，但是增加量小于设定阈值ξ，则此次权值更新被接受(之所以在均方误差增加的情况下仍然接受取值更新，是为了尝试跳出局部最小值点)，学习速率保持不变，如果动量系数α被设置为0，则恢复到0之前的值；如果α没有被设置为0，则将α乘以一个因子 ρ ( 0 < ρ < 1 ) 。