終于把神經(jīng)網(wǎng)絡(luò)算法搞懂了!
神經(jīng)網(wǎng)絡(luò)算法是一種模擬人腦神經(jīng)元結(jié)構(gòu)和信息處理方式的機(jī)器學(xué)習(xí)模型,其核心思想是通過對(duì)輸入信息進(jìn)行分層處理,逐層提取數(shù)據(jù)特征,進(jìn)而完成分類、回歸等任務(wù)。
神經(jīng)網(wǎng)絡(luò)算法作為深度學(xué)習(xí)的基礎(chǔ)模型之一,已經(jīng)在圖像識(shí)別、自然語言處理、時(shí)間序列預(yù)測等多個(gè)領(lǐng)域取得了顯著的成功。

神經(jīng)網(wǎng)絡(luò)算法的基本結(jié)構(gòu)
神經(jīng)網(wǎng)絡(luò)算法由輸入層、隱藏層和輸出層組成,每個(gè)層包含若干神經(jīng)元。
- 輸入層
輸入層負(fù)責(zé)接收輸入數(shù)據(jù),每個(gè)神經(jīng)元代表輸入數(shù)據(jù)的一個(gè)特征。 - 隱藏層
隱藏層位于輸入層和輸出層之間,用于對(duì)數(shù)據(jù)進(jìn)行復(fù)雜的非線性轉(zhuǎn)換。
隱藏層的數(shù)量和神經(jīng)元的數(shù)量是網(wǎng)絡(luò)性能的重要參數(shù)。 - 輸出層
輸出層是神經(jīng)網(wǎng)絡(luò)的最后一層,它將隱藏層的計(jì)算結(jié)果轉(zhuǎn)換為最終的輸出。
輸出層的神經(jīng)元數(shù)量取決于具體任務(wù)。對(duì)于分類問題,輸出層的神經(jīng)元數(shù)量通常等于類別數(shù);對(duì)于回歸問題,輸出層通常只有一個(gè)神經(jīng)元。 
神經(jīng)元的工作原理
每個(gè)神經(jīng)元接收來自上一層的輸入值,這些輸入值與神經(jīng)元的權(quán)重相乘并累加得到一個(gè)加權(quán)和。然后,這個(gè)加權(quán)和通過一個(gè)非線性激活函數(shù)進(jìn)行處理,得到該神經(jīng)元的輸出。

神經(jīng)元的計(jì)算過程可以用以下公式表示:
其中, 是輸入, 是對(duì)應(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
輸出為正值時(shí)保持不變,負(fù)值時(shí)輸出為零。
由于其計(jì)算簡單且效果較好,ReLU 是最常用的激活函數(shù)之一。 - Softmax
常用于多分類問題,用于計(jì)算每個(gè)類的概率分布。 
神經(jīng)網(wǎng)絡(luò)的工作過程
神經(jīng)網(wǎng)絡(luò)的工作過程可以概括為以下幾個(gè)關(guān)鍵步驟:前向傳播、損失計(jì)算、反向傳播和權(quán)重更新。
通過這些步驟,神經(jīng)網(wǎng)絡(luò)從輸入數(shù)據(jù)中學(xué)習(xí),并調(diào)整權(quán)重以提高預(yù)測的準(zhǔn)確性。
接下來,我們逐步詳細(xì)解釋每一個(gè)過程。
前向傳播
前向傳播是神經(jīng)網(wǎng)絡(luò)的預(yù)測過程,即從輸入數(shù)據(jù)開始,一層一層地傳遞計(jì)算,最終得到輸出結(jié)果。
具體步驟
- 輸入層
將輸入數(shù)據(jù)直接傳遞給第一層的神經(jīng)元,每個(gè)輸入對(duì)應(yīng)一個(gè)神經(jīng)元。 - 隱藏層計(jì)算
對(duì)于每一層的神經(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 層的輸出。 - 輸出層計(jì)算
當(dāng)傳遞到輸出層時(shí),網(wǎng)絡(luò)的最終輸出 會(huì)根據(jù)設(shè)計(jì)的任務(wù)有所不同。 
損失函數(shù)
損失函數(shù)用于衡量神經(jīng)網(wǎng)絡(luò)輸出(預(yù)測值)與實(shí)際目標(biāo)值之間的差異。不同任務(wù)通常使用不同的損失函數(shù)。
- 對(duì)于回歸問題,常用的損失函數(shù)是均方誤差(MSE)其中, 是預(yù)測值, 是真實(shí)值, 是樣本數(shù)。
 - 對(duì)于分類問題,常用的損失函數(shù)是交叉熵?fù)p失(Cross-Entropy Loss)其中, 是真實(shí)標(biāo)簽(0或1), 是預(yù)測概率。
 
損失函數(shù)的輸出是一個(gè)標(biāo)量,它代表整個(gè)網(wǎng)絡(luò)對(duì)當(dāng)前數(shù)據(jù)集的預(yù)測誤差。
反向傳播
反向傳播用于計(jì)算損失函數(shù)對(duì)網(wǎng)絡(luò)中各個(gè)參數(shù)(權(quán)重和偏置)的梯度。
這個(gè)過程利用了鏈?zhǔn)椒▌t,將誤差從輸出層逐層傳播回去,從而更新每一層的參數(shù)。
反向傳播步驟
- 輸出層誤差
首先計(jì)算輸出層的誤差,即損失函數(shù)對(duì)輸出層激活值的偏導(dǎo)數(shù)其中, 表示輸出層的誤差, 是激活函數(shù)的導(dǎo)數(shù)。 - 隱藏層誤差
對(duì)于隱藏層的神經(jīng)元,誤差由上一層傳播過來,通過鏈?zhǔn)椒▌t計(jì)算。
對(duì)于第 l 層,誤差為:這里, 是第 層的誤差, 是第 層的權(quán)重轉(zhuǎn)置矩陣, 是激活函數(shù)的導(dǎo)數(shù)。 - 梯度計(jì)算
反向傳播中,我們計(jì)算每一層的權(quán)重和偏置的梯度 
- 權(quán)重梯度
 - 偏置梯度
 

權(quán)重更新
通過反向傳播計(jì)算得到每一層權(quán)重和偏置的梯度后,使用優(yōu)化算法來更新參數(shù)。
其更新公式如下
- 權(quán)重更新
 - 偏置更新
 
其中, 是學(xué)習(xí)率,控制每次更新的步長。

案例分享
下面是一個(gè)使用神經(jīng)網(wǎng)絡(luò)對(duì)鳶尾花數(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個(gè)輸入特征,10個(gè)神經(jīng)元
    Dense(10, activatinotallow='relu'),                    # 隱藏層,10個(gè)神經(jīng)元
    Dense(3, activatinotallow='softmax')                   # 輸出層,3個(gè)輸出類別
])
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)
# 評(píng)估模型
loss, accuracy = model.evaluate(X_test, y_test, verbose=0)
print(f'Test Loss: {loss:.3f}, Test Accuracy: {accuracy:.3f}')















 
 
 



















 
 
 
 