1.專有名詞
ANN
????????人工神經網絡,一種受生物神經元啟發的監督學習算法。輸入數據通過網絡中的層級函數傳遞,激活特定神經元。函數復雜度越高,模型對數據的擬合能力越強,預測精度越高。
偏置項
????????其中x下表從1開始的是輸入變量,下標為0的是偏置項,從1開始的都是權重。
前向傳播
????????前向傳播是神經網絡的核心計算過程,指輸入數據從輸入層逐層傳遞到輸出層的路徑。其目的是通過網絡的權重和激活函數,計算最終的預測輸出。
????????如果隱藏層沒有非線性激活函數,那么輸入和輸出是線性關系的。
激活函數
????????激活函數是神經網絡的核心組件,用于引入非線性,使網絡能夠擬合復雜的數據模式。如果沒有激活函數,神經網絡將退化為線性回歸模型。
????????假如激活函數為Sigmoid函數。
損失值
????????損失值是神經網絡訓練的核心指標,用于衡量模型預測結果與真實值之間的差異。通過最小化損失值,模型逐步優化參數,提升預測精度。
連續變量預測過程中計算損失值
????????其中,實際輸出,
是由神經網絡
(權重為
)得到的預測輸出,
輸入,m為訓練的樣本數。
????????假設上面的圖預測的是連續變量。
離散變量預測過程中計算損失值
? ? ? ? 二元交叉熵
? ? ? ? 分類交叉熵
????????
反向傳播
-
反向傳播是“反著來”的過程,用于根據損失函數對各個權重進行微調。
-
關鍵步驟:
-
每次只對網絡中每個權重做一點點修改(微調)
-
測量在權重變化(
)時,損失值(Loss)的變化(
)情況(偏導數)
-
使用學習率 k控制更新步長:
-
學習率
????????是一個控制每次更新步幅的超參數。太大容易發散,太小學習慢。有助于在訓練時穩定地下降損失函數,使模型最終達到最優或近似最優的狀態。
epoch
????????所有數據被重復用于訓練若干次,每一次完整地訓練整個數據集叫做一個 epoch。
梯度下降
? ? ? ? 更新權重以減少誤差值的整個過程稱為梯度下降。
實現向前傳播
import numpy as npdef feed_forward(inputs, outputs, weights):# 計算隱藏層的加權輸入:inputs 與隱藏層權重 weights[0] 做點積,加上偏置 weights[1]pre_hidden = np.dot(inputs, weights[0]) + weights[1]# 使用 sigmoid 激活函數對隱藏層加權輸入進行非線性變換hidden = 1 / (1 + np.exp(-pre_hidden))# 計算輸出層的加權輸入:隱藏層輸出與輸出層權重 weights[2] 做點積,加上偏置 weights[3]pred_out = np.dot(hidden, weights[2]) + weights[3]# 計算預測輸出與實際輸出之間的均方誤差(MSE)mean_squared_error = np.mean(np.square(pred_out - outputs))# 返回均方誤差作為損失值return mean_squared_error
-
輸入特征 → 加權求和 → 加上偏置
-
進入隱藏層(激活函數變換)
-
再次加權 → 輸出預測結果
-
比較預測值和真實值 → 得到損失
實現梯度下降算法
from copy import deepcopy# 更新神經網絡的權重
def update_weights(inputs, outputs, weights, lr):"""使用數值梯度下降法更新神經網絡的權重。enumerate(),用來在遍歷可迭代對象(如列表、元組)時,同時獲取元素的索引和值。參數:inputs —— 輸入數據,形狀為 (樣本數, 輸入特征數)outputs —— 真實標簽,形狀為 (樣本數, 輸出特征數)weights —— 當前神經網絡的權重列表(包含4個部分)lr —— 學習率(learning rate),控制更新步長返回:updated_weights —— 更新后的權重original_loss —— 更新前的損失(MSE)"""original_weights = deepcopy(weights) # 保存原始權重(不修改)temp_weights = deepcopy(weights) # 用于臨時嘗試修改某個權重updated_weights = deepcopy(weights) # 保存最終更新后的權重original_loss = feed_forward(inputs, outputs, original_weights) # 當前權重下的損失# 遍歷每一層的權重(共4個部分:輸入到隱藏權重、隱藏偏置、隱藏到輸出權重、輸出偏置)for i, layer in enumerate(original_weights):# 遍歷當前層中的每個元素(權重或偏置)for index, weight in np.ndenumerate(layer):temp_weights = deepcopy(weights) # 復制當前權重temp_weights[i][index] += 0.0001 # 對當前權重增加一個微小擾動(用于計算導數)_loss_plus = feed_forward(inputs, outputs, temp_weights) # 計算擾動后新的損失# 使用數值導數公式估計梯度:grad ≈ (L(w+ε) - L(w)) / εgrad = (_loss_plus - original_loss) / (0.0001)# 用梯度下降法更新當前權重:w = w - lr * gradupdated_weights[i][index] -= grad * lrreturn updated_weights, original_loss
用一個只有一個隱藏層的小神經網絡(輸入 → 隱藏 → 輸出)
為啥偏置也要微調
使用鏈式法則實現反向傳播
網絡損失值:
預測輸出值:
隱藏層激活值;
隱藏層值:
計算損失值C的變化相對權重的變化:
更新權重值: