[網絡入侵AI檢測] 深度前饋神經網絡(DNN)模型

第4章:深度前饋神經網絡(DNN)模型

歡迎回來🐻???

在第1章:分類任務配置(二分類 vs. 多分類)中,我們學習了如何配置模型以回答不同類型的問題;在第2章:數據加載與預處理中,我們成為了“數據大廚”,準備好了數據“食材”;最近,在第3章:經典機器學習模型中,我們探索了一套可靠的“手工工具”來檢測入侵行為。

雖然經典模型非常強大,但有時網絡攻擊極其隱蔽且復雜。它們可能涉及一些細微的模式,簡單的模型難以捕捉。想象一下,我們有一支安全警衛團隊。有些警衛擅長檢查基本的ID(經典模型),但對于真正復雜的威脅,我們需要一個高度專業化、多階段的安全系統,其中包含層層互聯的專家,每位專家在傳遞信息前都會對其進行精煉。

這就是深度前饋神經網絡(DNN)模型的用武之地

這是我們邁向“深度學習”世界的第一步,深度學習是受人類大腦啟發的模型。DNN能夠揭示網絡流量數據中極其復雜、非直觀的關系,使其能夠檢測到最難以捉摸的入侵行為。

DNN解決了什么問題?

DNN旨在學習輸入特征(如連接持續時間、協議、字節計數)與輸出標簽(如“正常”或“攻擊”)之間的復雜非線性關系。經典模型可能難以處理那些無法通過簡單直線或曲線輕松分隔的模式。而DNN通過其多層結構,本質上可以在數據中繪制高度復雜的波浪形邊界,從而更精確地區分不同類型的網絡流量。

我們的核心用例仍然是網絡入侵檢測,但現在我們裝備了一個能夠處理更深層次、更抽象攻擊特征的模型。

DNN的關鍵概念

深度前饋神經網絡通常也稱為多層感知機(MLP)。它之所以“深”,是因為它在輸入和輸出之間有多個隱藏層。“前饋”意味著信息單向流動,從輸入到輸出,不會循環回來。

讓我們分解其核心部分:

1. 神經元(節點)

將神經元想象為一個微小的決策單元。它接收輸入,進行簡單計算,然后將輸出傳遞給下一個神經元。每個輸入都有一個與之關聯的權重(表示該輸入的重要性),神經元還有一個偏置(添加到計算中的額外值)。模型通過調整這些權重和偏置來學習。

2. 層:決策的各個階段

神經元被組織成層,形成我們安全系統的“階段”:

  • 輸入層:這是原始處理數據(來自第2章:數據加載與預處理的網絡連接的41個特征)進入網絡的地方。每個特征都有自己的“輸入神經元”。
  • 隱藏層(密集層):這是DNN的核心。它們被稱為“隱藏”是因為它們不直接與外界(輸入或輸出)交互。在這些層中,神經元是“密集連接”的——即一層中的每個神經元都與下一層中的每個神經元相連。這使得它們能夠處理和轉換來自前一層的信息,學習越來越復雜的特征。DNN至少有一個隱藏層,通常有很多。
  • 輸出層:這是給出模型預測的最終層。正如我們在第1章:分類任務配置(二分類 vs. 多分類)中學到的,其配置取決于我們是進行二分類(1個神經元,sigmoid激活)還是多分類(N個神經元,softmax激活)。

3. 激活函數:添加非線性

在神經元計算其輸入的加權和加上偏置后,“激活函數”決定是否以及如何“激活”(產生輸出)。

  • relu(修正線性單元):這是隱藏層中非常常見的激活函數。它很簡單:如果輸入為正,則直接輸出;如果為負,則輸出零。這種非線性對于DNN學習復雜模式至關重要,而不僅僅是簡單的直線。
  • sigmoid / softmax:如第1章所述,這些是專門用于分類任務的輸出層的激活函數。

4. Dropout層:防止過擬合

想象一下,我們的安全警衛變得過于擅長記住訓練中的特定面孔,但在面對稍有不同新面孔時卻無法識別。這就是過擬合——模型對訓練數據記憶得太好,失去了對新數據的泛化能力。

Dropout層是一個聰明的技巧,可以防止這種情況。在訓練過程中,Dropout層會隨機“關閉”一層中一定比例的神經元。這迫使剩余的神經元學習更魯棒的特征,并防止任何單個神經元過度依賴其他神經元。這就像強制不同的安全警衛輪流休息,確保整個團隊都具備能力,而不是只有一個明星。

