當前位置:
首頁 > 新聞 > 如何用人工神經網路處理決策邊界問題?這裡有一份簡單的代碼參考

如何用人工神經網路處理決策邊界問題?這裡有一份簡單的代碼參考

從本質上說,人工神經網路(ANN)是一種信息處理的範式,它受到人腦信息處理流程的啟發,目前在機器學習領域得到了非常廣泛的應用。


然而,可能許多人並不知道的是,ANN 早在 40 年代就被提出了。在最初的那幾年,ANN 曾在一定程度上引起了業界的關注,但由於那時沒有當前強大的硬體運算能力和高效的模型訓練演算法,因此ANN很快就銷聲匿跡了。但隨著時代的進步,技術的發展,目前 ANN 幾乎成了人工智慧的代名詞,特別是隨著自動編碼器、卷積網路、Dropout 正則化(dropout regularization)和其他各種技術的出現,ANN 的性能表現得到了顯著提升。


醫學研究表明:人腦的神經網路由神經元組成,它們通過神經突觸相互連接,傳輸信號。一般情況下,只有當一個神經元接收的信號量超過某一閾值,它才會向與之相連的其他神經元傳輸這一信號。而且,人腦的神經網路可以在任何神經元之間建立連接關係,甚至自己和自己連接。如果完全照搬人腦的這種鏈接結構,那麼人工神經網路將很難訓練,因此在大部分的實際應用場景中,研究者們通常會對人工神經網路做出一些精簡和限制(例如不能自己和自己連接等)。

在多層感知機(multi-layer perceptron)的情況下,神經元會被按層排列,並且每個神經元只能向下一層的神經元發送信號。第一層由輸入數據組成,最後一層輸出最終的預測值,稱為輸出層。這裡所有的神經元都通過所謂的突觸(synapse)連接。



如何用人工神經網路處理決策邊界問題?這裡有一份簡單的代碼參考



與人腦神經網路傳輸信號時的閾值相對應,在 ANN 中通常會使用 Sigmoid 函數來計算神經元的輸出。函數圖像和表達式如下所示。


如何用人工神經網路處理決策邊界問題?這裡有一份簡單的代碼參考




如何用人工神經網路處理決策邊界問題?這裡有一份簡單的代碼參考



一般情況下,ANN 的訓練過程大概可以分為如下兩個階段:

1. 前向傳遞,數據從輸入經過 ANN 流向輸出,被稱為前饋(feed forward)。


2. 反向傳遞,從輸出端開始,計算每個神經元的誤差,然後根據計算結果調整網路權重,被稱為反向傳播(Backpropagation)。


下文中,我們將首先嘗試用傳統的邏輯回歸演算法來處理決策邊界問題,接著引入 ANN,通過對比我們將看到 ANN 的強大。需要說明的是,這裡我們只實現了一個簡單的三層 ANN 結構(即上圖中的 hidden layer 有 3 層),並且,我們省略了一些數學和機器學習的基礎知識介紹,包括分類、正則化和梯度下降等。另外,我們還採用了一些基於 Python 的現成的機器學習庫。



邏輯回歸



我們首先用邏輯回歸的方法處理決策邊界問題,即訓練一個邏輯回歸分類器。這裡分類器的輸入是來自數據集的x值或y值,輸出是我們的預測分類結果(在本例中就是0或1,分別代表紅色和藍色兩種顏色)。

下面的代碼聲明了我們所需要的支持庫。


# Package imports


import matplotlib.pyplot as plt


import numpy as np

import sklearn


import sklearn.datasets


import sklearn.linear_model


import matplotlib


下面的代碼用隨機數的方法生成了需要進行邊界決策的數據集。


# Generate a dataset and plot it


np.random.seed(0)


X, y = sklearn.datasets.make_moons(200, noise=0.20)


plt.scatter(X[:,0], X[:,1], s=40, c=y, cmap=plt.cm.Spectral)


plt.show()


根據數據集繪製的點狀分布圖如下所示。



如何用人工神經網路處理決策邊界問題?這裡有一份簡單的代碼參考



在scikit-learn庫的幫助下,我們用此數據訓練邏輯回歸分類器,代碼如下。


# Train the logistic regression classifier


clf = sklearn.linear_model.LogisticRegressionCV()


clf.fit(X, y)


# Plot the decision boundary (the method is in the main code link provided in the end)


plot_decision_boundary(lambda x: clf.predict(x))


plt.title("Logistic Regression")


最終的輸出結果如下。



如何用人工神經網路處理決策邊界問題?這裡有一份簡單的代碼參考



可以看到,邏輯回歸分類器用直線將數據分為紅、藍兩類,雖然結果已經相當令人滿意了(可以看到絕大部分的紅、藍色點已經被分開了),但如果我們想要得到更精準的結果(即完全把紅、藍色點分開),顯然需要藉助更強大的解決方案,也就是下文即將實現的 ANN。



人工神經網路



下面我們構建一個三層 ANN 來解決該問題,看看結果和邏輯回歸相比有何不同。



如何用人工神經網路處理決策邊界問題?這裡有一份簡單的代碼參考



首先是關於隱藏層(hidden layer)維度(即節點數量)的選擇,一般認為更多的節點,就能實現更加複雜的函數。但高維度在模型訓練和結果預測時又需要巨大的計算能力支撐,而且大量的參數還可能造成過擬合(overfitting)問題。因此,如何選擇隱藏層的維度大小,還是要取決於具體的待解問題,而且它更多的是一門藝術而並非科學。下文我們將看到隱藏層的維度如何影響 ANN 的輸出,這裡首先給出幾條最基礎的 ANN 維度規則。


