[Python人工智慧] 四.神經網路和深度學習入門知識

Eastmount發表於2018-05-31

從本篇文章開始,作者正式開始研究Python深度學習、神經網路及人工智慧相關知識。前三篇文章講解了神經網路基礎概念、Theano庫的安裝過程及基礎用法、theano實現迴歸神經網路、theano實現分類神經網路,這篇文章又回到基礎知識,結合莫煩大神的視訊學習,講解機器學習基礎知識、神經網路基礎、CNN、RNN、LSTM RNN、GAN等知識,主要是學習"莫煩大神" 網易雲視訊的線上筆記,後面隨著深入會講解具體的專案及應用。基礎性文章和線上筆記,希望對您有所幫助,也建議大家一步步跟著學習,同時文章中存在錯誤或不足之處,還請海涵~

"莫煩大神" 網易雲視訊地址:http://study.163.com/provider/1111519/course.html

同時推薦前面作者另外三個Python系列文章。

從2014年開始,作者主要寫了三個Python系列文章,分別是基礎知識、網路爬蟲和資料分析。

這裡寫圖片描述 這裡寫圖片描述 這裡寫圖片描述

前文參考:
[Python人工智慧] 一.神經網路入門及theano基礎程式碼講解
[Python人工智慧] 二.theano實現迴歸神經網路分析
[Python人工智慧] 三.theano實現分類神經網路及機器學習基礎


目錄:
一.機器學習
二.神經網路
三.卷積神經網路
四.迴圈神經網路
五.LSTM RNN
六.自編碼
七.GAN



一.機器學習

首先第一部分也是莫煩老師的線上學習筆記,個人感覺挺好的基礎知識,推薦給大家學習。對機器學習進行分類,包括:
    1.監督學習:通過資料和標籤進行學習,比如從海量圖片中學習模型來判斷是狗還是貓,包括分類、迴歸、神經網路等演算法;


    2.無監督學習:只有資料沒有類標,根據資料特徵的相似性形成規律,比如不知道類標的情況進行分類貓或狗,常見的聚類演算法(物以類聚);


    3.半監督學習:綜合了監督學習和無監督學習,通過少量有標籤樣本和大量沒有標籤樣本進行訓練和分類,有效提升了兩者效果;
    4.強化學習:常用於規劃機器人行為準則,把計算機置於陌生環境去完成一項未知任務,比如投籃,它會自己總結失敗經驗和投籃命中的經驗,進而懲罰或獎勵機器人從而提升命中率,比如阿爾法狗;


    5.遺傳演算法:和強化學習類似,通過淘汰機制去選擇最優模型,比如自己玩超級馬里奧,淘汰前面幾代差的,基於強者的"遺傳和變異",適者生存,弱者淘汰的原理。



二.神經網路

神經網路也稱為人工神經網路ANN(Artifical Neural Network),是80年代非常流行的機器學習演算法,在90年代衰退,現在隨著"深度學習"和"人工智慧"之勢重新歸來,成為最強大的機器學習演算法之一。

神經網路是模擬生物神經網路結構和功能的計算模型,由很多神經層組成,每一層存在著很多神經元,這些神經元是識別事物的關鍵。神經網路通過這些神經元進行計算學習,每個神經元有相關的激勵函式(sigmoid、Softmax、tanh等),包括輸入層、隱藏層(可多層或無)和輸出層,當神經元計算結果大於某個閾值時會產生積極作用(輸出1),相反產生抑制作用(輸出0),常見的型別包括迴歸神經網路(畫線擬合一堆散點)和分類神經網路(影象識別分類)。

如下圖所示,它表示的是一個人工神經細胞。其中: 輸入(Inputs):神經細胞的輸入;權重(Weight):左邊五個灰色圓底字母w代表浮點數;激勵函式(Activation Function):大圓,所有經過權重調整後的輸入加起來,形成單個的激勵值;輸出(Output):神經細胞的輸出。