如何構建用于入侵檢測的DNN

我們將使用Keras(一個用戶友好的神經網絡構建庫)來構建我們的DNN。基本步驟如下:

  1. 啟動一個Sequential模型:這是一個簡單的層堆疊。
  2. 添加Dense:這些是我們的隱藏層,使用relu激活。
  3. 添加Dropout:防止過擬合。
  4. 添加Dense輸出層:根據第1章配置為二分類或多分類。
  5. 編譯模型:告訴它如何學習(優化器)以及測量什么(損失函數、指標)。
  6. 訓練模型:輸入準備好的數據。

讓我們看一個簡化示例。假設X_train包含我們歸一化的網絡特征,y_train包含標簽,如第2章和第1章所述。

示例代碼:用于二分類的簡單DNN

以下是如何構建一個帶有一個隱藏層的基本DNN用于二分類入侵檢測:

from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation
import numpy as np # 用于數據創建示例# --- 假設 X_train 和 y_train 已從第2章準備好 ---
# 為了演示,我們創建一些虛擬數據:
# 1000個樣本,每個樣本41個特征
X_train_dummy = np.random.rand(1000, 41)
# 1000個二分類標簽(0或1)
y_train_dummy = np.random.randint(0, 2, 1000)# 1. 開始定義網絡(層的堆疊)
model = Sequential()# 2. 添加第一個(也是唯一的)隱藏層:一個Dense層
#    - 1024個神經元(可以自行選擇數量)
#    - input_dim=41:告訴模型輸入有41個特征
#    - activation='relu':隱藏層的激活函數
model.add(Dense(1024, input_dim=41, activation='relu'))# 3. 添加一個Dropout層
#    - 0.01表示訓練期間隨機“關閉”1%的神經元
model.add(Dropout(0.01))# 4. 添加輸出層(用于二分類,如第1章所述)
#    - 1個神經元用于二分類輸出
#    - activation='sigmoid':將輸出壓縮為0到1之間的概率
model.add(Dense(1, activation='sigmoid'))# 5. 編譯模型
#    - loss='binary_crossentropy':用于二分類
#    - optimizer='adam':一種流行且有效的優化算法
#    - metrics=['accuracy']:訓練期間跟蹤性能
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])print("DNN模型創建并編譯完成!")
model.summary() # 打印模型層的摘要

解釋:

  • Sequential():這為我們的神經網絡創建了一個空白畫布,可以一層一層地堆疊。
  • Dense(1024, input_dim=41, activation='relu'):這是我們的第一個主要處理層。它有1024個神經元。input_dim=41對于第一層至關重要,告訴Keras輸入特征的大小。我們使用relu來學習非線性模式。
  • Dropout(0.01):該層通過隨機丟棄1%的神經元連接來防止過擬合。
  • Dense(1, activation='sigmoid'):這是最終的決策層。如第1章所述,對于二分類,我們使用1個神經元和sigmoid激活來輸出概率(0到1)。
  • model.compile(...):這為訓練準備模型。loss='binary_crossentropy'測量預測與真實標簽的差距。optimizer='adam'是調整權重以最小化損失的“引擎”。metrics=['accuracy']是我們跟蹤模型表現的指標。

擴展到多層和多分類

為了使DNN“更深”(更多隱藏層),只需添加更多的DenseDropout層:

from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation
# ...(數據準備如前所述)...# 多分類示例:假設 num_classes = 5(正常、DoS、Probe、R2L、U2R)
num_classes = 5
# y_train_dummy 應為 one-hot 編碼,例如 to_categorical(y_train_raw, num_classes=5)model_deep = Sequential()
model_deep.add(Dense(1024, input_dim=41, activation='relu'))
model_deep.add(Dropout(0.01))
model_deep.add(Dense(768, activation='relu')) # 第二個隱藏層
model_deep.add(Dropout(0.01))
model_deep.add(Dense(512, activation='relu')) # 第三個隱藏層
model_deep.add(Dropout(0.01))
# ... 可以添加更多層 ...
model_deep.add(Dense(256, activation='relu')) # 第四個隱藏層
model_deep.add(Dropout(0.01))
model_deep.add(Dense(128, activation='relu')) # 第五個隱藏層
model_deep.add(Dropout(0.01))# 對于多分類(如第1章所述):
model_deep.add(Dense(num_classes, activation='softmax'))model_deep.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])print("\n用于多分類的深度DNN模型創建并編譯完成!")
model_deep.summary()

