專門做店面裝修設(shè)計(jì)的網(wǎng)站關(guān)鍵詞優(yōu)化最好的方法
我們今天介紹一下神經(jīng)網(wǎng)絡(luò)中的歸一化方法~
之前學(xué)到的機(jī)器學(xué)習(xí)中的歸一化是將數(shù)據(jù)縮放到特定范圍內(nèi),以消除不同特征之間的量綱和取值范圍差異。通過將原始數(shù)據(jù)縮放到一個(gè)特定的范圍內(nèi),比如[0,1]或者[-1,1],來消除不同特征之間的量綱和取值范圍的差異。這樣做的好處包括降低數(shù)據(jù)的量綱差異,避免某些特征由于數(shù)值過大而對模型產(chǎn)生不成比例的影響,以及防止梯度爆炸或過擬合等問題。
神經(jīng)網(wǎng)絡(luò)中的歸一化用于加速和穩(wěn)定學(xué)習(xí)過程,避免梯度問題。?
神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)其實(shí)在學(xué)習(xí)數(shù)據(jù)的分布,隨著網(wǎng)絡(luò)的深度增加、網(wǎng)絡(luò)復(fù)雜度增加,一般流經(jīng)網(wǎng)絡(luò)的數(shù)據(jù)都是一個(gè) mini batch,每個(gè) mini batch 之間的數(shù)據(jù)分布變化非常劇烈,這就使得網(wǎng)絡(luò)參數(shù)頻繁的進(jìn)行大的調(diào)整以適應(yīng)流經(jīng)網(wǎng)絡(luò)的不同分布的數(shù)據(jù),給模型訓(xùn)練帶來非常大的不穩(wěn)定性,使得模型難以收斂。
如果我們對每一個(gè) mini batch 的數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化之后,強(qiáng)制使輸入分布保持穩(wěn)定,從而可以加快網(wǎng)絡(luò)的學(xué)習(xí)速度并提高模型的泛化能力。參數(shù)的梯度變化也變得穩(wěn)定,有助于加快模型的收斂。
機(jī)器學(xué)習(xí)中的正則化分為L1和L2正則化,sklearn
庫中的Lasso
類和Ridge
類來實(shí)現(xiàn)L1正則化和L2正則化的線性回歸模型。通過調(diào)整alpha
參數(shù),可以控制正則化的強(qiáng)度。
import numpy as np
from sklearn.linear_model import Lasso
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error# 生成模擬數(shù)據(jù)集
X, y = make_regression(n_samples=100, n_features=2, noise=0.1)# 劃分訓(xùn)練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 創(chuàng)建Lasso回歸模型,并設(shè)置alpha參數(shù)為0.1(正則化強(qiáng)度)
lasso = Lasso(alpha=0.1)# 擬合模型
lasso.fit(X_train, y_train)# 預(yù)測測試集數(shù)據(jù)
y_pred = lasso.predict(X_test)# 計(jì)算均方誤差
mse = mean_squared_error(y_test, y_pred)
print("Mean Squared Error:", mse)
Ridge
回歸模型,fit
方法的作用是使用提供的輸入特征矩陣X_train
和對應(yīng)的目標(biāo)值y_train
來訓(xùn)練模型,即確定模型的權(quán)重參數(shù)。這個(gè)過程涉及到最小化一個(gè)包含L2正則化項(xiàng)的損失函數(shù),以找到最佳的參數(shù)值,使得模型在訓(xùn)練集上的表現(xiàn)最優(yōu),同時(shí)通過正則化避免過擬合。?- 在模型擬合完成后,可以使用
predict
方法來進(jìn)行預(yù)測。這個(gè)方法將使用fit
方法中學(xué)到的參數(shù)來對新的輸入數(shù)據(jù)X_test
進(jìn)行預(yù)測,輸出預(yù)測結(jié)果y_pred
。因此,fit
方法本身并不直接產(chǎn)生預(yù)測結(jié)果,而是為后續(xù)的預(yù)測準(zhǔn)備了必要的模型參數(shù)。
批量歸一化公式?
- λ 和 β 是可學(xué)習(xí)的參數(shù),它相當(dāng)于對標(biāo)準(zhǔn)化后的值做了一個(gè)線性變換,λ 為系數(shù),β 為偏置;
- eps 通常指為 1e-5,避免分母為 0;
- E(x) 表示變量的均值;
- Var(x) 表示變量的方差;
通過批量歸一化(Batch Normalization, 簡稱 BN)層之后,數(shù)據(jù)的分布會被調(diào)整為均值為β,標(biāo)準(zhǔn)差為γ的分布。
批量歸一化通過對每個(gè)mini-batch數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化處理,強(qiáng)制使輸入分布保持穩(wěn)定:?
- 計(jì)算該批次數(shù)據(jù)的均值和方差:這兩個(gè)統(tǒng)計(jì)量是針對當(dāng)前批次數(shù)據(jù)進(jìn)行計(jì)算的。
- 利用這些統(tǒng)計(jì)數(shù)據(jù)對批次數(shù)據(jù)進(jìn)行歸一化處理:這一步將數(shù)據(jù)轉(zhuǎn)換為一個(gè)近似以0為中心,標(biāo)準(zhǔn)差為1的正態(tài)分布。
- 尺度變換和偏移:為了保持網(wǎng)絡(luò)的表達(dá)能力,通過可學(xué)習(xí)的參數(shù)γ(尺度因子)和β(平移因子)對歸一化后的數(shù)據(jù)進(jìn)行縮放和位移。
BN 層的接口?
torch.nn.BatchNorm2d(num_features, eps=1e-05, momentum=0.1, affine=True)
-
num_features
: 這是輸入張量的特征數(shù)量,即通道數(shù)。它指定了要進(jìn)行歸一化的特征維度。 -
eps
: 這是一個(gè)小的常數(shù),用于防止除以零的情況。默認(rèn)值為1e-05。 -
momentum
: 這是動量值,用于計(jì)算移動平均值。默認(rèn)值為0.1。 -
affine
: 這是一個(gè)布爾值,表示是否啟用可學(xué)習(xí)的縮放和位移參數(shù)。如果設(shè)置為True,則在訓(xùn)練過程中會學(xué)習(xí)這些參數(shù);如果設(shè)置為False,則使用固定的縮放和位移參數(shù)。默認(rèn)值為True。
我們通過一個(gè)代碼案例來理解一下工作原理 :
import torch
import torch.nn as nn# 定義輸入數(shù)據(jù)的形狀
batch_size = 32
num_channels = 3
height = 64
width = 64# 創(chuàng)建輸入張量
input_data = torch.randn(batch_size, num_channels, height, width)# 創(chuàng)建批量歸一化層
bn_layer = nn.BatchNorm2d(num_features=num_channels, eps=1e-05, momentum=0.1, affine=True)# 將輸入數(shù)據(jù)傳入批量歸一化層
output_data = bn_layer(input_data)# 打印輸出數(shù)據(jù)的形狀
print("Output shape:", output_data.shape)