進入人工神經細胞的每一個input(輸入)都與一個權重w相聯絡,正是這些權重將決定神經網路的整體活躍性。假設權重為-1和1之間的一個隨機數,權重可正可負(激發和抑制作用)。當輸入訊號進入神經細胞時,它們的值將與它們對應的權重相乘,作為圖中大圓的輸入。如果激勵值超過某個閥值(假設閥值為1.0),就會產生一個值為1的訊號輸出;如果激勵值小於閥值1.0,則輸出一個0。這是人工神經細胞激勵函式的一種最簡單的型別。涉及的數學知識如下圖所示:



如果最後計算的結果激勵值大於閾值1.0,則神經細胞就輸出1;如果激勵值小於閾值則輸出0。這和一個生物神經細胞的興奮狀態或抑制狀態是等價的。

再如下面的示例,通過海量圖片學習來判斷一張圖片是狗還是貓,通過提取圖片特徵轉換為數學形式來判斷,如果判斷是狗則會反向傳遞這些錯誤資訊(預測值與真實值差值)回神經網路,並修改神經元權重,通過反覆學習來優化識別。

下面簡單講解"莫煩大神"網易雲課程的一個示例。假設存在千萬張圖片,現在需要通過神經網路識別出某一張圖片是狗還是貓,如下圖所示共包括輸入層、隱藏層(3層)和輸出層。




計算機通過訓練或強化學習判斷貓,將獲取的特徵轉換為數學的形式。首先得到一堆數字,通過判斷處理得到另一堆資料,最終判斷其是狗還是貓。比如第一次正確識別的只有10%,下面那隻貓被識別成了狗,它會將識別錯誤的資訊(與真實答案的差別)反向傳遞迴神經網路,並修改神經元權重,為下次更好地識別。



每一個神經元都有一個激勵函式,被激勵的神經元傳遞的資訊最有價值,它也決定最後的輸出結果,經過海量資料的訓練,最終神經網路將可以用於識別貓或狗。


三. 卷積神經網路

卷積神經網路英文是Convolutional Neural Network,簡稱CNN。它通常應用於圖片識別和語音識等領域,並能給出更優秀的結果,也可以應用於視訊分析、機器翻譯、自然語言處理、藥物發現等領域。著名的阿爾法狗讓計算機看懂圍棋就是基於卷積神經網路的。

神經網路是由很多神經層組成,每一層神經層中存在很多神經元,這些神經元是識別事物的關鍵,當輸入是圖片時,其實就是一堆數字。




首先,卷積是什麼意思呢?卷積是指不在對每個畫素做處理,而是對圖片區域進行處理,這種做法加強了圖片的連續性,看到的是一個圖形而不是一個點,也加深了神經網路對圖片的理解。



卷積神經網路批量過濾器,持續不斷在圖片上滾動蒐集資訊,每一次搜尋都是一小塊資訊,整理這一小塊資訊之後得到邊緣資訊。比如第一次得出眼睛鼻子輪廓等,再經過一次過濾,將臉部資訊總結出來,再將這些資訊放到全神經網路中進行訓練,反覆掃描最終得出的分類結果。如下圖所示,貓的一張照片需要轉換為數學的形式,這裡採用長寬高儲存,其中黑白照片的高度為1,彩色照片的高度為3(RGB)。



過濾器蒐集這些資訊,將得到一個更小的圖片,再經過壓縮增高資訊嵌入到普通神經層上,最終得到分類的結果,這個過程即是卷積。如下圖所示,它將一張RGB圖片進行壓縮增高,得到一個很長的結果。


研究發現:卷積過程會丟失一些資訊,POOLING(持化2)能解決這些問題,卷積時不壓縮長寬,儘量保證更多資訊,壓縮工作交給持化。經過圖片到卷積,持化處理卷積資訊,再卷積再持化,將結果傳入兩層全連線神經層,最終通過分類器識別貓或狗。

如下圖所示,從下往上依次經歷“圖片-卷積-持化(處理卷積資訊)-卷積-持化-結果傳入兩層全連線神經層-分類器”的過程。




四. 迴圈神經網路

