scikit-learn 神經(jīng)網(wǎng)絡(luò)模型(有監(jiān)督)

2023-02-20 13:44 更新

警告:此實(shí)現(xiàn)不適用于大規(guī)模數(shù)據(jù)應(yīng)用。 特別是 scikit-learn 不支持 GPU。如果想要提高運(yùn)行速度并使用基于 GPU 的實(shí)現(xiàn)以及為構(gòu)建深度學(xué)習(xí)架構(gòu)提供更多靈活性的框架,請看 Related Projects

1.17.1 多層感知機(jī)

多層感知機(jī)(MLP)是一種有監(jiān)督學(xué)習(xí)算法,通過在數(shù)據(jù)集上訓(xùn)練來學(xué)習(xí)函數(shù)。其中是輸入的維數(shù), 是輸出的維數(shù)。給定一組特征和標(biāo)簽, 它可以對分類或者回歸學(xué)習(xí)一個非線性函數(shù)。與邏輯回歸不同,在輸入層和輸出層之間, 會存在一個層或者多層的非線性層, 稱為隱藏層。圖1展示了一個帶有標(biāo)量輸出的單層隱藏層的MLP。


? 圖1:單隱藏層MLP.

最左邊的層叫做輸入層, 由一組代表輸入特征的神經(jīng)元組成。每個隱藏層中的神經(jīng)元將前一層的值進(jìn)行加權(quán)線性求和轉(zhuǎn)換, 接著通過非線性函數(shù), 就像雙曲正切函數(shù)。輸出層接受的值是最后一個隱藏層經(jīng)過變換輸出的值。

該模塊下, 包含了公共的屬性 coefs_intercepts_ 。 coefs_是一個權(quán)重矩陣的列表, 其中索引為的權(quán)重矩陣表示的第層和第層之間的之間的權(quán)重。intercepts_是偏置向量的列表, 其中索引為的向量表示的是添加到底層的偏置值。

多層感知機(jī)的優(yōu)點(diǎn)是:

  • 學(xué)習(xí)非線性模型的能力。
  • 有使用 partial_fit在實(shí)時(在線學(xué)習(xí))學(xué)習(xí)模型的能力。

多層感知機(jī)(MLP)的缺點(diǎn)包括:

  • 具有隱藏層的 MLP 具有非凸的損失函數(shù),它有不止一個的局部最小值。 因此不同的隨機(jī)初始化權(quán)重會導(dǎo)致不同的驗(yàn)證集準(zhǔn)確率。
  • MLP 需要調(diào)試一些超參數(shù),例如隱藏層神經(jīng)元的數(shù)量、層數(shù)和迭代輪數(shù)。
  • MLP對特征縮放是敏感的。

克服這些缺點(diǎn)的方法請參閱 實(shí)用使用技巧 部分。

1.17.2 分類

MLPClassifier類通過使用 Backpropagation進(jìn)行訓(xùn)練實(shí)現(xiàn)了多層感知機(jī)(MLP)算法。

MLP 在兩個數(shù)組上進(jìn)行訓(xùn)練:大小為 (n_samples, n_features) 的數(shù)組 X,用來儲存表示訓(xùn)練樣本的浮點(diǎn)型特征向量; 大小為 (n_samples,) 的數(shù)組 y,用來儲存訓(xùn)練樣本的目標(biāo)值(類別標(biāo)簽):

>>> from sklearn.neural_network import MLPClassifier
>>> X = [[0., 0.], [1., 1.]]
>>> y = [0, 1]
>>> clf = MLPClassifier(solver='lbfgs', alpha=1e-5,
...                     hidden_layer_sizes=(5, 2), random_state=1)
...
>>> clf.fit(X, y)
MLPClassifier(alpha=1e-05, hidden_layer_sizes=(5, 2), random_state=1,
              solver='lbfgs')

經(jīng)過擬合(訓(xùn)練),該模型可以預(yù)測新樣品的標(biāo)簽:

>>> clf.predict([[2., 2.], [-1., -2.]])
array([1, 0])

MLP可以擬合訓(xùn)練數(shù)據(jù)的非線性模型。clf.coefs_包含構(gòu)成模型參數(shù)的權(quán)重矩陣:

>>> [coef.shape for coef in clf.coefs_]
[(2, 5), (5, 2), (2, 1)]

目前, MLPClassifier 只支持交叉熵?fù)p失函數(shù)( Cross-Entropy loss function),它通過運(yùn)行 predict_proba 方法進(jìn)行概率估計(jì)。

