基于上述三种特性提取思绪,选择结果最佳的分词方法实习MLP模子,可以实习获得一个函数和参数组合,能满意对已知进攻范例的完全辨认。但因为该MLP模子的特性提取发哪个是,部门依靠法则,造成理论上永久存在漏拦和误判。由于对辨认方针来说样本永久是不充实的,必要人工不绝的Review,发明新的进攻方法,调解特性提取方法,调解参数,重实习…这条路貌似永久没有止境。
1. 为什么选择LSTM
回首下上述的Web进攻哀求,安详专家一眼便能辨认进攻,而呆板进修模子必要我们人工来汇报它一系列有区分度的特性,并行使样本数据团结特性,让ML模子模仿出一个函数获得一个是与非的输出。
安详专家看到一个url哀求,会按照自身脑海中的“履历影象”来对url哀求举办领略,url哀求布局是否正常,是否包括Web进攻要害词,每个片断有什么寄义…这些都基于对url哀求每个字符上下文的领略。传统的神经收集做不到这一点,然而轮回神经收集可以做到这一点,它应承信息一连存在。

恰恰操作LSTM对前后文领略上风,操作url哀求的前后字符判定是否为Web进攻。这个甜头是可以省去特性工程这一繁杂的进程。
正是这种对url哀求特性的领略方法,让它具备了必然对未知进攻的辨认手段。针对未知进攻变形来说,分词的MLP模子能领略cat,但对变形的 c’a’t则无法领略,由于分词会把它支解开来。而LSTM模子把每个字符看成一个特性,且字符间有上下文接洽,无论cat 、c’a't 或 c”’a”’t 、””c’a’t””,在颠末嵌入层的转换后,拥有近似的特性向量表达,对模子来说都是近似一回事。
2. 特性向量化和模子实习
这里仅对参数值哀求的参数值举办实习。
- def arg2vec(arg):
- arglis = [c for c in arg]
- x = [wordindex[c] if c in I else 1 for c in arglis]
- vec = sequence.pad_sequences([x], maxlenmaxlen=maxlen)
- return np.array(vec).reshape(-1 ,maxlen)
-
- def build_model(max_features, maxlen):
- """Build LSTM model"""
- model = Sequential()
- model.add(Embedding(max_features, 32, input_length=maxlen))
- model.add(LSTM(16))
- model.add(Dropout(0.5))
- model.add(Dense(1))
- model.add(Activation('sigmoid'))
- # model.compile(loss='binary_crossentropy,mean_squared_error',
- # optimizer='Adam,rmsprop')
- model.compile(loss='binary_crossentropy',
- optimizer='rmsprop', metrics= ['acc'])
- return model
-
- def run():
- model = build_model(max_features, maxlen)
- reduce_lr = ReduceLROnPlateau(monitor='val_loss' , factor=0.2, patience= 4 , mode='auto', epsilon = 0.0001 )
- model.fit(X, y, batch_size=512, epochs= 20, validation_split=0.1, callbacks = [reduce_lr])
- return model
-
- if __name__=="__main__":
- startTime = time.time()
- filename = sys.argv[1]
- data = pd.read_csv(filename)
- I = ['v', 'i', '%', '}' , 'r', '^', 'a' , 'c', 'y', '.' , '_', '|', 'h' , 'w', 'd', 'g' , '{', '!', '$' , '[', ' ', '"' , ';', 't ' , '>', '<', ' ', 'l' , 'n', ' r', '(', '=', ':', 'n' , '~', '`', '&', 'x', "'" , '+', 'k', ']', ')', 'f' , 'u', '', '0', 'q', '#' , 'm', '@', '*', 'e', 'z' , '?', 't' , 's', 'b' , 'p' , 'o' , '-', 'j' , '/',',' ]
- wordindex = {k:v+2 for v, k in enumerate (I)}
- max_features = len(wordindex) + 2 # 增进未知态(包括中文)和添补态
- maxlen = 128
- X = np.array([arg2vec(x) for x in data['args']]).reshape(- 1 ,128)
- y = data['lable']
- model = run()
- logger.info("模子存储!")
- modelname = 'model/lstm' + time.strftime('%y_%m_%d' ) + '.h5'
- model.save(modelname)

(编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|