多分類的關鍵區別:

  • Dense(num_classes, activation='softmax'):輸出層現在有num_classes(例如5)個神經元,softmax激活確保輸出是每個類的概率,總和為1。
  • loss='categorical_crossentropy':當標簽是one-hot編碼時(多分類問題中應該如此,如第1章所述),這是合適的損失函數。

幕后:DNN如何做決策

將DNN想象為一個流水線,信息(網絡流量數據)在最終決策前經過多個階段的精煉和處理。

在這里插入圖片描述

在訓練期間(我們將在第8章:模型訓練生命周期(Keras)中介紹),這個過程會反復進行。每次傳遞后,模型將其預測與真實標簽進行比較,計算loss,然后微妙地調整每個Dense層中的所有權重偏置,以減少下一次的loss。這種迭代調整就是模型“學習”的方式。

深入項目代碼參考

讓我們看看實際項目代碼文件,了解DNN是如何實現的。你可以在KDDCup 99/dnn/文件夾(以及NSL-KDD、UNSW-NB15等其他數據集的類似文件夾)中找到這些內容。

1. 基本DNN(1個隱藏層)- 二分類

查看KDDCup 99/dnn/binary/dnn1.pyNSL-KDD/dnn/binary/dnn1.py。在數據加載和歸一化步驟(類似于第2章)之后:

# 來自 KDDCup 99/dnn/binary/dnn1.py(簡化版)
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation# ...(X_train, y_train, X_test, y_test 已在此處準備好)...model = Sequential()
# 輸入層(由第一個Dense層的input_dim隱式處理)
# 第一個隱藏層(Dense層1)
model.add(Dense(1024, input_dim=41, activation='relu'))
model.add(Dropout(0.01)) # 隱藏層后的Dropout
# 輸出層(二分類1個神經元,sigmoid激活)
model.add(Dense(1))
model.add(Activation('sigmoid')) # 單獨應用的激活函數model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# ...(訓練時的model.fit調用)...

觀察:

  • input_dim=41用于指定數據集中的特征數量。
  • 一個Dense層后跟一個Dropout層構成隱藏部分。
  • 輸出層使用Dense(1)Activation('sigmoid'),與第1章中的二分類配置匹配。
  • binary_crossentropy是損失函數。

2. 更深DNN(5個隱藏層)- 二分類

現在,我們來看KDDCup 99/dnn/binary/dnn5.py。關鍵區別在于堆疊了多個DenseDropout層,使網絡“更深”:

# 來自 KDDCup 99/dnn/binary/dnn5.py(簡化版)
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation# ...(X_train, y_train, X_test, y_test 已在此處準備好)...model = Sequential()
# 隱藏層1
model.add(Dense(1024, input_dim=41, activation='relu'))
model.add(Dropout(0.01))
# 隱藏層2
model.add(Dense(768, activation='relu'))
model.add(Dropout(0.01))
# 隱藏層3
model.add(Dense(512, activation='relu'))
model.add(Dropout(0.01))
# 隱藏層4
model.add(Dense(256, activation='relu'))
model.add(Dropout(0.01))
# 隱藏層5
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.01))
# 輸出層
model.add(Dense(1))
model.add(Activation('sigmoid'))model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# ...(訓練時的model.fit調用)...

觀察:

  • 注意DenseDropout層的序列,每層的神經元數量比前一層少。這是一種常見的模式,逐步精煉特征。
  • 輸出層和編譯(binary_crossentropysigmoid)保持不變,因為它仍然是二分類任務。

3. 多分類DNN(1個隱藏層)

最后,我們來看KDDCup 99/dnn/multiclass/dnn1.py。它使用與簡單二分類DNN相同的網絡結構,但適應了多分類:

# 來自 KDDCup 99/dnn/multiclass/dnn1.py(簡化版)
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation
from keras.utils.np_utils import to_categorical # 用于標簽準備# ...(X_train, y_train1, X_test, y_test1 已在此處準備好)...
# 數據準備:對多分類標簽進行one-hot編碼
y_train = to_categorical(y_train1)
y_test = to_categorical(y_test1)model = Sequential()
# 隱藏層1
model.add(Dense(1024, input_dim=41, activation='relu'))
model.add(Dropout(0.01))
# 輸出層(N個神經元對應N個類別,softmax激活)
# 假設5個類別(正常、DoS、Probe、R2L、U2R)
model.add(Dense(5)) # 5個神經元對應5個類別
model.add(Activation('softmax'))model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
# ...(訓練時的model.fit調用)...

