如何使用Keras框架來(lái)構(gòu)建LSTM RNN來(lái)對(duì)網(wǎng)絡(luò)請(qǐng)求進(jìn)行區(qū)分
推薦 + 挑錯(cuò) + 收藏(0) + 用戶評(píng)論(0)
向量機(jī)(SVM)、神經(jīng)網(wǎng)絡(luò)和無(wú)監(jiān)督模型。
學(xué)術(shù)界和實(shí)際應(yīng)用領(lǐng)域目前正時(shí)刻關(guān)注著深度學(xué)習(xí)和神經(jīng)網(wǎng)絡(luò)的最新進(jìn)展。事實(shí)證明,深度學(xué)習(xí)和神經(jīng)網(wǎng)絡(luò)在圖像識(shí)別和自然語(yǔ)言處理(NLP)方面表現(xiàn)出眾。我們是否可以利用神經(jīng)網(wǎng)絡(luò)的NLP能力來(lái)處理這個(gè)分類問(wèn)題呢?這就是我們想要測(cè)試的。
我們通過(guò)模擬API給出JSON形式的訪問(wèn)請(qǐng)求日志,如下所示:
{ “ timestamp”: 1502135820943, “ method”: “get”, “ query”: { “query”: “Lawn & Garden Buying Guides”}, “ path”: “/search”, “ statusCode”: 200, “ source”: { “remoteAddress”:“22.73.58.187”, “userAgent”: “Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36”}, “route”: “/search”, “ headers”: { “host”: “l(fā)ocalhost:8002”, “connection”: “keep-alive”, “cache-control”: “no-cache”, “user-agent”: “Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36”, “accept”: “*/*”, “accept-encoding”: “gzip, deflate, br”, “accept-language”: “en-US,en;q=0.8,es;q=0.6”}, “ requestPayload”: null, “ responsePayload”: “SEARCH”}
JSON格式的數(shù)據(jù)是不能用作神經(jīng)網(wǎng)絡(luò)模型的輸入的。模型的輸入必須是數(shù)字,因此,需要對(duì)文本進(jìn)行預(yù)處理。由于請(qǐng)求日志的內(nèi)容包含各種字符串、符號(hào)和數(shù)字,因此,我們選擇將每個(gè)日志條目預(yù)處理為字符序列。
將日志條目作為字符序列進(jìn)行處理,就是將請(qǐng)求日志文本中的每個(gè)字符映射到字典中的數(shù)字。相關(guān)聯(lián)的數(shù)字表示該字符出現(xiàn)的頻率。這個(gè)字典最初是用訓(xùn)練數(shù)據(jù)來(lái)創(chuàng)建和擬合的,這樣,后續(xù)的字符就可以映射到以前曾經(jīng)出現(xiàn)過(guò)的字符上去。例如,在字典中,“,”字符是訓(xùn)練數(shù)據(jù)集中第七個(gè)出現(xiàn)頻率最高的字符:
{ “ ”: 39, “(”: 77, “,”: 7, “0”: 8, “4”: 26, “8”: 28, “《”: 64, “D”: 71, “H”: 59, “L”: 61, 。。.
字符序列學(xué)習(xí)的一個(gè)不錯(cuò)的選擇是使用遞歸神經(jīng)網(wǎng)絡(luò)(RNN)。更具體點(diǎn)說(shuō),就是選擇使用RNNs的長(zhǎng)短期記憶網(wǎng)絡(luò)(LSTM)變體,因?yàn)樗趯W(xué)習(xí)序列的應(yīng)用中被廣泛使用并取得了成功。 LSTM有點(diǎn)復(fù)雜,但這并不是這篇文章的重點(diǎn),不過(guò)如果在高層次上對(duì)此有一點(diǎn)了解的話,在修改模型時(shí)會(huì)有一些幫助。更多有關(guān)序列學(xué)習(xí)和LSTM的實(shí)踐可以在Andrej Karpathy編寫(xiě)的RNNs的不合理有效性一文中找到。
為了快速開(kāi)發(fā)神經(jīng)網(wǎng)絡(luò)模型,我們選擇使用運(yùn)行在Tensorflow之上的高級(jí)Keras API,而不是直接使用Tensorflow。通過(guò)使用Keras為T(mén)ensorflow提供的樣板設(shè)置,我們能夠節(jié)約很多時(shí)間,并快速地構(gòu)建起模型原型。
Keras的神經(jīng)網(wǎng)絡(luò)模型使用起來(lái)非常容易,只需實(shí)例化一個(gè)模型對(duì)象,然后就可以添加層了!初始的嵌入層指定了矢量輸入的預(yù)期維度,LSTM隱藏層則由64個(gè)神經(jīng)元以及單獨(dú)的壓差層來(lái)定義以減少方差,最后則是密集輸出層以產(chǎn)生分類置信度。
model = Sequential() model.add(Embedding(num_words, 32, input_length=max_log_length)) # Prevent overfitting using dropout method of regularizationmodel.add(Dropout( 0.5)) model.add(LSTM( 64, recurrent_dropout= 0.5)) model.add(Dropout( 0.5)) # Condense to single binary output valuemodel.add(Dense( 1, activation= ‘sigmoid’)) model.compile(loss= ‘binary_crossentropy’, optimizer= ‘a(chǎn)dam’, metrics=[ ‘a(chǎn)ccuracy’]) # Training set automatically split 75/25 to check validation loss/accuracy at each epochmodel.fit(X_train, Y_train, validation_split= 0.25, epochs= 3, batch_size= 128, callbacks=[tb_callback]) # Evaluation of separate test dataset performed after trainingscore, acc = model.evaluate(X_test, Y_test, verbose= 1, batch_size= 128)訓(xùn)練
使用LSTM RNN二元分類法則意味著是在模型上應(yīng)用監(jiān)督學(xué)習(xí)算法。因此,訓(xùn)練數(shù)據(jù)集中的每個(gè)日志條目都需要有一個(gè)附帶的標(biāo)簽來(lái)描述該記錄的請(qǐng)求是正常的還是嘗試注入攻擊的。
0= Normal requestlogentry 1= Requestlogindicates attempted injection attack
對(duì)于生成數(shù)據(jù)來(lái)訓(xùn)練模型,則可以使用模擬API來(lái)模擬一個(gè)非常簡(jiǎn)單的電子商務(wù)應(yīng)用程序。例如,模擬出/login、 /search、/checkout等URL。由于我們并沒(méi)有真實(shí)用戶去訪問(wèn)模擬API,因此我們需要引入一些運(yùn)行時(shí)選項(xiàng)來(lái)運(yùn)行服務(wù)器并自動(dòng)執(zhí)行請(qǐng)求。我們將這些自動(dòng)化的請(qǐng)求流量調(diào)整為每分鐘100次,這樣訓(xùn)練數(shù)據(jù)集的日志就能快速積累起來(lái)。
通過(guò)將自定義的日志記錄器添加到服務(wù)器框架中,可以輸出指定格式的數(shù)據(jù)集。為了區(qū)分正常和惡意請(qǐng)求,需要在所有的惡意請(qǐng)求前添加一個(gè)“attack”頭。通過(guò)檢查是否存在“attack”頭來(lái)確定每個(gè)請(qǐng)求日志條目的標(biāo)簽。如果“attack”頭存在,則使用“1”來(lái)標(biāo)記日志,并在寫(xiě)入日志之前刪除“attack”頭,否則將日志標(biāo)記為“0”。
由于使用模擬API來(lái)生成訓(xùn)練數(shù)據(jù)集存在一些限制,并且為了確保得到一個(gè)更廣義的分類器,我們?cè)陬A(yù)處理期間僅提取幾個(gè)必要的日志字段。這些屬性包括:“method”、“query”、“statusCode”、“path”、“requestPayload”??梢允褂妙~外的數(shù)據(jù)、預(yù)處理和可能的單獨(dú)分類器來(lái)分析請(qǐng)求的內(nèi)容。
自動(dòng)化客戶會(huì)放那連續(xù)運(yùn)行了幾個(gè)小時(shí),以積累一定數(shù)量的訓(xùn)練數(shù)據(jù)。為了快速訓(xùn)練模型,我們將使用AWS p2.xlarge深度學(xué)習(xí)EC2實(shí)例。 AWS的深度學(xué)習(xí)AMI預(yù)先安裝了大多數(shù)的流行AI庫(kù)和API,你可以使用GPU進(jìn)行大量的訓(xùn)練。這個(gè)EC2實(shí)例每小時(shí)90美分的成本不僅節(jié)省了在大量數(shù)據(jù)集上訓(xùn)練模型的時(shí)間,還節(jié)省了安裝和配置Tensorflow使之能夠在GPU上正常運(yùn)行的時(shí)間。我們發(fā)現(xiàn)在新機(jī)器上安裝和配置Tensorflow相當(dāng)?shù)睾臅r(shí)。
為了減少偏差,生成的數(shù)據(jù)集中包含了大約50/50個(gè)正常和惡意的請(qǐng)求日志。該數(shù)據(jù)集分為75%的訓(xùn)練子集和25%的驗(yàn)證子集。經(jīng)過(guò)幾次迭代之后,該模型能夠獲得相當(dāng)高的精度。
從大約23000個(gè)請(qǐng)求日志樣本得到的訓(xùn)練結(jié)果
上圖中的準(zhǔn)確度和損失指標(biāo)也會(huì)通過(guò)Keras訓(xùn)練腳本中附帶的Tensorboard回調(diào)記錄在日志中。這些日志是訓(xùn)練期間檢查點(diǎn)的積累,這對(duì)于在訓(xùn)練期間和之后將模型的性能可視化非常有用。
實(shí)現(xiàn)
有了訓(xùn)練過(guò)的模型,現(xiàn)在是時(shí)候來(lái)實(shí)現(xiàn)SecuritAI用戶界面程序了,該應(yīng)用程序用于托管模型以進(jìn)行實(shí)時(shí)的預(yù)測(cè)。與模擬API一樣,我們堅(jiān)持使用自己最熟悉的Java語(yǔ)言。我們構(gòu)建了一個(gè)React UI,作為監(jiān)視來(lái)自請(qǐng)求日志流活動(dòng)的儀表板。該請(qǐng)求日志流使用AWS Kinesis來(lái)管理,用于橋接模擬API和SecuritAI UI之間的通信。
有一個(gè)小問(wèn)題…… Keras是一個(gè)python庫(kù),那么模型是如何在Java中進(jìn)行預(yù)測(cè)的呢?幸運(yùn)的是,有一個(gè)npm包可以用來(lái)實(shí)現(xiàn)這個(gè)需求,那就是keras-js! Keras-js允許Java應(yīng)用程序運(yùn)行在Tensorflow引擎上訓(xùn)練Keras模型。這個(gè)庫(kù)使得我們能夠在Node.js應(yīng)用服務(wù)器上運(yùn)行所有的東西。
有關(guān)keras-js的更多信息,請(qǐng)參閱: https://github.com/transcranial/keras-js
演示
SecuritAI演示
經(jīng)驗(yàn)教訓(xùn)與后期改進(jìn)
總體而言,這是一個(gè)非常有趣的應(yīng)用程序,從開(kāi)發(fā)過(guò)程中你可以學(xué)到有關(guān)在Keras中使用Tensorflow建模的知識(shí)。也許已經(jīng)有其他更加簡(jiǎn)單的機(jī)器學(xué)習(xí)模型或平臺(tái)可以被用來(lái)代替LSTM RNN,但是如果沒(méi)有一點(diǎn)黑客精神的話,樂(lè)趣何在?在理想情況下,無(wú)監(jiān)控異常檢測(cè)模型可能更適合于本應(yīng)用。
作為后期的改進(jìn),該模型可以轉(zhuǎn)換為僅依賴Tensorflow API來(lái)運(yùn)行、針對(duì)內(nèi)容更豐富的請(qǐng)求頭進(jìn)行訓(xùn)練,以及執(zhí)行多元分類以實(shí)現(xiàn)對(duì)可疑請(qǐng)求的分類。
GitHub上的代碼:
adamkusey/securitai-ui
adamkusey/securitai-lstm-model
非常好我支持^.^
(0) 0%
不好我反對(duì)
(0) 0%
下載地址
如何使用Keras框架來(lái)構(gòu)建LSTM RNN來(lái)對(duì)網(wǎng)絡(luò)請(qǐng)求進(jìn)行區(qū)分下載
相關(guān)電子資料下載
- 【風(fēng)火輪YY3568開(kāi)發(fā)板免費(fèi)體驗(yàn)】第六章:在Solus上運(yùn)行自定義模型并遷移到Y(jié)Y3 411
- 深度學(xué)習(xí)框架tensorflow介紹 480
- 深度學(xué)習(xí)框架pytorch介紹 454
- 【米爾MYC-JX8MPQ評(píng)測(cè)】+ 運(yùn)行 TensorFlow Lite(CPU和NPU對(duì)比) 524
- 手把手帶你玩轉(zhuǎn)—i.MX8MP開(kāi)發(fā)板移植官方NPU TensorFlow例程 444
- 在樹(shù)莓派64位上安裝TensorFlow 505
- TensorFlow Lite for MCUs - 網(wǎng)絡(luò)邊緣的人工智能 339
- 2023年使用樹(shù)莓派和替代品進(jìn)行深度學(xué)習(xí) 1506
- 用TensorFlow2.0框架實(shí)現(xiàn)BP網(wǎng)絡(luò) 1849
- 那些年在pytorch上踩過(guò)的坑 571