曹建立 賴宏慧 徐世杰
摘要:該文從幾何的視角來看待感知機和神經(jīng)網(wǎng)絡(luò),采用兩個簡單、便于演示的例子來解釋感知機和BP神經(jīng)網(wǎng)絡(luò)的分類功能,并結(jié)合Python動畫演示其權(quán)值、偏置值在訓(xùn)練中逐步收斂的過程。本文介紹的方法在教學(xué)實踐中收到了較好的效果,可以幫助學(xué)生對感知機和BP神經(jīng)網(wǎng)絡(luò)產(chǎn)生感性認(rèn)識。
關(guān)鍵詞:Python;可視化;感知機;BP神經(jīng)網(wǎng)絡(luò);教學(xué)實踐
中圖分類號:TP393 文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2018)19-0178-03
Abstract: In this paper, we perceive the perceptron and BP neural network from a geometric perspective. We explain the classification function of perceptron and neural network with two examples that simple and easy to visualize. We also use python animation to demonstrate how the weights and biases converge gradually. The method introduced in this paper has good effect in the teaching practice, and can help students to build perceptual knowledge of the perceptron and the BP neural network.
Key words: Python; visualization; perseptron; BP neural network;teaching practice
深度學(xué)習(xí)在圖像、語音、自然語言識別,文本分類等方面展現(xiàn)出強大的功能,而深度學(xué)習(xí)的基礎(chǔ)是神經(jīng)網(wǎng)絡(luò)。神經(jīng)網(wǎng)絡(luò)的原理和訓(xùn)練方法在教學(xué)中向來是難點、重點。學(xué)生在學(xué)習(xí)中往往感覺抽象、不易理解掌握。傳統(tǒng)的教學(xué)中往往著重對原理進(jìn)行闡述,對權(quán)值更新公式進(jìn)行推導(dǎo)。這種圍繞原理和公式為中心的教學(xué)方式不夠直觀,難以讓學(xué)生對網(wǎng)絡(luò)的運行過程產(chǎn)生感性的認(rèn)識。
本文提出的教法圍繞兩個易于可視化的案例來展開教學(xué)。這兩個案例基于二維向量,易于用Python語言實現(xiàn),可以用動畫方式來展示神經(jīng)網(wǎng)絡(luò)的訓(xùn)練、收斂過程,能方便地修改初始參數(shù),讓學(xué)生觀察不同的初始化數(shù)據(jù)對網(wǎng)絡(luò)訓(xùn)練產(chǎn)生的影響。相比傳統(tǒng)教學(xué)方式,有直觀、靈活性強的優(yōu)點。在教學(xué)實踐中,收到了較好的效果。
1 Python和matplotlib庫介紹
作為一種語法簡練的動態(tài)語言,Python[1]非常適合初學(xué)編程者,可以讓初學(xué)者把精力集中在編程對象和算法實現(xiàn)上,而不被復(fù)雜的語法、變量類型等細(xì)節(jié)因素干擾思維。Python作為一種腳本語言,非常適合開發(fā)小應(yīng)用,尤其是在課堂教學(xué)中用來演示軟件模型的結(jié)構(gòu)和功能。
當(dāng)然,Python也有著運行效率低的缺點。由于是動態(tài)語言,還是解釋型,所以運行速度比半編譯半解釋的Java還慢,更不必說以性能見長的C/C++了。其運行時需要占用更多的內(nèi)存、處理器資源。但對于當(dāng)前PC機動輒4G、8G,服務(wù)器100多G的內(nèi)存,以及雙核、四核甚至32核的處理器來講,用這點性能損失換取高度的可讀性、靈活性和擴展性是非常值得的。
基于Python語言的上述優(yōu)點,目前有大量的深度學(xué)習(xí)框架基于Python語言進(jìn)行開發(fā)。例如最早的深度學(xué)習(xí)框架Theano[2]就是基于Python語言開發(fā)的。谷歌公司的開源框架TensorFlow[3]支持Python和C++。圖像、視頻處理方面的優(yōu)秀深度學(xué)習(xí)框架Caffe[4]也提供Python接口。在Python學(xué)習(xí)熱潮的影響下,F(xiàn)acebook公司將原本用Lua語言開發(fā)的深度學(xué)習(xí)框架Torch[5],用Python語言實現(xiàn),推出了PyTorch。Python的深度學(xué)習(xí)模塊scikit-learn提供了幾乎所有的機器學(xué)習(xí)主流算法。因此,采用Python作為神經(jīng)網(wǎng)絡(luò)教學(xué)語言,不但能在學(xué)習(xí)中獲得豐富的支持,也能讓學(xué)生接觸技術(shù)市場中的主流技術(shù),減少學(xué)習(xí)成本。
Python中的matplotlib庫中包含豐富的繪圖函數(shù)模塊,pyplot模塊中的subplot()函數(shù)可以將感知機和神經(jīng)網(wǎng)絡(luò)權(quán)值、偏置值變化過程用一系列的子圖繪制出來,加深學(xué)生對訓(xùn)練過程的理解。animation模塊則提供了動畫功能,通過實現(xiàn)init()、animate()函數(shù)和調(diào)用FuncAnimation()函數(shù),可以進(jìn)一步把感知機和神經(jīng)網(wǎng)絡(luò)權(quán)值、偏置值變化過程以更直觀的動畫的方式演示出來,給學(xué)生更加直觀的感受。
2 感知機的可視化教學(xué)
如圖2-1,符號"x"表示分類為-1的元素,符號"+"表示分類為1的元素。如果感知機的參數(shù)正確,則標(biāo)"x"的點應(yīng)位于直線下方,標(biāo)"+"的點應(yīng)位于直線上方。很明顯,當(dāng)前直線不能正確的將兩類點分開,存在3個誤分類點。圖2-2中,算法選擇錯誤分類點(-1,0)來更新權(quán)值和偏置值(每次選中的錯誤分類點在圖2中用菱形標(biāo)出),使直線移動到了點(-1,0)的上方,該點成為正確分類點。這次更新也讓直線越過了點(0,0),使其成為正確分類點,只留下了點(2,0)尚未正確分類。圖2-3中,算法使用唯一的一個錯誤分類點(2,0)來更新權(quán)值和偏置值,將直線向(2,0)移動,但這次更新移動距離較小,并未讓直線越過該點,該點還是錯誤分類點。圖2-4中,算法繼續(xù)使用點(2,0)來更新權(quán)值和偏置值,直線繼續(xù)向點(2,0)的方向移動,并成功越過該點。此時得到的感知機參數(shù)對7個訓(xùn)練數(shù)據(jù)完成了分類工作。
對于三維數(shù)據(jù),可以用三維圖形來演示。對于三維以上的數(shù)據(jù),目前無法用圖形方式直接表示。但對學(xué)生而言,只要徹底理解了二維和三維的感知機算法,更高緯度的算法僅僅是增加了維度,屬于量變,其原理本質(zhì)上是相同的。
3 BP神經(jīng)網(wǎng)絡(luò)的可視化教學(xué)
為了便于學(xué)生理解,教學(xué)中可以采用最簡單的兩層網(wǎng)絡(luò)來做演示,選擇經(jīng)典的異或問題來訓(xùn)練網(wǎng)絡(luò)。異或運算Z=X⊕Y,即不帶進(jìn)位的二進(jìn)制加法,真值表如下:
將輸入X、Y作為坐標(biāo),將Z作為分類號的話,則這四個點無法通過一條直線將其分為兩類,即非線性可分。該問題單層的感知機無法處理,需要用兩層神經(jīng)網(wǎng)絡(luò)來解決。
神經(jīng)網(wǎng)絡(luò)的構(gòu)造如圖所示:
圖4-1是原始輸入對應(yīng)的四個點,這四個點是線性不可分的;隨機初始化的輸出層權(quán)值、偏置值確定的直線無法將其正確分類。圖4-2中,四個輸入點經(jīng)過了隱藏層的處理,映射到了新的位置,因為隨機初始化權(quán)值和偏置值都是接近0的量,所以隱藏層兩個節(jié)點計算求和的值也接近0,而sigmoid(0)的值是0.5,表現(xiàn)在圖4-2中就是經(jīng)過隱藏層處理后的新位置都在點(0.5,0.5)附近。隨著算法繼續(xù)進(jìn)行,新的權(quán)值和偏置值對原位置的改變越來越大,直到圖4-6,變換后的四個點變得線性可分,而此時輸出層權(quán)值和偏置值確定的直線也調(diào)整到了合適的位置,將這四個點成功分為兩類。
通過動畫序列可以直觀地看出:兩層的神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)算法中,原始的4個輸入點在中間層權(quán)值矩陣和偏置向量的作用下,每個輸入點被映射到了新的位置,使得原本線性不可分的兩組點,變得線性可分。而隱藏層只有一個節(jié)點,本質(zhì)上就是一個感知機,其權(quán)值和偏置值確定的直線可以將映射變換后線性可分的四個點正確的劃分為兩類。通過動畫演示過程,學(xué)生可以加深對BP神經(jīng)網(wǎng)絡(luò)的理解。
4 結(jié)束語
感知機和神經(jīng)網(wǎng)絡(luò)是在計算機和相關(guān)專業(yè)中的重要課程,其原理抽象、和數(shù)學(xué)結(jié)合緊密。隨之而來的是教學(xué)中難度大,學(xué)生不易理解、不易掌握。本文以數(shù)形結(jié)合、動畫演示的方式來講解感知機和神經(jīng)網(wǎng)絡(luò)的原理和訓(xùn)練過程,為該課程的教學(xué)方法做出了一點探索。文中所使用的代碼和gif動態(tài)圖片,可以通過baidu網(wǎng)盤https://pan.baidu.com/s/1brlQ0Jd下載。
由于可視化在教學(xué)方面的巨大優(yōu)勢,Google深度學(xué)習(xí)部門Google Brain的資深工程師Jeff Dean開發(fā)了神經(jīng)網(wǎng)絡(luò)的可視化工具:Tensorflow游樂場(網(wǎng)址http://playground.tensorflow.org),該工具提供了四種形態(tài)的待分類數(shù)據(jù),通過網(wǎng)頁的形式和用戶交互,能靈活的調(diào)整網(wǎng)絡(luò)結(jié)構(gòu)、網(wǎng)絡(luò)參數(shù)和數(shù)據(jù)特征。對于希望做進(jìn)一步學(xué)習(xí)的學(xué)生,可以利用該可視化工具來研究其他形態(tài)數(shù)據(jù)在神經(jīng)網(wǎng)絡(luò)中訓(xùn)練的情況。
參考文獻(xiàn):
[1] Chun W. Core Python Programming[J].Prentice Hall Ptr Core.2006.
[2] Team T T D,Al-Rfou R, Alain G, et al. Theano: A Python framework for fast computation of mathematical expressions[J]. ArXiv e-prints.2016.
[3] Abadi M, Agarwal A, Barham P, et al. TensorFlow: Large-Scale Machine Learning on Heterogeneous Distributed Systems[J]. 2016.
[4] Jia, Yangqing, Shelhamer, et al. Caffe: Convolutional Architecture for Fast Feature Embedding[J]. 2014: 675-678.
[5] Collobert R, Bengio S, Marithoz J. Torch: A Modular Machine Learning Software Library[J]. Idiap. 2002.
[6] Rosenblatt. The perception: a probabilistic model for information storage and organization in the brain[J]. Psychological Review. 1958, 65(6): 386.
[7] 焦李成. 神經(jīng)網(wǎng)絡(luò)系統(tǒng)理論[M]. 西北工業(yè)大學(xué)出版社, 1990.