MLP 算法使用的是反向傳播的方式。 更準(zhǔn)確地說,它使用了某種形式的梯度下降來進(jìn)行訓(xùn)練,其中的梯度是通過反向傳播計(jì)算得到的。 對于分類問題而言,它最小化了交叉熵?fù)p失函數(shù),為每個樣本 給出一個向量形式的概率估計(jì) 。

>>> clf.predict_proba([[2., 2.], [1., 2.]])
array([[1.967...e-04, 9.998...-01],
       [1.967...e-04, 9.998...-01]])

MLPClassifier通過應(yīng)用 Softmax作為輸出函數(shù)來支持多分類。

此外,該模型支持 multi-label classification,其中一個樣本可以屬于多個類別。 對于每個種類,原始輸出經(jīng)過 logistic 函數(shù)變換后,大于或等于 0.5 的值將為 1,否則為 0。 對于樣本的預(yù)測輸出,值為 1 的索引表示該樣本的分類類別:

>>> X = [[0., 0.], [1., 1.]]
>>> y = [[0, 1], [1, 1]]
>>> clf = MLPClassifier(solver='lbfgs', alpha=1e-5,
...                     hidden_layer_sizes=(15,), random_state=1)
...
>>> clf.fit(X, y)
MLPClassifier(alpha=1e-05, hidden_layer_sizes=(15,), random_state=1,
              solver='lbfgs')
>>> clf.predict([[1., 2.]])
array([[1, 1]])
>>> clf.predict([[0., 0.]])
array([[0, 1]])

更多內(nèi)容請參閱下面的示例和文檔 MLPClassifier.fit。

示例
比較MLPClassifier的隨機(jī)學(xué)習(xí)策略
MLP權(quán)重在MNIST上的可視化

1.17.3 回歸

MLPRegressor實(shí)現(xiàn)了一個多層感知器(MLP),它使用反向傳播來訓(xùn)練, 輸出層中沒有激活函數(shù),這也可以看作是使用identity function作為激活函數(shù)。因此,它使用平方誤差作為損失函數(shù),輸出是一組連續(xù)值。

MLPRegressor 還支持多輸出回歸,其中一個樣本可以有多個目標(biāo)。

1.17.4 正則化

MLPRegressorMLPClassifier 都使用參數(shù)alpha進(jìn)行正則化(L2正則化),這有助于通過懲罰大規(guī)模的權(quán)重來避免過度擬合。下面的圖顯示不同alpha值的決策函數(shù)。


有關(guān)更多信息,請參見下面的示例。

示例
多層感知器中的正則化

1.17.5 算法

MLP使用隨機(jī)梯度下降(Stochastic Gradient Descent), Adam或者 L-BFGS來進(jìn)行訓(xùn)練。隨機(jī)梯度下降(SGD)根據(jù)需要調(diào)整的參數(shù)使用損失函數(shù)的梯度更新參數(shù),即

其中是控制參數(shù)空間搜索步長的學(xué)習(xí)速率。是神經(jīng)網(wǎng)絡(luò)的損失函數(shù)。

更詳細(xì)的信息可以在SGD的文檔中找到。

ADAM在某種意義上類似于SGD,它是一個隨機(jī)優(yōu)化器,但它可以根據(jù)對低階矩的自適應(yīng)估計(jì)自動調(diào)整更新參數(shù)的數(shù)量。

使用 SGD 或 Adam ,訓(xùn)練過程可以支持在線學(xué)習(xí)模式和小批量學(xué)習(xí)模式。

L-BFGS是一個近似Hessian矩陣的求解器,它表示函數(shù)的二階偏導(dǎo)數(shù)。此外,它逼近Hessian矩陣的逆以執(zhí)行參數(shù)更新。該實(shí)現(xiàn)使用了 L-BFGS的Scipy版本。

如果你所選擇的方法是 ‘L-BFGS’,訓(xùn)練過程不支持在線學(xué)習(xí)模式和小批量學(xué)習(xí)模式。

1.17.6 復(fù)雜度

假設(shè)有個訓(xùn)練樣本,個特征,個隱藏層,每個層都包含神經(jīng)元--為了簡單起見,還有個輸出神經(jīng)元。反向傳播的時間復(fù)雜度為,其中為迭代次數(shù)。由于反向傳播具有很高的時間復(fù)雜度,最好從較小數(shù)量的隱神經(jīng)元和較少的隱藏層開始進(jìn)行訓(xùn)練。

1.17.7 數(shù)學(xué)公式

