曹建立 賴宏慧 徐世杰
摘要:該文從幾何的視角來看待感知機(jī)和神經(jīng)網(wǎng)絡(luò),采用兩個(gè)簡(jiǎn)單、便于演示的例子來解釋感知機(jī)和BP神經(jīng)網(wǎng)絡(luò)的分類功能,并結(jié)合Python動(dòng)畫演示其權(quán)值、偏置值在訓(xùn)練中逐步收斂的過程。本文介紹的方法在教學(xué)實(shí)踐中收到了較好的效果,可以幫助學(xué)生對(duì)感知機(jī)和BP神經(jīng)網(wǎng)絡(luò)產(chǎn)生感性認(rèn)識(shí)。
關(guān)鍵詞:Python;可視化;感知機(jī);BP神經(jīng)網(wǎng)絡(luò);教學(xué)實(shí)踐
中圖分類號(hào):TP393 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):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í)在圖像、語音、自然語言識(shí)別,文本分類等方面展現(xiàn)出強(qiáng)大的功能,而深度學(xué)習(xí)的基礎(chǔ)是神經(jīng)網(wǎng)絡(luò)。神經(jīng)網(wǎng)絡(luò)的原理和訓(xùn)練方法在教學(xué)中向來是難點(diǎn)、重點(diǎn)。學(xué)生在學(xué)習(xí)中往往感覺抽象、不易理解掌握。傳統(tǒng)的教學(xué)中往往著重對(duì)原理進(jìn)行闡述,對(duì)權(quán)值更新公式進(jìn)行推導(dǎo)。這種圍繞原理和公式為中心的教學(xué)方式不夠直觀,難以讓學(xué)生對(duì)網(wǎng)絡(luò)的運(yùn)行過程產(chǎn)生感性的認(rèn)識(shí)。
本文提出的教法圍繞兩個(gè)易于可視化的案例來展開教學(xué)。這兩個(gè)案例基于二維向量,易于用Python語言實(shí)現(xiàn),可以用動(dòng)畫方式來展示神經(jīng)網(wǎng)絡(luò)的訓(xùn)練、收斂過程,能方便地修改初始參數(shù),讓學(xué)生觀察不同的初始化數(shù)據(jù)對(duì)網(wǎng)絡(luò)訓(xùn)練產(chǎn)生的影響。相比傳統(tǒng)教學(xué)方式,有直觀、靈活性強(qiáng)的優(yōu)點(diǎn)。在教學(xué)實(shí)踐中,收到了較好的效果。
1 Python和matplotlib庫介紹
作為一種語法簡(jiǎn)練的動(dòng)態(tài)語言,Python[1]非常適合初學(xué)編程者,可以讓初學(xué)者把精力集中在編程對(duì)象和算法實(shí)現(xiàn)上,而不被復(fù)雜的語法、變量類型等細(xì)節(jié)因素干擾思維。Python作為一種腳本語言,非常適合開發(fā)小應(yīng)用,尤其是在課堂教學(xué)中用來演示軟件模型的結(jié)構(gòu)和功能。
當(dāng)然,Python也有著運(yùn)行效率低的缺點(diǎn)。由于是動(dòng)態(tài)語言,還是解釋型,所以運(yùn)行速度比半編譯半解釋的Java還慢,更不必說以性能見長的C/C++了。其運(yùn)行時(shí)需要占用更多的內(nèi)存、處理器資源。但對(duì)于當(dāng)前PC機(jī)動(dòng)輒4G、8G,服務(wù)器100多G的內(nèi)存,以及雙核、四核甚至32核的處理器來講,用這點(diǎn)性能損失換取高度的可讀性、靈活性和擴(kuò)展性是非常值得的。
基于Python語言的上述優(yōu)點(diǎn),目前有大量的深度學(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語言實(shí)現(xiàn),推出了PyTorch。Python的深度學(xué)習(xí)模塊scikit-learn提供了幾乎所有的機(jī)器學(xué)習(xí)主流算法。因此,采用Python作為神經(jīng)網(wǎng)絡(luò)教學(xué)語言,不但能在學(xué)習(xí)中獲得豐富的支持,也能讓學(xué)生接觸技術(shù)市場(chǎng)中的主流技術(shù),減少學(xué)習(xí)成本。
Python中的matplotlib庫中包含豐富的繪圖函數(shù)模塊,pyplot模塊中的subplot()函數(shù)可以將感知機(jī)和神經(jīng)網(wǎng)絡(luò)權(quán)值、偏置值變化過程用一系列的子圖繪制出來,加深學(xué)生對(duì)訓(xùn)練過程的理解。animation模塊則提供了動(dòng)畫功能,通過實(shí)現(xiàn)init()、animate()函數(shù)和調(diào)用FuncAnimation()函數(shù),可以進(jìn)一步把感知機(jī)和神經(jīng)網(wǎng)絡(luò)權(quán)值、偏置值變化過程以更直觀的動(dòng)畫的方式演示出來,給學(xué)生更加直觀的感受。
2 感知機(jī)的可視化教學(xué)
如圖2-1,符號(hào)"x"表示分類為-1的元素,符號(hào)"+"表示分類為1的元素。如果感知機(jī)的參數(shù)正確,則標(biāo)"x"的點(diǎn)應(yīng)位于直線下方,標(biāo)"+"的點(diǎn)應(yīng)位于直線上方。很明顯,當(dāng)前直線不能正確的將兩類點(diǎn)分開,存在3個(gè)誤分類點(diǎn)。圖2-2中,算法選擇錯(cuò)誤分類點(diǎn)(-1,0)來更新權(quán)值和偏置值(每次選中的錯(cuò)誤分類點(diǎn)在圖2中用菱形標(biāo)出),使直線移動(dòng)到了點(diǎn)(-1,0)的上方,該點(diǎn)成為正確分類點(diǎn)。這次更新也讓直線越過了點(diǎn)(0,0),使其成為正確分類點(diǎn),只留下了點(diǎn)(2,0)尚未正確分類。圖2-3中,算法使用唯一的一個(gè)錯(cuò)誤分類點(diǎn)(2,0)來更新權(quán)值和偏置值,將直線向(2,0)移動(dòng),但這次更新移動(dòng)距離較小,并未讓直線越過該點(diǎn),該點(diǎn)還是錯(cuò)誤分類點(diǎn)。圖2-4中,算法繼續(xù)使用點(diǎn)(2,0)來更新權(quán)值和偏置值,直線繼續(xù)向點(diǎn)(2,0)的方向移動(dòng),并成功越過該點(diǎn)。此時(shí)得到的感知機(jī)參數(shù)對(duì)7個(gè)訓(xùn)練數(shù)據(jù)完成了分類工作。
對(duì)于三維數(shù)據(jù),可以用三維圖形來演示。對(duì)于三維以上的數(shù)據(jù),目前無法用圖形方式直接表示。但對(duì)學(xué)生而言,只要徹底理解了二維和三維的感知機(jī)算法,更高緯度的算法僅僅是增加了維度,屬于量變,其原理本質(zhì)上是相同的。
3 BP神經(jīng)網(wǎng)絡(luò)的可視化教學(xué)
為了便于學(xué)生理解,教學(xué)中可以采用最簡(jiǎn)單的兩層網(wǎng)絡(luò)來做演示,選擇經(jīng)典的異或問題來訓(xùn)練網(wǎng)絡(luò)。異或運(yùn)算Z=X⊕Y,即不帶進(jìn)位的二進(jìn)制加法,真值表如下:
將輸入X、Y作為坐標(biāo),將Z作為分類號(hào)的話,則這四個(gè)點(diǎn)無法通過一條直線將其分為兩類,即非線性可分。該問題單層的感知機(jī)無法處理,需要用兩層神經(jīng)網(wǎng)絡(luò)來解決。
神經(jīng)網(wǎng)絡(luò)的構(gòu)造如圖所示:
圖4-1是原始輸入對(duì)應(yīng)的四個(gè)點(diǎn),這四個(gè)點(diǎn)是線性不可分的;隨機(jī)初始化的輸出層權(quán)值、偏置值確定的直線無法將其正確分類。圖4-2中,四個(gè)輸入點(diǎn)經(jīng)過了隱藏層的處理,映射到了新的位置,因?yàn)殡S機(jī)初始化權(quán)值和偏置值都是接近0的量,所以隱藏層兩個(gè)節(jié)點(diǎn)計(jì)算求和的值也接近0,而sigmoid(0)的值是0.5,表現(xiàn)在圖4-2中就是經(jīng)過隱藏層處理后的新位置都在點(diǎn)(0.5,0.5)附近。隨著算法繼續(xù)進(jìn)行,新的權(quán)值和偏置值對(duì)原位置的改變?cè)絹碓酱螅钡綀D4-6,變換后的四個(gè)點(diǎn)變得線性可分,而此時(shí)輸出層權(quán)值和偏置值確定的直線也調(diào)整到了合適的位置,將這四個(gè)點(diǎn)成功分為兩類。
通過動(dòng)畫序列可以直觀地看出:兩層的神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)算法中,原始的4個(gè)輸入點(diǎn)在中間層權(quán)值矩陣和偏置向量的作用下,每個(gè)輸入點(diǎn)被映射到了新的位置,使得原本線性不可分的兩組點(diǎn),變得線性可分。而隱藏層只有一個(gè)節(jié)點(diǎn),本質(zhì)上就是一個(gè)感知機(jī),其權(quán)值和偏置值確定的直線可以將映射變換后線性可分的四個(gè)點(diǎn)正確的劃分為兩類。通過動(dòng)畫演示過程,學(xué)生可以加深對(duì)BP神經(jīng)網(wǎng)絡(luò)的理解。
4 結(jié)束語
感知機(jī)和神經(jīng)網(wǎng)絡(luò)是在計(jì)算機(jī)和相關(guān)專業(yè)中的重要課程,其原理抽象、和數(shù)學(xué)結(jié)合緊密。隨之而來的是教學(xué)中難度大,學(xué)生不易理解、不易掌握。本文以數(shù)形結(jié)合、動(dòng)畫演示的方式來講解感知機(jī)和神經(jīng)網(wǎng)絡(luò)的原理和訓(xùn)練過程,為該課程的教學(xué)方法做出了一點(diǎn)探索。文中所使用的代碼和gif動(dòng)態(tài)圖片,可以通過baidu網(wǎng)盤https://pan.baidu.com/s/1brlQ0Jd下載。
由于可視化在教學(xué)方面的巨大優(yōu)勢(shì),Google深度學(xué)習(xí)部門Google Brain的資深工程師Jeff Dean開發(fā)了神經(jīng)網(wǎng)絡(luò)的可視化工具:Tensorflow游樂場(chǎng)(網(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ù)特征。對(duì)于希望做進(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.