警告:此實(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
多層感知機(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)是:
partial_fit
在實(shí)時(在線學(xué)習(xí))學(xué)習(xí)模型的能力。多層感知機(jī)(MLP)的缺點(diǎn)包括:
克服這些缺點(diǎn)的方法請參閱 實(shí)用使用技巧 部分。
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上的可視化 |
類 MLPRegressor
實(shí)現(xiàn)了一個多層感知器(MLP),它使用反向傳播來訓(xùn)練, 輸出層中沒有激活函數(shù),這也可以看作是使用identity function作為激活函數(shù)。因此,它使用平方誤差作為損失函數(shù),輸出是一組連續(xù)值。
MLPRegressor
還支持多輸出回歸,其中一個樣本可以有多個目標(biāo)。
MLPRegressor
和 MLPClassifier
都使用參數(shù)alpha
進(jìn)行正則化(L2正則化),這有助于通過懲罰大規(guī)模的權(quán)重來避免過度擬合。下面的圖顯示不同alpha值的決策函數(shù)。
有關(guān)更多信息,請參見下面的示例。
示例 |
---|
多層感知器中的正則化 |
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í)模式。
假設(shè)有個訓(xùn)練樣本,個特征,個隱藏層,每個層都包含神經(jīng)元--為了簡單起見,還有個輸出神經(jīng)元。反向傳播的時間復(fù)雜度為,其中為迭代次數(shù)。由于反向傳播具有很高的時間復(fù)雜度,最好從較小數(shù)量的隱神經(jīng)元和較少的隱藏層開始進(jìn)行訓(xùn)練。
給定一組訓(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ù)時停止。
多層感知機(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
可能比這兩種算法更好。
如果您希望更多地控制SGD中的停止標(biāo)準(zhǔn)或?qū)W習(xí)速率,或者希望進(jìn)行額外的監(jiān)視,那么使用warm_start=True
和max_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(...
參考
“Learning representations by back-propagating errors.” Rumelhart, David E., Geoffrey E. Hinton, and Ronald J. Williams. “Stochastic Gradient Descent” L. Bottou - Website, 2010. “Backpropagation” Andrew Ng, Jiquan Ngiam, Chuan Yu Foo, Yifan Mai, Caroline Suen - Website, 2011. “Efficient BackProp” Y. LeCun, L. Bottou, G. Orr, K. Müller - In Neural Networks: Tricks of the Trade 1998. “Adam: A method for stochastic optimization.” Kingma, Diederik, and Jimmy Ba. arXiv preprint arXiv:1412.6980 (2014).
更多建議: