BP神經網絡回歸的三種python實現
前言
BP神經網絡(Back Propagation)是基於誤差反向傳播算法訓練的多層前饋網絡,能學習存儲大量的輸入-輸出模式映射關系。它的優化方法是使用梯度下降法,通過反向傳播來不斷調整網絡的權值和閾值,使網絡誤差平方和最小。其實際就是多層感知機,拓撲結構(單隱藏層)如下圖所示。
BP神經網絡與梯度下降法的關系
BP神經網絡用來計算損失函數相對於神經網絡參數的梯度,待求的是最小化損失函數的參數,是一種建模思想;而梯度下降法是一種優化算法,用於尋找最小化損失函數的參數。(https://www.zhihu.com/question/396352046)
三種實現
分別基於python-sklearn/pytorch/tf2.0實現BP神經網絡的多變量回歸模型。
模型的輸入是有着兩個自變量的二維數組(列=2),隨機生成一組正態分布的數組后,乘以權重w/b,然后再添加正態擾動,得到輸出值,最后將這兩個值進行回歸分析。
這里建立的BP模型的隱藏層神經元個數分別為10-4-1,共有4層網絡。
1. sklearn
BP神經網絡在sklearn中的api如下:
MLPRegressor(hidden_layer_sizes=100, activation='relu', *, solver='adam', alpha=0.0001, batch_size='auto', learning_rate='constant', learning_rate_init=0.001, power_t=0.5, max_iter=200, shuffle=True, random_state=None, tol=0.0001, verbose=False, warm_start=False, momentum=0.9, nesterovs_momentum=True, early_stopping=False, validation_fraction=0.1, beta_1=0.9, beta_2=0.999, epsilon=1e-08, n_iter_no_change=10, max_fun=15000)
2. pytorch
3. tf2.0
結果
模型的預測值網格與實際值對比圖如下,從上到下依次對應sklean/pytorch/tf2.0,R²均在0.99上下:
后記
- 三種api中,sklearn的最簡單易用,但也最不靈活。pytorch、tf2.0雖然稍微復雜一點,但是對於網絡架構的設定和參數的調整都靈活許多,個人更傾向於sklearn + pytorch結合操作。
- pytorch/tf2.0的api中,learning rate的調整至關重要,不適合的lr會導致擬合效果很差。
- 以上是二元變量的回歸,也可以推廣至多元變量的回歸中,但隱藏層和lr的設定需要慢慢去調整。
- 數組構造部分,如
np.random.uniform()
在torch(torch.Tensor(num, 2).uniform_(-10,10)
)和tf2.0(tf.random.uniform()
)中都有各自對應的api。建議使用這些api,如果使用numpy有時候會出現一些麻煩(如tf2.0)。