迴圈神經網路英文是Recurrent Neural Networks,簡稱RNN。假設有一組資料data0、data1、data2、data3,使用同一個NN(神經網路)預測他們,得到對應的結果。如果資料之間是有關係的,比如做菜下料的前後步驟,如何讓資料之間的關聯也被神經網路進行分析呢?這就要用到了RNN。


首先,想想人類是怎麼分析事物之間的關聯吧,人類通常記住之前發生的事情,從而幫助我們後續的行為判斷,那麼我們就讓計算機也記住之前發生的事情吧。



在分析data0時,我們把分析結果存入記憶,然後當分析data1時,NN會產生新的記憶,但是此時新的記憶和老的記憶沒有關聯,我們會簡單的把老記憶呼叫過來分析新的記憶,如果繼續分析更多的資料,NN就會把之前的記憶累積起來。


數學形式中,每次RNN執行完之後都會產生S(t),RNN分析X(t+1),而此時Y(t+1)是由S(t)和S(t+1)共同創造的,繼續累加。多個NN的累積就轉換為了迴圈神經網路,如下圖的右邊所示。



最後講講RNN的應用。分類,分析一個人說話情感是積極的還是消極的?它有N個輸入,最後一個時間點代表輸出結果的RNN。



影象識別,此時有一張圖片輸入,N張對應的輸出。



機器翻譯,其中輸入和輸出分別兩個,對應的是中文和英文,如下圖所示:





五.LSTM RNN


RNN是在有序的資料上進行學習的,RNN會像人一樣對先前的資料發生記憶,但有時候也會像老爺爺一樣忘記先前所說。為了解決RNN的這個弊端,提出了LTSM技術,它的英文全稱是Long short-term memory,長短期記憶,也是當下最流行的RNN之一。


假設現在有一句話,如下圖所示,RNN判斷這句話是紅燒排骨,這時需要學習,而“紅燒排骨“在句子開頭。

  


"紅燒排骨"這個詞需要經過長途跋涉才能抵達,要經過一系列得到誤差,然後經過反向傳遞,它在每一步都會乘以一個權重w引數。如果乘以的權重是小於1的數,比如0.9,0.9會不斷地乘以誤差,最終這個值傳遞到初始值時,誤差就消失了,這稱為梯度消失或梯度離散。


  
反之,如果誤差是一個很大的數,比如1.1,則這個RNN得到的值會很大,這稱為梯度爆炸。


這也是RNN沒有恢復記憶的原因,LSTM就是解決這個問題而產生的。如下圖所示:


LSTM RNN多了三個控制器,即輸入、輸出、忘記控制器。左邊多了個條主線,例如電影的主線劇情,而原本的RNN體系變成了分線劇情,並且三個控制器都在分線上。

如果分線劇情對於最終結果十分重要,輸入控制器會將這個分線劇情按重要程度寫入主線劇情,再進行分析;如果分線劇情改變了我們之前的想法,那麼忘記控制器會將某些主線劇情忘記,然後按比例替換新劇情,所以主線劇情的更新就取決於輸入和忘記控制;最後的輸出會基於主線劇情和分線劇情。

基於這些控制的機制,LSTM是延緩記憶的良藥,從而帶來更好的結果。



六.自編碼

首先,什麼是自編碼(Autoencoder)?自編碼是一種神經網路的形式,注意它是無監督學習演算法。例如現在有一張圖片,需要給它打碼,然後又還原圖片的過程,如下圖所示:



一張圖片經過壓縮再解壓的工序,當壓縮時原有的圖片質量被縮減,當解壓時用資訊量小卻包含所有關鍵性檔案恢復出原來的圖片。為什麼要這麼做呢?有時神經網路需要輸入大量的資訊,比如分析高清圖片時,輸入量會上千萬,神經網路向上千萬中學習是非常難的一個工作,此時需要進行壓縮,提取原圖片中具有代表性的資訊,壓縮輸入的資訊量,再把壓縮的資訊放入神經網路中學習。這樣學習就變得輕鬆了,所以自編碼就在這個時候發揮作用。


