更新時(shí)間:2023-08-02 來源:黑馬程序員 瀏覽量:
在深度學(xué)習(xí)中,加入正則化是為了防止過擬合(overfitting)現(xiàn)象的發(fā)生。過擬合指的是模型在訓(xùn)練數(shù)據(jù)上表現(xiàn)得很好,但在未見過的測試數(shù)據(jù)上表現(xiàn)不佳,因?yàn)槟P驮谟?xùn)練過程中過度擬合了訓(xùn)練數(shù)據(jù)的噪聲和細(xì)節(jié)。正則化的目的是限制模型的復(fù)雜性,以提高其在未知數(shù)據(jù)上的泛化能力。
常見的正則化技術(shù)有:
也稱為Lasso正則化,通過增加模型參數(shù)的絕對(duì)值之和作為懲罰項(xiàng)來限制模型復(fù)雜性。它可以促使模型產(chǎn)生稀疏權(quán)重,即許多參數(shù)變?yōu)榱?,從而?shí)現(xiàn)特征選擇的效果。
也稱為Ridge正則化,通過增加模型參數(shù)的平方和作為懲罰項(xiàng)來限制模型復(fù)雜性。與L1正則化不同,L2正則化傾向于讓參數(shù)接近于零,但不嚴(yán)格等于零。
在訓(xùn)練過程中,隨機(jī)將一部分神經(jīng)元的輸出置為零,以減少不同神經(jīng)元之間的依賴性。這樣做可以促使網(wǎng)絡(luò)學(xué)習(xí)更魯棒的特征,并減少過擬合。
現(xiàn)在讓我們通過Python代碼演示如何在神經(jīng)網(wǎng)絡(luò)中使用L2正則化。
首先,我們需要導(dǎo)入必要的庫和模塊:
import numpy as np import tensorflow as tf from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense from tensorflow.keras.regularizers import l2
然后,我們準(zhǔn)備一些虛擬的訓(xùn)練數(shù)據(jù):
# 生成虛擬的訓(xùn)練數(shù)據(jù) np.random.seed(42) X_train = np.random.random((1000, 10)) y_train = np.random.randint(2, size=(1000, 1)) X_test = np.random.random((200, 10)) y_test = np.random.randint(2, size=(200, 1))
接下來,我們創(chuàng)建一個(gè)包含L2正則化的神經(jīng)網(wǎng)絡(luò)模型:
# 創(chuàng)建神經(jīng)網(wǎng)絡(luò)模型 model = Sequential() model.add(Dense(16, activation='relu', input_shape=(10,), kernel_regularizer=l2(0.01))) model.add(Dense(8, activation='relu', kernel_regularizer=l2(0.01))) model.add(Dense(1, activation='sigmoid')) # 編譯模型 model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
在上面的代碼中,我們使用了kernel_regularizer=l2(0.01)來在每一層的權(quán)重上添加L2正則化,其中0.01是正則化的系數(shù),控制正則化的強(qiáng)度。較大的正則化系數(shù)會(huì)對(duì)權(quán)重施加更強(qiáng)的懲罰,使權(quán)重更加接近于零。
最后,我們進(jìn)行模型的訓(xùn)練并評(píng)估:
# 訓(xùn)練模型 model.fit(X_train, y_train, batch_size=32, epochs=50, validation_data=(X_test, y_test)) # 評(píng)估模型在測試集上的性能 loss, accuracy = model.evaluate(X_test, y_test) print(f'Test accuracy: {accuracy:.4f}')
通過這樣的操作,我們?cè)谏窠?jīng)網(wǎng)絡(luò)中應(yīng)用了L2正則化,有助于防止過擬合,提高了模型在未知數(shù)據(jù)上的泛化能力。