如何利用MATLAB快速搭建一個神經網路
0.導讀
首先聲明,這篇文章的內容並不全是本人的原創內容,凡是引用了別人的博客或者文章的地方,我都會標註出來,以便大家閱讀原文。
現在最前面的,當然是提綱挈領的廢話。凡是商品都有目標人群,文章也該如此,一篇文章寫了什麼,是寫給誰看的,看完之後會起到什麼作用,應該是作者在一開始就簡明扼要的提出的,否則讀者讀了文章發現毫無用處,作者挨罵,讀者無獲,皆不歡喜。
本文的主要內容,是採用形象的描述而非準確的定義來讓讀者對神經網路有一個粗略的了解,基於MATLAB的GUI界面而非command windows來快速搭建一個神經網路以解決簡單的問題。如果你的電腦上沒有MATLAB,官方提供的MATLAB在線服務是個不錯的選擇MATLAB Online - MATLAB & Simulink,當然,前提是你得有正版的激活碼。筆者計劃在下一篇文章採用準確的定義和MATLAB的腳本語言來進一步闡述神經網路。本文的受眾,是那些大學低年級學生--沒有受過專業或系統的訓練,卻因為數模等原因需要在短時間內了解且應用神經網路。
1.神經網路是什麼
為了利用MATLAB搭建一個神經網路,我們要首先了解一下什麼是神經網路。斯坦福大學的印度學生、機器學習愛好者 PararthShah 在2012年12月22日的使用買芒果的例子,非常經典易懂。知友Begin Again翻譯如下:
你需要挑選芒果,你不知道什麼樣的芒果最好吃,所以你就嘗遍了所有的芒果,然後自己總結出個大深黃色的比較好吃,以後再去買的時候,就可以直接挑選這種。那什麼是機器學習呢,就是你讓機器「嘗」一遍所有芒果,當然,也假設它知道哪些好吃,讓機器去總結一套規律(個大深黃色),這就是機器學習。具體操作,就是你描述給機器每一個芒果的特徵(顏色,大小,軟硬……),描述給機器其輸出(味道如何,是否好吃),剩下的就等機器去學習出一套規則。
等等,那機器是怎麼學習到這個規則(個大深黃色的好吃)的?沒錯,是通過機器學習演算法。近些年來,由於深度學習概念的興起,神經網路又成為了機器學習領域最熱門的研究方法。神經網路就像一個剛開始學習東西的小孩子,開始認東西,作為一個大人(監督者),第一天,他看見一隻京巴狗,你告訴他這是狗;第二天他看見一隻波斯貓,他開心地說,這是狗,糾正他,這是貓;第三天,他看見一隻蝴蝶犬,他又迷惑了,你告訴他這是狗……直到有一天,他可以分清任何一隻貓或者狗。
其實神經網路最初得名,就是其在模擬人的大腦,把每一個節點當作一個神經元,這些「神經元」組成的網路就是神經網路。而由於計算機出色的計算能力和細節把握能力,在大數據的基礎上,神經網路往往有比人更出色的表現。當然了,也可以把神經網路當作一個黑箱子,只要告訴它輸入,輸出,他可以學到輸入與輸出的函數關係。神經網路的理論基礎之一是三層的神經網路可以逼近任意的函數,所以理論上,只要數據量夠大,「箱子容量」夠大(神經元數量),神經網路就可以學到你要的東西。
2.如何利用MATLAB工具箱建立神經網路
以上的關於神經網路粗淺的描述,雖然並不準確,但是大體的意思表達到位了。簡單來說,神經網路就是定義域(輸入)和值域(輸出)之間的映射。舉例來說,病人到醫院做了一堆檢查,包括肝功能,尿檢,血檢等,得到了一堆數據(輸入),現在要根據這堆數據判斷病人得了什麼病(輸出),這就是神經網路的常用場景之一:模式識別,或者說分類。如下圖所示,MATLAB工具箱中的神經網路還可用於曲線擬合(其實這也就是個映射),動態時間序列等問題上。
在MATLAB的command window里輸出命令
nnstart
即可調用其自帶的神經網路工具箱嚮導。首先根據你要解決的問題選擇合適的神經網路,這裡以運用的最多的模式識別舉例。選擇pattern recognition app,如下圖所示。
模式識別工具箱,顧名思義,就是用來解決上述病人看病和判斷芒果是否好吃的例子的。該工具箱的神經網路採用了兩層前向式網路(A two-layer feed-forward network),訓練函數是trainscg(scaled conjugate gradient backpropagation)若隱藏層含有足夠多的神經元,就能取得較好的識別效果( can classify vectors arbitrarily well, given enough neurons in its hidden layer)。
點擊next,開始導入數據。
在這裡要說明一下數據格式。輸入數據和目標數據都是以矩陣的形式表示,可以表示為行矩陣或者列矩陣。如圖中1號紅色框所示,我選擇列矩陣,那麼我的輸入輸出矩陣中每一列代表一個樣本,比如我有150個樣本,每個樣本包含四個坐標分量,那麼我的輸入矩陣大小應該為4*150.目標矩陣也應該按照列來解讀,如我有150個樣本,那麼我的目標矩陣也應該是150,每一列都代表與其相對應的輸入的結果,其中0意味著不屬於該類,1意味著屬於該類。比如,第75個輸出屬於第二類,那麼我的目標矩陣的第75列為(0;1;0)。
點擊next,進行數據分類。
在這裡簡單解釋一下這三類數據,分別是訓練數據(train),確認數據(validation)和測試數據(test)。其中,訓練數據用於訓練神經網路,確認數據用於確認神經網路的訓練效果,測試數據用於展示神經網路好壞。事實上,確認數據和測試數據的作用相似,在數據量較小的情況下,可以不設置測試數據,只設置訓練數據和確認數據。
在確認好各個數據的比例後,點擊next選擇隱藏層神經元數量。
在這裡需要解釋的是,隱藏層(hidden layer)的神經元數量的選取沒有一定的準則。數量過少會使得擬合效果不好(模式分類不夠準確),數量過多有可能出現過擬合狀態(對於其他數據的識別能力較差)。所以一般的做法是保留默認值,如果對默認值不滿意再增加神經元數量。點擊next,此時已經創建好神經網路。
由於訓練函數已經選定為trainscg(scaled conjugate gradient backpropagation)且不可更改,所以直接點擊train。
此時彈出訓練窗口。這裡主要解釋一下progress和plots。對於progress,我們看到有一下幾個條目:
- epoch:其代表著迭代次數。BP神經網路的訓練是採用迭代訓練的,圖中顯示訓練(迭代)15次即停止。特別的,右邊的1000意思是訓練次數上限為1000次,超過1000次自動停止。
- time:訓練的時間。圖中顯示本次訓練時間為1S
- validation checks:與performance和gradient同為停止條件之一。意思是若連續幾次訓練
performance和gradient的效果不再提高則視為訓練完成。但是通過performance和gradient停止意味著該神經網路達到了我們的預期,而通過validation checks停止則意味著該神經網路沒有達到了我們的預期。
對於plots,較有參考價值的為後三個。
誤差直方圖(error Histogram):如下圖所示,絕大部分誤差在(-0.0348,0.0363)之間。
混淆矩陣(confusion matrix):可視為一個表格。具體可參考百度百科:混淆矩陣_百度百科
ROC曲線:與混淆矩陣相同,也用來表徵該神經網路的效果。具體可參考我之前寫的一篇文章:ROC曲線簡介 - 知乎專欄
回到nprtool,此時有兩種選擇。
對神經網路的效果不滿意,可以選擇retrain。理論上,由於初值不同,每一次訓練效果都不一樣,但是筆者嘗試幾次發現並無大的區別。選擇next,可進行下一步。
對神經網路不滿意,可以選擇重新訓練(train again),調整隱藏層神經元數目(adjust network size)和導入更多數據。特別的,隱藏層(hidden layer)的神經元數量的選取沒有一定的準則。數量過少會使得擬合效果不好(模式分類不夠準確),數量過多有可能出現過擬合狀態(對於其他數據的識別能力較差)。點擊next
此時我們可以選擇生成MATLAB函數或者可視化神經網路。生成MATLAB函數的話,你就可以利用剛剛訓練的網路來解決你自己的問題啦。當然,你的問題和你之前導入的訓練數據一定要是同一個問題。就像你不能拿用病人看病的數據訓練出來的網路來進行芒果是否好吃的判斷。
點擊finish,關閉這個嚮導。
洋洋洒洒寫了這麼多,其實就是MATLAB神經網路工具箱的一個註解,希望能夠對你有多幫助。當然筆者水平有限,寫都不對的地方還是希望你能夠私信給我,大家共同學習。
推薦閱讀:
※MATLAB Graph Object(2): 建立關係網
※打開MATLAB時出現「Waring:could not read file classpath.txt」,怎麼辦?
※matlab中有哪些有趣的命令?
※MATLAB 的符號計算原理是什麼,為什麼不能編譯為 C?