給定一組訓(xùn)練樣本, 其中,一個隱藏層中一個神經(jīng)元學(xué)習(xí)函數(shù)是,其中是模型的參數(shù)。分別表示輸入層和隱藏層的權(quán)重;分別表示添加到隱藏層和輸出層的偏差。是激活函數(shù),默認(rèn)設(shè)置為(雙曲正切)tan, 它被給出如下:

對于二分類,通過logistic函數(shù)獲得0到1之間的輸出值。設(shè)置閾值為0.5, 會將大于或等于0.5的輸出樣本分配給正類,其余的分配給負(fù)類。

如果有兩個以上的類, 本身將是大小為(n_classes)的向量。它不是通過logistic函數(shù),而是通過Softmax函數(shù),該函數(shù)被編寫為,

其中 表示Softmax輸入的第個元素,它對應(yīng)于第類,是類的數(shù)量。結(jié)果是包含樣本屬于每個類的概率的向量。輸出是概率最高的類。

在回歸中,輸出保持為 ;因此,輸出激活函數(shù)就是恒等函數(shù)( identity function)。

MLP根據(jù)問題類型使用不同的損失函數(shù)。分類損失函數(shù)是交叉熵(Cross-Entropy),在二分類情況下給出如下:

其中,是對模型的復(fù)雜度進(jìn)行懲罰的L2正則化項(xiàng)(也稱為懲罰項(xiàng)),并且是一個非負(fù)的超參數(shù),它控制著懲罰的程度。

對于回歸,MLP使用均方誤差損失函數(shù), 寫成;

從初始隨機(jī)化權(quán)重開始,多層感知機(jī)(MLP)通過重復(fù)更新這些權(quán)重,使損失函數(shù)最小化。在計(jì)算損失后,反向傳遞將其從輸出層傳播到前一層,為每個權(quán)重參數(shù)提供一個更新值,以減少損失。

在梯度下降中,計(jì)算得到損失函數(shù)關(guān)于每個權(quán)重的梯度, 并從減去,這可以表示為:

其中是迭代步驟,是值大于0的學(xué)習(xí)速率。

該算法在達(dá)到預(yù)定的最大迭代次數(shù),或者當(dāng)損失的改進(jìn)低于某個很小的數(shù)時停止。

1.17.8 實(shí)用技巧

  • 多層感知機(jī)對特征的縮放是敏感的,所以它強(qiáng)烈建議您標(biāo)準(zhǔn)化您的數(shù)據(jù)。 例如,將輸入向量 X 的每個屬性放縮到到 [0, 1] 或 [-1,+1] ,或者將其標(biāo)準(zhǔn)化使它具有 0 均值和方差 1。注意,為了得到有意義的結(jié)果,您必須對測試集也應(yīng)用相同的尺度縮放。 您可以使用 StandardScaler 進(jìn)行標(biāo)準(zhǔn)化。

    >>> from sklearn.preprocessing import StandardScaler  # doctest: +SKIP
    >>> scaler = StandardScaler()  # doctest: +SKIP
    >>> # Don't cheat - fit only on training data
    >>> scaler.fit(X_train)  # doctest: +SKIP
    >>> X_train = scaler.transform(X_train)  # doctest: +SKIP
    >>> # apply same transformation to test data
    >>> X_test = scaler.transform(X_test)  # doctest: +SKIP

    另一個推薦的方法是在 Pipeline 中使用的 StandardScaler 。

  • 最好使用 GridSearchCV 找到一個合理的正則化參數(shù) ,通常范圍是在 10.0 ** -np.arange(1, 7)

  • 據(jù)經(jīng)驗(yàn)可知,我們觀察到 L-BFGS是收斂速度更快的且在小數(shù)據(jù)集上表現(xiàn)更好的解決方案。對于規(guī)模相對比較大的數(shù)據(jù)集, Adam是非常魯棒的。 它通常會迅速收斂,并得到相當(dāng)不錯的表現(xiàn)。另一方面,如果學(xué)習(xí)率調(diào)整得正確, 使用 momentum 或 nesterov’s momentum 的 SGD可能比這兩種算法更好。

1.17.9 warm_start的更多控制

如果您希望更多地控制SGD中的停止標(biāo)準(zhǔn)或?qū)W習(xí)速率,或者希望進(jìn)行額外的監(jiān)視,那么使用warm_start=Truemax_iter=1并迭代自己可能會有幫助:

>>> X = [[0., 0.], [1., 1.]]
>>> y = [0, 1]
>>> clf = MLPClassifier(hidden_layer_sizes=(15,), random_state=1, max_iter=1, warm_start=True)
>>> for i in range(10):
...     clf.fit(X, y)
...     # additional monitoring / inspection
MLPClassifier(...

參考


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號