scikit-learn 中文文檔-神經網絡模型-監督學習|ApacheCN

中文文檔: http://sklearn.apachecn.org/cn/0.19.0/modules/neural_networks_supervised.html

英文文檔: http://sklearn.apachecn.org/en/0.19.0/modules/neural_networks_supervised.html

官方文檔: http://scikit-learn.org/stable/

GitHub: https://github.com/apachecn/scikit-learn-doc-zh(覺得不錯麻煩給個 Star,我們一直在努力)

貢獻者: https://github.com/apachecn/scikit-learn-doc-zh#貢獻者

關於我們: http://www.apachecn.org/organization/209.html




1.17. 神經網絡模塊(監督的)

Warning

   

此實現不適用於大規模應用程序。 特別是 scikit-learn 不支持 GPU。如果想要提高運行速度並使用基於 GPU 的實現以及爲構建深度學習架構提供更多靈活性的框架,請參閱 Related Projects

1.17.1. 多層感知器

**多層感知器(MLP)**是一種監督學習算法,通過在數據集上訓練來學習函數 f(\cdot): R^m \rightarrow R^o,其中 m 是輸入的維數,o 是輸出的維數。 給定一組特徵 X = {x_1, x_2, ..., x_m} 和標籤 y ,它可以學習用於分類或迴歸的非線性函數。 與邏輯迴歸不同的是,在輸入層和輸出層之間,可以有一個或多個非線性層,稱爲隱藏層。 圖1 展示了一個具有標量輸出的單隱藏層 MLP。

../_images/multilayerperceptron_network.png

圖1:單隱藏層MLP.

最左層的輸入層由一組代表輸入特徵的神經元 \{x_i | x_1, x_2, ..., x_m\} 組成。 每個隱藏層中的神經元將前一層的值進行加權線性求和轉換 w_1x_1 + w_2x_2 + ... + w_mx_m ,再通過非線性激活函數 g(\cdot):R \rightarrow R - 比如雙曲正切函數 tanh 。 輸出層接收到的值是最後一個隱藏層的輸出經過變換而來的。

該模塊包含公共屬性 coefs_ 和 intercepts_coefs_ 是一系列權重矩陣,其中下標爲 i 的權重矩陣表示第 i 層和第 i+1 層之間的權重。 intercepts_ 是一系列偏置向量,其中的下標爲 i 的向量表示添加到第 i+1 等的偏置值。

多層感知器的優點:

  • 可以學習得到非線性模型。
  • 使用``partial_fit`` 可以學習得到實時模型(在線學習)。

多層感知器(MLP)的缺點:

  • 具有隱藏層的 MLP 具有非凸的損失函數,它有不止一個的局部最小值。 因此不同的隨機權重初始化會導致不同的驗證集準確率。
  • MLP 需要調試一些超參數,例如隱藏層神經元的數量、層數和迭代輪數。
  • MLP 對特徵歸一化很敏感.

解決這些缺點的方法請參閱 實用使用技巧 部分。

1.17.2. 分類

MLPClassifier 類實現了通過 Backpropagation 進行訓練的多層感知器(MLP)算法。

MLP 在兩個 array 上進行訓練:尺寸爲 (n_samples, n_features) 的 array X 儲存表示訓練樣本的浮點型特徵向量; 尺寸爲(n_samples,) 的 array y 儲存訓練樣本的目標值(類別標籤):

>>>
>>> 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(activation='relu', alpha=1e-05, batch_size='auto',
       beta_1=0.9, beta_2=0.999, early_stopping=False,
       epsilon=1e-08, hidden_layer_sizes=(5, 2), learning_rate='constant',
       learning_rate_init=0.001, max_iter=200, momentum=0.9,
       nesterovs_momentum=True, power_t=0.5, random_state=1, shuffle=True,
       solver='lbfgs', tol=0.0001, validation_fraction=0.1, verbose=False,
       warm_start=False)

擬合(訓練)後,該模型可以預測新樣本的標籤:

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

MLP 可以爲訓練數據擬合一個非線性模型。clf.coefs_ 包含了構建模型的權值矩陣:

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

目前, MLPClassifier 只支持交叉熵損失函數,通過運行 predict_proba 方法進行概率估計。