觀察:

  • y_trainy_test標簽在輸入模型前使用to_categorical(one-hot編碼)轉換,如第1章所述。
  • 輸出層使用Dense(5)(5個類別)和Activation('softmax')
  • 損失函數現在是categorical_crossentropy,適用于one-hot編碼標簽。

這些示例清楚地展示了堆疊DenseDropout層的概念構成了DNN的核心,而輸出層和損失函數則根據具體分類任務(二分類 vs. 多分類)進行調整。

結論

現在,我們已經邁出了進入深度學習世界的第一步,探索了深度前饋神經網絡(DNN)!我們了解到,DNN通過其多個Dense隱藏層和relu激活函數,可以學習網絡流量數據中高度復雜的非線性模式。我們還看到了Dropout層在防止過擬合中的關鍵作用。

我們學習了如何使用Keras構建這些強大的模型,配置其輸入層、隱藏層和輸出層,并為二分類和多分類入侵檢測任務設置正確的loss函數,這些建立在前面章節的基礎上。

雖然DNN是經典模型的重大升級,但它們只是神經網絡的一種類型。在下一章中,我們將探索卷積神經網絡(CNN),它們特別擅長在具有空間或網格結構的數據中發現模式,盡管我們的網絡數據不是圖像,但它們有一種獨特的方式來檢測局部模式。

第5章:純卷積神經網絡(CNN)模型

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/98361.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/98361.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/98361.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【目錄-多選】鴻蒙HarmonyOS開發者基礎

All look at the answer 針對包含文本元素的組件,例如Text、Button、TextInput等,可以使用下列哪些屬性關于ForEach(arr, itemGenerator, index)組件的描述正確的是下面哪些容器組件是可以滾動的關于Tabs組件和TabContent組件,下列描述正確的…

第一講 Vscode+Python+anaconda 安裝

1、vscode下載和安裝官網下載最新版:https://code.visualstudio.com/Download注:文件夾最好不要出現中文和空格 2、將vscode修改為中文環境注意:右下角彈出提示框,點擊“yes”若不慎關閉了對話框,也不要緊,…

《sklearn機器學習——回歸指標2》

均方對數誤差(mean_squared_log_error函數) mean_squared_log_error函數計算與平方(二次方)對數誤差或損失的期望值相一致的風險指標。 Mean Squared Logarithmic Error 參數與返回值 函數簡介 mean_squared_log_error 是用于計算…

當電力設計遇上AI:良策金寶AI如何重構行業效率邊界?

在工程設計行業,我們常說“經驗為王”。一個資深工程師的價值,往往體現在他對規范的熟悉、對計算的把握、對圖紙的掌控。但今天,這個“王座”正在被重新定義。不是經驗不重要了,而是——效率的邊界,正在被AI重構。以良…

【深度學習】重采樣(Resampling)

在深度學習的背景下,重采樣主要涉及兩個方面: 數據層面的重采樣:處理不平衡數據集。模型層面的重采樣:在神經網絡內部進行上采樣(UpSampling)或下采樣(DownSampling),常見…

計算機實現乘法運算的方式---ChatGPT 5 thinking作答

計算機如何實現“乘法” 下面分層次把乘法在數據表示 → 整數硬件/軟件 → 大整數 → 浮點數 → 特殊場景里的主流實現方式講清楚,并給出取舍建議與簡單偽代碼。0)前置:數的表示 無符號整數:按二進制位權求值。有符號整數&#xf…

Ubuntu 安裝 / 配置 VNC

一、基礎環境準備 1. 更新 sudo apt update 2. 安裝 VNC 服務器 & 輕量桌面(XFCE) # 安裝 TightVNC 服務器 + XFCE 桌面(推薦輕量方案) sudo apt install tightvncserver xfce4 xfce4-goodies xterm -y二、核心配置:讓 VNC 加載桌面環境 1. 初始化 VNC 密碼(首次…

計算機大數據畢業設計推薦:基于Spark的新能源汽車保有量可視化分析系統

精彩專欄推薦訂閱:在下方主頁👇🏻👇🏻👇🏻👇🏻 💖🔥作者主頁:計算機畢設木哥🔥 💖 文章目錄 一、項目介紹二、…

Android Looper源碼閱讀

看下Android Looper源代碼,有助于理解Android系統消息循環流程、handler機制。Looper注釋為class used to run a message loop for a thread, 即用于為一個線程運行消息循環, 或者說循環處理一個線程的消息。 Looper源碼先看下這個類里的變量…

uni-app 和 uni-app x 的區別

差異解析 uni-app 是 DCloud 推出的成熟跨平臺前端框架,基于 Vue.js JavaScript/TypeScript。支持廣泛平臺:iOS、Android、HarmonyOS、Web、小程序等,用一套代碼同時生成多個端應用。渲染方式主要通過 WebView 或小程序原生框架 JS 邏輯&am…

數據結構:深度優先搜索 (Depth-First Search, DFS)

目錄 DFS的誕生——“不撞南墻不回頭” DFS的核心機制——如何實現“回溯”? DFS算法流程圖解(遞歸版) C/C代碼實現 DFS的應用 上一節我們學習了廣度優先搜索 (BFS),它像水面的波紋一樣,一層一層地向外探索。今天…

Spring Boot中策略模式結合依賴注入的實現方式

在Spring Boot項目開發中,常常會遇到根據不同的業務場景執行不同邏輯的需求,策略模式就是一種很好的設計模式來應對這種情況。同時,Spring Boot強大的依賴注入機制可以方便地將不同的策略類進行管理和調用。 1. 定義策略接口 定義一個策略接口…

深入剖析Spring Boot中Spring MVC的請求處理流程

對于任何使用Spring Boot進行Web開發的開發者而言,深入理解Spring MVC的執行流程都是至關重要的。這不僅有助于我們編寫更清晰、更高效的代碼,更是我們排查詭異問題、進行高級定制開發的知識基石。今天,我們將一起深入Spring Boot應用的內核&…

X448 算法簽名驗簽流程深度解析及代碼示例

一、引言:X448 算法的定位與價值在橢圓曲線密碼學(ECC)體系中,X448 是基于蒙哥馬利曲線(Curve448)的密鑰交換算法,但其底層數學原理也可支撐簽名驗簽功能(實際工程中常與 Ed448 簽名…

2025-2026單片機物聯網畢業設計題目推薦(定稿付款)

51.基于單片機的非接觸式防疫自動門系(1)人員檢測:利用超聲波模塊進行人員檢測,檢測到人員靠近門體時觸發相應的操作;(2)門控制:通過舵機實現自動門的開閉控制,當檢測到有…

一文詳解大模型強化學習(RLHF)算法:PPO、DPO、GRPO、ORPO、KTO、GSPO

一、 引言 大模型強化學習的核心目標是讓模型的輸出與人類目標、真實場景需求對齊。在工作和學習中,大模型強化學習訓練經常會遇到各種算法,各種O,在強化學習訓練選型過程中經常容易混淆,也分不清各種訓練算法的使用場景和優缺點。…

C++ 常見面試題匯總

基礎知識 一、C 基礎語法C 和 C 的區別? C 支持面向對象(封裝、繼承、多態)。C 引入模板、STL、異常處理。值傳遞、指針傳遞、引用傳遞的區別? 值傳遞:拷貝一份副本。指針傳遞:傳地址,可修改原數…

ES06-SpringData集成

ES06-SpringData集成 文章目錄ES06-SpringData集成1-參考網址2-知識整理3-Spring Data Elasticsearch 9.0.0 完整示例4-知識補充1-Elasticsearch JAVA操作有三種客戶端:1. TransportClient(已廢棄)2. JestClient(第三方 HTTP 客戶端&#xff…

對于鏈表相關經典算法題:環形鏈表的約瑟夫問題的解析

開篇介紹: Hello 大家,在上一篇博客中,我們一同拆解了「206. 反轉鏈表」和「876. 鏈表的中間結點」這兩道單鏈表經典題目,通過對指針操作的細致打磨,相信大家對單鏈表的特性與算法設計思路有了更深入的理解。而在今天…

MySQL集群——主從復制

目錄 一、環境搭建、部署 1. RHEL7.9、9.3的搭建 二、主從復制 1. 環境說明 2. 環境準備 1)克隆RHEL79_mysql_master 2)改名為 “RHEL79_mysql_slave” 并修改IP 3)修改主機名 3. 部署MySQL主從同步 1)主庫(mysql-master) 2&…