1. ANN 通常都會具有一個輸入層,一個隱藏層和一個輸出層。


2. 輸入層的節點數量由輸入數據的維度決定。


3. 輸出層的節點數量由輸出類別的數量決定。(本例中輸出層的維度是2,因為我們只有0和1兩種結果)。


下面我們還需要為隱藏層選擇一個激活函數(activation function)。激活函數負責將某一層的輸入轉換為輸出,一般非線性函數用於擬合非線性的假設。激活函數最常見的選擇包括:雙曲正切函數(tanh),Sigmoid 函數和 ReLu(Rectified Linear Units)函數等。本例中採用的是雙曲正切函數 tanh。


因為我們想要的最終結果是概率,因此輸出層的激活函數選擇 Softmax 函數會比較合適,這是一個將原始的數字結果轉換為概率的最簡單的方法。這裡可以將 Softmax 函數視為 Logistic 函數對多個分類的泛化(generalization)。



ANN如何進行預測?



如上文所述,整個訓練大概可以分為兩個過程。一是前向傳遞,即訓練數據從輸入端流向輸出,得到最終的預測值,這是一個前饋過程。二是反向傳遞,即通過參數學習(learning the parameters),找到一組最合適的參數組合,使得 ANN 的訓練誤差最小化。我們一般將測量誤差的函數稱為損失函數(loss function),由於上文我們將 Softmax 函數作為輸出層的激活函數,因此按照一般的習慣,這裡將 cross-entropy loss(交叉熵損失函數)作為損失函數。



ANN的實現



首先我們為後續的梯度下降過程定義一些變數和參數,代碼如下。


num_examples = len(X) # the training set size


nn_input_dim = 2 # dimension of the input layer


nn_output_dim = 2 # dimension of the output layer


# Gradient descent parameters


epsilon = 0.01 # the learning rate for gradient descent


reg_lambda = 0.01 # the strength of regularization


接著定義損失函數。


def calculate_loss(model):


定義輔助函數(helper function)預測輸出結果(0或1)。


def predict(model, x):


最後,我們定義 ANN 的訓練函數,它使用上面定義的反向傳播導數實現批量梯度下降(batch gradient descent)。


def build_model(nn_hdim, num_passes=20000, print_loss=False):



ANN的預測結果



下面我們用上文提到的點狀數據對 ANN 展開訓練。


# Build a model with a 3-dimensional hidden layer


model = build_model(3, print_loss=True)


# Plot the decision boundary


plot_decision_boundary(lambda x: predict(model, x))


plt.title("Decision Boundary for hidden layer size 3")



如何用人工神經網路處理決策邊界問題?這裡有一份簡單的代碼參考



從以上結果可以看到,隨著訓練次數的增多,模型的預測結果也就越好。低維的隱藏層可以很好地捕獲數據的總體趨勢,而更高的維度可能會因為記憶效應而產生過擬合,但是其總體形狀還是正確的。如果我們要在其他的數據集上對模型進行測試,那麼隱藏層維度更小的模型可能會得到更好的效果,因為它們泛化的更好。另外,雖然可以採用更強的正則化來抵消高維度引起的過擬合,但選擇一個合適的隱藏層維度則是更為經濟的方案。


完整源代碼:https://github.com/NSAryan12/nn-from-scratch/blob/master/nn-from-scratch.ipynb


來源:medium,雷鋒網編譯,雷鋒網版權文章


雷鋒網相關閱讀:


Google軟體工程師解讀:深度學習的activation function哪家強?


MIT重磅研究:基於人工神經網路,探索抑制神經元的生物學意義


如何對神經網路人工智慧硬體進行優化設計?

您的贊是小編持續努力的最大動力,動動手指贊一下吧!


本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 雷鋒網 的精彩文章:

HTC Vive與國家旅遊局聯手打造VR旅遊數據平台,VR會為旅行社帶來更多訂單嗎?
轉向場景體驗 vivo 再次開展線下渠道升級
支付寶開通異地續簽港澳通行證服務,首批 109 個城市接入

TAG:雷鋒網 |

您可能感興趣

身體有問題?這樣處理
「一切空性」對我有一點消極的影響,如何去處理這個問題?
戒煙是一場戰爭?這場戰爭是把複雜問題簡單處理,而且越簡單越容易!
如何處理幼貓一直叫的問題
插座鬆動一般怎麼處理?沒想到老電工的法子這麼簡單管用!
核桃這樣簡單處理一下,補腎固精有神效!
職場關係處理如何做好?修鍊好人緣來看這三招
關於後處理一把刀程序無換刀指令問題
另一半經常出差你是如何處理的
退役航母一般怎麼處理?這幾種方式讓人看著肉疼
應該怎樣處理鬼神要與人想通的問題?
我該如何處理目前這種情況?
古代怎麼處理戰場上的屍體?一般有四種方法,最後一種毫無人性
頭一次見這樣處理煙道的,師傅說這是他工作多年摸索出來的
幫你看懂新聞聯播丨處理好這六種關係,才能把「一帶一路」做好!
皇帝發現妃子出軌怎麼辦?不是想像的那麼簡單,處理方案令人同情
他說要做下一代的視覺處理器,卻先做了一款能幫盲人「看見」的眼鏡
「你」這個詞如何幫助我們處理負面的經歷
如何用深度學習做自然語言處理?這裡有份最佳實踐清單