MLP 算法使用的是反向傳播的方式。 更準確地說,它使用了通過反向傳播計算得到的梯度和某種形式的梯度下降來進行訓練。 對於分類來說,它最小化交叉熵損失函數,爲每個樣本 x 給出一個向量形式的概率估計 P(y|x)

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

MLPClassifier 通過應用 Softmax 作爲輸出函數來支持多分類。

此外,該模型支持 多標籤分類,樣本可能有多個類別可能。 對於每個類,原始輸出經過 logistic 函數變換後,大於或等於 0.5 的值將進爲 1,否則爲 0。 對於樣本的預測輸出,值爲 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(activation='relu', alpha=1e-05, batch_size='auto',
       beta_1=0.9, beta_2=0.999, early_stopping=False,
       epsilon=1e-08, hidden_layer_sizes=(15,), learning_rate='constant',
       learning_rate_init=0.001, max_iter=200, momentum=0.9,
       nesterovs_momentum=True, power_t=0.5, random_state=1, shuffle=True,
       solver='lbfgs', tol=0.0001, validation_fraction=0.1, verbose=False,
       warm_start=False)
>>> clf.predict([[1., 2.]])
array([[1, 1]])
>>> clf.predict([[0., 0.]])
array([[0, 1]])

瞭解更多,請參閱下面的示例和文檔 MLPClassifier.fit

1.17.3. 迴歸

MLPRegressor 類實現了一個多層感知器(MLP),它在使用反向傳播進行訓練時的輸出層沒有使用激活函數,也可以看作是使用身份函數作爲激活函數。 因此,它使用平方誤差作爲損失函數,輸出是一組連續值。

MLPRegressor 還支持多輸出迴歸,其中樣本可以有多個目標。

1.17.4. 正則化

MLPRegressor 類和 MLPClassifier 類都使用參數 alpha 作爲正則化( L2 正則化)係數,正則化通過懲罰大數量級的權重值以避免過擬合問題。 下面的圖表展示了不同的 alpha 值情況下的變化。

../_images/sphx_glr_plot_mlp_alpha_0011.png

詳細信息,請參閱下面的示例。

1.17.5. 算法

MLP 使用 Stochastic Gradient Descent(隨機梯度下降)(SGD)Adam, 或者 L-BFGS 進行訓練。 Stochastic Gradient Descent (隨機梯度下降)(SGD) 使用帶有自適應參數的損失函數梯度來更新參數,即

w \leftarrow w - \eta (\alpha \frac{\partial R(w)}{\partial w}+ \frac{\partial Loss}{\partial w})

其中 \eta 是控制訓練過程參數更新步長的學習率( learning rate )。 Loss 是損失函數( loss function )。

更多細節可以在這個文檔中找到 SGD 。

Adam 類似於 SGD,因爲它是 stochastic optimizer (隨機優化器),但它可以根據低階矩的自適應估計自動調整參數更新的量。

使用 SGD 或 Adam ,訓練過程支持在線模式和小批量學習模式。

L-BFGS 是利用 Hessian 矩陣的近似表示的方法,矩陣中是函數的二階偏導數。 它近似用 Hessian 矩陣的逆來進行參數更新。 該實現使用 Scipy 版本的 L-BFGS

如果所選擇的方法是 ‘L-BFGS’,訓練過程不支持在線模式和小批量學習模式。

1.17.6. 複雜性

假設有 n 個訓練樣本, m 個特徵, k 個隱藏層,每個包含 h 個神經元 - 爲簡單起見, o 個輸出神經元。 反向傳播的時間複雜度是 O(n\cdot m \cdot h^k \cdot o \cdot i) ,其中 i 是迭代次數。 由於反向傳播具有高時間複雜性,最好以較少數量的隱藏層神經元和較少的隱藏層個數開始訓練。

1.17.7. 數學公式

給出一組訓練樣本 (x_1, y_1), (x_2, y_2), \ldots, (x_n, y_n) 其中 x_i \in \mathbf{R}^n y_i \in \{0, 1\},一個單隱藏層單神經元 MLP 學習到的函數是 f(x) = W_2 g(W_1^T x + b_1) + b_2 ,其中 W_1 \in \mathbf{R}^m 和 W_2, b_1, b_2 \in \mathbf{R} 是模型參數. W_1, W_2 分別是輸入層與隱藏層之間和隱藏層與輸出層之間的權重, b_1, b_2 分別是隱藏層和輸出層的偏置值. g(\cdot) : R \rightarrow R 是激活函數,默認爲雙曲正切函數。 具體形式如下,

