首頁(yè)人工智能常見(jiàn)問(wèn)題正文

網(wǎng)絡(luò)訓(xùn)練時(shí)為何要加正則化,有哪些手段?

更新時(shí)間:2023-08-02 來(lái)源:黑馬程序員 瀏覽量:

IT培訓(xùn)班

  在深度學(xué)習(xí)中,加入正則化是為了防止過(guò)擬合(overfitting)現(xiàn)象的發(fā)生。過(guò)擬合指的是模型在訓(xùn)練數(shù)據(jù)上表現(xiàn)得很好,但在未見(jiàn)過(guò)的測(cè)試數(shù)據(jù)上表現(xiàn)不佳,因?yàn)槟P驮谟?xùn)練過(guò)程中過(guò)度擬合了訓(xùn)練數(shù)據(jù)的噪聲和細(xì)節(jié)。正則化的目的是限制模型的復(fù)雜性,以提高其在未知數(shù)據(jù)上的泛化能力。

  常見(jiàn)的正則化技術(shù)有:

  1.L1正則化(L1 regularization)

  也稱(chēng)為L(zhǎng)asso正則化,通過(guò)增加模型參數(shù)的絕對(duì)值之和作為懲罰項(xiàng)來(lái)限制模型復(fù)雜性。它可以促使模型產(chǎn)生稀疏權(quán)重,即許多參數(shù)變?yōu)榱?,從而?shí)現(xiàn)特征選擇的效果。

  2.L2正則化(L2 regularization)

  也稱(chēng)為Ridge正則化,通過(guò)增加模型參數(shù)的平方和作為懲罰項(xiàng)來(lái)限制模型復(fù)雜性。與L1正則化不同,L2正則化傾向于讓參數(shù)接近于零,但不嚴(yán)格等于零。

  3.Dropout正則化

  在訓(xùn)練過(guò)程中,隨機(jī)將一部分神經(jīng)元的輸出置為零,以減少不同神經(jīng)元之間的依賴性。這樣做可以促使網(wǎng)絡(luò)學(xué)習(xí)更魯棒的特征,并減少過(guò)擬合。

  現(xiàn)在讓我們通過(guò)Python代碼演示如何在神經(jīng)網(wǎng)絡(luò)中使用L2正則化。

  首先,我們需要導(dǎo)入必要的庫(kù)和模塊:

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))

  接下來(lái),我們創(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)來(lái)在每一層的權(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)估模型在測(cè)試集上的性能
loss, accuracy = model.evaluate(X_test, y_test)
print(f'Test accuracy: {accuracy:.4f}')

  通過(guò)這樣的操作,我們?cè)谏窠?jīng)網(wǎng)絡(luò)中應(yīng)用了L2正則化,有助于防止過(guò)擬合,提高了模型在未知數(shù)據(jù)上的泛化能力。

分享到:
在線咨詢 我要報(bào)名
和我們?cè)诰€交談!