終于把神經(jīng)網(wǎng)絡(luò)算法搞懂了!
神經(jīng)網(wǎng)絡(luò)算法是一種模擬人腦神經(jīng)元結(jié)構(gòu)和信息處理方式的機(jī)器學(xué)習(xí)模型,其核心思想是通過對輸入信息進(jìn)行分層處理,逐層提取數(shù)據(jù)特征,進(jìn)而完成分類、回歸等任務(wù)。
神經(jīng)網(wǎng)絡(luò)算法作為深度學(xué)習(xí)的基礎(chǔ)模型之一,已經(jīng)在圖像識別、自然語言處理、時間序列預(yù)測等多個領(lǐng)域取得了顯著的成功。
神經(jīng)網(wǎng)絡(luò)算法的基本結(jié)構(gòu)
神經(jīng)網(wǎng)絡(luò)算法由輸入層、隱藏層和輸出層組成,每個層包含若干神經(jīng)元。
- 輸入層
輸入層負(fù)責(zé)接收輸入數(shù)據(jù),每個神經(jīng)元代表輸入數(shù)據(jù)的一個特征。 - 隱藏層
隱藏層位于輸入層和輸出層之間,用于對數(shù)據(jù)進(jìn)行復(fù)雜的非線性轉(zhuǎn)換。
隱藏層的數(shù)量和神經(jīng)元的數(shù)量是網(wǎng)絡(luò)性能的重要參數(shù)。 - 輸出層
輸出層是神經(jīng)網(wǎng)絡(luò)的最后一層,它將隱藏層的計算結(jié)果轉(zhuǎn)換為最終的輸出。
輸出層的神經(jīng)元數(shù)量取決于具體任務(wù)。對于分類問題,輸出層的神經(jīng)元數(shù)量通常等于類別數(shù);對于回歸問題,輸出層通常只有一個神經(jīng)元。
神經(jīng)元的工作原理
每個神經(jīng)元接收來自上一層的輸入值,這些輸入值與神經(jīng)元的權(quán)重相乘并累加得到一個加權(quán)和。然后,這個加權(quán)和通過一個非線性激活函數(shù)進(jìn)行處理,得到該神經(jīng)元的輸出。
神經(jīng)元的計算過程可以用以下公式表示:
其中, 是輸入, 是對應(yīng)的權(quán)重, 是偏置項(xiàng), 是加權(quán)和。
加權(quán)和經(jīng)過激活函數(shù) 后,得到神經(jīng)元的輸出:
激活函數(shù)
激活函數(shù)用于引入了非線性,從而讓神經(jīng)網(wǎng)絡(luò)能夠處理復(fù)雜的非線性關(guān)系。
常見的激活函數(shù)包括
- Sigmoid
輸出范圍為 0 到 1,常用于二分類問題。 - Tanh
輸出范圍為 ?1 到 1 - ReLU
輸出為正值時保持不變,負(fù)值時輸出為零。
由于其計算簡單且效果較好,ReLU 是最常用的激活函數(shù)之一。 - Softmax
常用于多分類問題,用于計算每個類的概率分布。
神經(jīng)網(wǎng)絡(luò)的工作過程
神經(jīng)網(wǎng)絡(luò)的工作過程可以概括為以下幾個關(guān)鍵步驟:前向傳播、損失計算、反向傳播和權(quán)重更新。
通過這些步驟,神經(jīng)網(wǎng)絡(luò)從輸入數(shù)據(jù)中學(xué)習(xí),并調(diào)整權(quán)重以提高預(yù)測的準(zhǔn)確性。
接下來,我們逐步詳細(xì)解釋每一個過程。
前向傳播
前向傳播是神經(jīng)網(wǎng)絡(luò)的預(yù)測過程,即從輸入數(shù)據(jù)開始,一層一層地傳遞計算,最終得到輸出結(jié)果。
具體步驟
- 輸入層
將輸入數(shù)據(jù)直接傳遞給第一層的神經(jīng)元,每個輸入對應(yīng)一個神經(jīng)元。 - 隱藏層計算
對于每一層的神經(jīng)元,將上一層輸出的值與當(dāng)前層的權(quán)重 w 和偏置 b 進(jìn)行線性組合,然后應(yīng)用激活函數(shù)進(jìn)行非線性轉(zhuǎn)換。
數(shù)學(xué)表達(dá)為:其中, 是第 l 層的線性組合結(jié)果, 是第 l 層的權(quán)重矩陣, 是上一層的輸出, 是偏置向量。
接下來通過激活函數(shù) 進(jìn)行非線性變換
這里 是第 l 層的輸出。 - 輸出層計算
當(dāng)傳遞到輸出層時,網(wǎng)絡(luò)的最終輸出 會根據(jù)設(shè)計的任務(wù)有所不同。
損失函數(shù)
損失函數(shù)用于衡量神經(jīng)網(wǎng)絡(luò)輸出(預(yù)測值)與實(shí)際目標(biāo)值之間的差異。不同任務(wù)通常使用不同的損失函數(shù)。
- 對于回歸問題,常用的損失函數(shù)是均方誤差(MSE)其中, 是預(yù)測值, 是真實(shí)值, 是樣本數(shù)。
- 對于分類問題,常用的損失函數(shù)是交叉熵?fù)p失(Cross-Entropy Loss)其中, 是真實(shí)標(biāo)簽(0或1), 是預(yù)測概率。
損失函數(shù)的輸出是一個標(biāo)量,它代表整個網(wǎng)絡(luò)對當(dāng)前數(shù)據(jù)集的預(yù)測誤差。
反向傳播
反向傳播用于計算損失函數(shù)對網(wǎng)絡(luò)中各個參數(shù)(權(quán)重和偏置)的梯度。
這個過程利用了鏈?zhǔn)椒▌t,將誤差從輸出層逐層傳播回去,從而更新每一層的參數(shù)。
反向傳播步驟
- 輸出層誤差
首先計算輸出層的誤差,即損失函數(shù)對輸出層激活值的偏導(dǎo)數(shù)其中, 表示輸出層的誤差, 是激活函數(shù)的導(dǎo)數(shù)。 - 隱藏層誤差
對于隱藏層的神經(jīng)元,誤差由上一層傳播過來,通過鏈?zhǔn)椒▌t計算。
對于第 l 層,誤差為:這里, 是第 層的誤差, 是第 層的權(quán)重轉(zhuǎn)置矩陣, 是激活函數(shù)的導(dǎo)數(shù)。 - 梯度計算
反向傳播中,我們計算每一層的權(quán)重和偏置的梯度
- 權(quán)重梯度
- 偏置梯度
權(quán)重更新
通過反向傳播計算得到每一層權(quán)重和偏置的梯度后,使用優(yōu)化算法來更新參數(shù)。
其更新公式如下
- 權(quán)重更新
- 偏置更新
其中, 是學(xué)習(xí)率,控制每次更新的步長。
案例分享
下面是一個使用神經(jīng)網(wǎng)絡(luò)對鳶尾花數(shù)據(jù)集進(jìn)行分類的示例代碼。
import numpy as np
import tensorflow as tf
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import OneHotEncoder
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.optimizers import Adam
# 加載鳶尾花數(shù)據(jù)集
data = load_iris()
X = data.data
y = data.target.reshape(-1, 1)
encoder = OneHotEncoder()
y_onehot = encoder.fit_transform(y).toarray()
X_train, X_test, y_train, y_test = train_test_split(X, y_onehot, test_size=0.2, random_state=42)
# 構(gòu)建神經(jīng)網(wǎng)絡(luò)模型
model = Sequential([
Dense(10, input_shape=(4,), activatinotallow='relu'), # 輸入層,4個輸入特征,10個神經(jīng)元
Dense(10, activatinotallow='relu'), # 隱藏層,10個神經(jīng)元
Dense(3, activatinotallow='softmax') # 輸出層,3個輸出類別
])
model.compile(optimizer=Adam(learning_rate=0.01), loss='categorical_crossentropy', metrics=['accuracy'])
# 訓(xùn)練模型
model.fit(X_train, y_train, epochs=100, batch_size=10, verbose=1)
# 評估模型
loss, accuracy = model.evaluate(X_test, y_test, verbose=0)
print(f'Test Loss: {loss:.3f}, Test Accuracy: {accuracy:.3f}')