g(z)= \frac{e^z-e^{-z}}{e^z+e^{-z}}

對於二分類, f(x) 經過 logistic 函數 g(z)=1/(1+e^{-z}) 得到 0 到 1 之間的輸出值。 0.5 的閾值將輸出大於等於 0.5 的樣本分到 positive class (正類),其他的分爲 negative class (負類)。

如果多於兩類,則 f(x) 本身將是一個尺寸爲(n_classes,)的向量。 它需要經過 softmax 函數而不是 logistic 函數進行變換,具體形式如下,

\text{softmax}(z)_i = \frac{\exp(z_i)}{\sum_{l=1}^k\exp(z_l)}

其中 z_i 表示 softmax 函數的第 i 個輸入的元素,它對應於第 i 類, K 是類別的數量。 計算結果是樣本 x 屬於每個類別的概率的向量。 最終輸出的分類結果是具有最高概率的類別。

在迴歸問題中,輸出依然是 f(x) ;因此,輸出激活函數就是身份函數。

MLP 根據特定問題使用不同的損失函數。 二分類問題的損失函數的是交叉熵,具體形式如下,

Loss(\hat{y},y,W) = -y \ln {\hat{y}} - (1-y) \ln{(1-\hat{y})} + \alpha ||W||_2^2

其中 \alpha ||W||_2^2 是 L2 正則化的模型複雜度懲罰項; \alpha > 0 這個非負的超參數控制懲罰的程度。

對於迴歸問題,MLP 使用平方誤差損失函數,具體形式如下,

Loss(\hat{y},y,W) = \frac{1}{2}||\hat{y} - y ||_2^2 + \frac{\alpha}{2} ||W||_2^2

從隨機初始化權重開始,多層感知器(MLP)不斷更新這些權重值來最小化損失函數。計算完損失之後,從輸出層到前面各層進行反向傳遞,爲旨在減小損失函數值的參數提供更新值。

在梯度下降中,計算得到損失函數關於每個權重的梯度 \nabla Loss_{W} 並從權重 W 中減掉。用公式表示爲,

W^{i+1} = W^i - \epsilon \nabla {Loss}_{W}^{i}

其中 i 是當前迭代步數, \epsilon 是大於 0 學習率。

算法停止的條件或者是達到預設的最大迭代次數,或者是損失函數低於某個特定值。

1.17.8. 實用技巧

  • 多層感知器對特徵的縮放是敏感的,所以它強烈建議您歸一化你的數據。 例如,將輸入向量 X 的每個屬性放縮到到 [0, 1] 或 [-1,+1] ,或者將其標準化使它具有 0 均值和方差 1。 注意,爲了得到有意義的結果,您必須對測試集也應用 相同的 縮放尺度。 您可以使用 StandardScaler 進行標準化。

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

    一個推薦的可替代的方案是在 Pipeline 中使用的 StandardScaler 。

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

  • 據經驗可知,我們觀察到 L-BFGS 收斂速度是更快的並且是小數據集上更好的解決方案。對於規模相對比較大的數據集,Adam 是非常魯棒的。 它通常會迅速收斂,並得到相當不錯的表現。 另一方面,如果學習率調整地正確, 使用 momentum 或 nesterov’s momentum 的 SGD 可以比這兩種算法更好。

1.17.9. 使用 warm_start 的更多控制

如果您希望更多地控制 SGD 中的停止標準或學習率,或者想要進行額外的監視,使用 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(...

參考文獻:




中文文檔: http://sklearn.apachecn.org/cn/0.19.0/modules/neural_networks_supervised.html

英文文檔: http://sklearn.apachecn.org/en/0.19.0/modules/neural_networks_supervised.html

官方文檔: http://scikit-learn.org/stable/

GitHub: https://github.com/apachecn/scikit-learn-doc-zh(覺得不錯麻煩給個 Star,我們一直在努力)

貢獻者: https://github.com/apachecn/scikit-learn-doc-zh#貢獻者

關於我們: http://www.apachecn.org/organization/209.html

有興趣的們也可以和我們一起來維護,持續更新中 。。。

機器學習交流羣: 629470233

發佈了1 篇原創文章 · 獲贊 5 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章