如下圖所示,將原資料白色的X壓縮解壓成黑色的X,然後通過對比兩個X,求出誤差,再進行反向的傳遞,逐步提升自編碼的準確性。


訓練好的自編碼,中間那部分就是原資料的精髓,從頭到尾我們只用到了輸入變數X,並沒有用到輸入變數對應的標籤,所以自編碼是一種無監督學習演算法。


但是真正使用自編碼時,通常只用到它的前半部分,叫做編碼器,能得到原資料的精髓。然後只需要建立小的神經網路進行訓練,不僅減小了神經網路的負擔,而且同樣能達到很好的效果。

下圖是自編碼整理出來的資料,它能總結出每類資料的特徵,如果把這些資料放在一張二維圖片上,每一種資料都能很好的用其精髓把原資料區分開來。自編碼能類似於PCA(主成分分析)一樣提取資料特徵,也能用來降維,其降維效果甚至超越了PCA。


PS:強烈推薦大家去網易雲學習莫煩大神的Python視訊。



七.GAN生成對抗網路

神經網路分類很多,有普通的前向傳播神經網路,有分析圖片的CNN卷積神經網路,有分析序列化資料比如語音或文字的RNN迴圈神經網路,這些神經網路都是用來輸入資料,得到想要的結果。我們看中的是這些神經網路通過某種關係輸入和結果聯絡起來。




但還有一種神經網路,不是用來把資料對上結果的,而是用來憑空捏造結果,這就是我們要講的生成網路,GAN(Generative Adversarial Nets)就是其中一種。



憑空並不是沒有意義的盒子,而是有一些隨機數,通過這些沒有意義的隨機數來生成最終有意義的作品,比如蒙娜麗莎畫作。

  
GAN只是其中的一部分,我們可以把它想象成一個新手畫家,他有靈感但繪畫技術不高,會把畫畫得很糟糕。然後他去找了自己的一個好朋友,新手鑑賞家,但新手鑑賞家也沒有什麼能耐,分不出所以。此時電腦前的你實在看不下去了,拿起兩個標籤往電腦上一甩,被甩了很多次之後,也就劃分好了。

  
重要的是兩人是好朋友,總在一起分享東西,然後新手鑑賞家告訴畫家,你畫得太差了,應該這裡要濃一點,那裡要淡一點,就這樣新手鑑賞家把從你這裡學到的知識告訴給新手畫家,新手畫家也越畫越像蒙娜麗莎,這就是GAN。


再來屢屢步驟,如下:新手畫家用隨機靈感畫畫,新手鑑賞家會接收一些畫作,但他不知道這是新手畫家畫的還是達芬奇畫的,他說出了自己的判斷,你來糾正他的判斷。新手鑑賞家一邊說出自己的判斷,一邊告訴新手畫家要怎麼修改才能畫得像著名畫家,新手畫家從而學會如何從自己的靈感畫更好的畫作。

  
Generative會根據隨機數來生成有意義的資料,Discirminator會學習判斷哪些是真實資料,哪些是生成資料;然後將學習到的經驗反向傳給Generative,讓Generative根據隨機數訓練出更像真實資料的資料。




最後講講GAN的應用,訓練的GAN可以用來隨機生成臥室圖片,甚至可以做圖片加減法,修飾圖片,也可以根據隨機畫的幾筆草圖生成對應的圖片,如下圖所示。

  

講到這裡,神經網路入門知識已經普及完了,後面作者將結合原理及程式碼實現對應的神經網路,詳見部落格。同時推薦大家學習莫煩大神的視訊,最近自己在瘋狂的學習新知識,做好相關筆記和撰寫程式碼。


一個人如果總是自己說自己厲害,那麼他就已經再走下坡路了,最近很浮躁,少發點朋友圈和說說吧,更需要不忘初心,砥礪前行。珍惜每一段學習時光,也享受公交車的視訊學習之路,加油,最近興起的傲嬌和看重基金之心快離去吧,平常心才是更美,當然娜最美,早安。

(By:Eastmount 2018-05-31 早上10點  http://blog.csdn.net/eastmount/ )

相關文章