1. 程式人生 > 其它 >【MindSpore:跟著小Mi一起機器學習吧!】神經網路表述(一)

【MindSpore:跟著小Mi一起機器學習吧!】神經網路表述(一)

好久不見,甚是想念!今天小Mi繼續帶大家學習我們的機器學習系列。相信神經網路這個名詞大家都不會陌生,神經網路實際上是一個相對比較古老的演算法,沉寂了很長一段時間,不過現在隨著硬體計算能力的提升,它又成為許多機器學習問題解決的首要方法。

好了,到這相信大家不由地會問了,既然已經有線性迴歸、邏輯迴歸演算法了,那麼為什麼還要研究神經網路這個學習演算法呢?為了進一步闡述研究神經網路的目的,小Mi決定帶大家先了解幾個機器學習問題的例子。

1 非線性假設

假設有一個監督學習分類問題,訓練集如上圖所示,如果利用logistic迴歸來解決這個問題,我們可以構造一個包含很多非線性項的logistic迴歸函式,上述的g仍是sigmoid函式,其中可以包含很多像這樣的多項式,當多項式項數足夠多時,那麼可能就能得到可以分開正樣本和負樣本的假設。當只有兩個特徵,比如時,這種方法確實會得到不錯的結果。因為我們可以把的所有組合都包含到多項式中。但是,顯然許多有趣的機器學習問題的特徵遠不止兩項。例如之前已經討論過房價預測的問題,假設一個房子有很多特徵,想要預測房子在未來半年內能被賣出去的概率,這是一個關於住房的分類問題,而不是迴歸問題。對於不同的房子有可能就有上百個特徵,對於這類問題,如果要包含所有的二次項,即使只包含二次多項式,最終也會有很多項。

好了,既然是這樣,那麼假使我們只考慮二次項,也就是說,兩個項的乘積,那麼在n=100的情況下,最終也會有5000個特徵,而且漸漸地,二次項的個數大約以的量級增長,其中,n是原始特徵的個數,即這些項,事實上二次項的個數大約是,因此要包含所有的二次項似乎並不是一個好方法,而且由於項數過多,最後的結果很有可能是過擬合的。此外,在處理這麼多項時,也存在運算量過大的問題,當然,你也可以試試只包含上面這些二次項的子集。例如,我們只考慮這些項,這樣就可以將二次項的數量大幅度減少,減少到只有100個二次項,但是由於忽略了太多相關項,在處理類似上圖的資料集時,不可能得到理想的結果。實際上,如果只包含這一百個二次項,就不能夠擬合出一些特別的假設,比如可能擬合出一個橢圓狀的曲線,但是肯定不能擬合出上圖中這樣複雜的分界線,所以5000個二次項看起來已經很多了,如果現在假設,包括三次項,例如等等,事實上,三次向的個數是的量級,當n=100時,可以計算出來,最後能得到大概17000個三次項。所以,當初始特徵個數n很大時,將這些高階多項式包括到特徵裡,會使特徵空間急劇膨脹,當特徵個數n很大時,增加特徵來建立非線性分類器並不是一個好做法。對於許多實際的機器學習問題,特徵數n是很大的。我們可以看看示例:

關於計算機視覺中的一個問題,假設我們想要使用機器學習演算法來訓練一個分類器檢測影象,判斷影象是否為一輛汽車,很多人可能會好奇,為什麼計算機視覺很難,當我們自己看這幅影象時,這是什麼。一目瞭然。你肯定會好奇,為什麼學習演算法竟可能會不知道影象是什麼。為了解答這個疑問,取出這幅影象中的一小部分,將其放大,比如圖上,這個紅色方框內的部分,當人眼看到一輛汽車時,計算機實際上看到的卻一個數據矩陣,或者說表示畫素強度值的網路,告訴我們影象中,每個畫素的亮度值,因此計算機視覺問題就是,根據這個畫素點亮度矩陣,來告訴我們這些數值代表一個汽車門把手。

具體而言,當我們用機器學習演算法構造一個汽車識別器時,我們要做的就是提供一個帶有標籤的樣本集,其中一些樣本是各類汽車,另一部分樣本不是車,將這個樣本集輸入給學習演算法來訓練出一個分類器。然後我們就進行測試,輸入一副新的圖片,讓分類器判斷這是什麼東西。理想情況下,分類器能識別出這是一輛汽車。為了理解引入非線性假設的必要性,我們從學習演算法的訓練樣本中,找出一些汽車圖片和一些非汽車圖片,從圖片中選擇一組畫素點位,一個是畫素點1的位置,還有一個是畫素點2的位置,在座標系中,標出這副汽車的位置,車的位置取決於畫素點1和畫素點2的強度,讓我們用同樣的方式處理其他圖片。觀察這兩個相同的畫素位置,這幅圖片中畫素1有一個畫素強度,畫素2也有一個不同的畫素強度,所以在這幅圖處於另一個位置,我們繼續畫上兩個非汽車樣本,這兩個不是汽車,接著又繼續在座標系中畫上更多的新樣本,用“+”表示汽車圖片,“-”表示非汽車圖片,我們將發現汽車樣本和非汽車樣本分佈在座標系中的不同區域。因此,我們現在需要一個非線性假設來儘量分開這兩類樣本,這裡的特徵空間的維數是多少?假設我們用50*50畫素的圖片,圖片已經很小了,長款只各有50個畫素,但這依然是2500個畫素點。因此,特徵向量的元素數量n=2500。特徵向量x就是包含了所有畫素強度的列表,包括畫素點1的亮度,畫素點2的亮度等等,直到最後一個畫素點的亮度。來對典型的計算機圖片表示方法,如果儲存的是每個畫素點的灰度值,那麼每個元素的值應該在0-255之間,因此,這個問題中n=2500,但是這只是使用灰度圖片的情況,如果我們用的是RGB彩**像,每個畫素點包含紅、綠、藍三個值,那麼n=7500。因此,如果我們要通過包好所有的二次項特徵來學習得到非線性假設,那麼這就是式子中的所有條件,由於有2500畫素,總共就有約300萬個特徵,這個數字就大得有點離譜了。對於每個樣本都要找到並表示所有這300萬個特徵,這樣的計算成本太高了。因此,只是包括平方項或者立方像特徵,簡單的logistic迴歸演算法,並不是一個在n很大時,學習複雜的非線性假設的好辦法,因為特徵過多。後面將講解神經網路在學習複雜的非線性假設上被證明是一種好得多的演算法,即使輸入特徵空間,或者n很大,也能輕鬆搞定。

2 神經元和大腦

神經網路是一種很古老的演算法,它最初產生的目的是製造能模擬大腦的機器,它能很好地解決不同的機器學習問題,而不只因為它們在邏輯上行得通,不管是將其應用到現代的機器學習問題上,還是應用到那些你可能會感興趣的問題中。從某種意義上說如果我們想要建立學習系統,那為什麼不去模仿我們所認識的最神奇的學習機器——人類的大腦呢?

神經網路逐漸興起於二十世紀八九十年代,應用得非常廣泛。但由於各種原因,在90年代的後期應用減少了。但是最近,神經網路又東山再起了。其中一個原因是:神經網路是計算量有些偏大的演算法。然而大概由於近些年計算機的執行速度變快,才足以真正執行起大規模的神經網路。當你想模擬大腦時,是指想製造出與人類大腦作用效果相同的機器。大腦可以學會去以看而不是聽的方式處理影象,學會處理我們的觸覺。

我們能學習數學,學著做微積分,而且大腦能處理各種不同的令人驚奇的事情。似乎如果你想要模仿它,你得寫很多不同的軟體來模擬所有這些五花八門的奇妙的事情。不過能不能假設大腦做所有這些,不同事情的方法,不需要用上千個不同的程式去實現。相反的,大腦處理的方法,只需要一個單一的學習演算法就可以了?

大腦的這一小片紅**域是你的聽覺皮層,你現在正在理解我的話,這靠的是耳朵。耳朵接收到聲音訊號,並把聲音訊號傳遞給你的聽覺皮層,正因如此,你才能明白我的話。

神經系統科學家做了下面這個有趣的實驗,把耳朵到聽覺皮層的神經切斷。在這種情況下,將其重新接到一個動物的大腦上,這樣從眼睛到視神經的訊號最終將傳到聽覺皮層。如果這樣做了。那麼結果表明聽覺皮層將會學會“看”。這裡的“看”代表了我們所知道的每層含義。所以,如果你對動物這樣做,那麼動物就可以完成視覺辨別任務,它們可以看影象,並根據影象做出適當的決定。它們正是通過腦組織中的這個部分完成的。下面再舉另一個例子,這塊紅色的腦組織是你的軀體感覺皮層,這是你用來處理觸覺的,如果你做一個和剛才類似的重接實驗,那麼軀體感覺皮層也能學會“看”。這個實驗和其它一些類似的實驗,被稱為神經重接實驗,從這個意義上說,如果**有同一塊腦組織可以處理光、聲或觸覺訊號,那麼也許存在一種學習演算法,可以同時處理視覺、聽覺和觸覺,而不是需要執行上千個不同的程式,或者上千個不同的演算法來做這些大腦所完成的成千上萬的美好事情。也許我們需要做的就是找出一些近似的或實際的大腦學習演算法,然後實現它大腦通過自學掌握如何處理這些不同型別的資料。在很大的程度上,可以猜想如果我們把幾乎任何一種感測器接入到大腦的幾乎任何一個部位的話,大腦就會學會處理它。

下面再舉幾個例子:

這張圖是用舌頭學會“看”的一個例子。它的原理是:這實際上是一個名為BrainPort的系統,它現在正在FDA(美國食品和藥物管理局)的臨床試驗階段,它能幫助失明人士看見事物。它的原理是,你在前額上帶一個灰度攝像頭,面朝前,它就能獲取你面前事物的低解析度的灰度影象。你連一根線到舌頭上安裝的電極陣列上,那麼每個畫素都被對映到你舌頭的某個位置上,可能電壓值高的點對應一個暗畫素電壓值低的點。對應於亮畫素,即使依靠它現在的功能,使用這種系統就能讓你我在幾十分鐘裡就學會用我們的舌頭“看”東西。

這是第二個例子,關於**回聲定位或者說**聲納。你有兩種方法可以實現:你可以彈響指,或者咂舌頭。不過現在有失明人士,確實在學校裡接受這樣的培訓,並學會解讀從環境反彈回來的聲波模式—這就是聲納。如果你搜索一下,就會發現有些視訊講述了一個令人稱奇的孩子,他因為癌症眼球慘遭移除,雖然失去了眼球,但是通過打響指,他可以四處走動而不撞到任何東西,他能滑滑板,他可以將籃球投入籃框中。注意這是一個沒有眼球的孩子。

第三個例子是觸覺皮帶,如果你把它戴在腰上,蜂鳴器會響,而且總是朝向北時發出嗡嗡聲。它可以使人擁有方向感,用類似於鳥類感知方向的方式。

還有一些離奇的例子:

如果你在青蛙身上插入第三隻眼,青蛙也能學會使用那隻眼睛。因此,這將會非常令人驚奇。如果你能把幾乎任何感測器接入到大腦中,大腦的學習演算法就能找出學習資料的方法,並處理這些資料。從某種意義上來說,如果我們能找出大腦的學習演算法,然後在計算機上執行大腦學習演算法或與之相似的演算法,也許這將是我們向人工智慧邁進做出的最好的嘗試。人工智慧的夢想就是:有一天能製造出真正的智慧機器。

神經網路可能為我們開啟一扇進入遙遠的人工智慧夢的窗戶,對於現代機器學習應用。它是最有效的技術方法。因此接下來,我們將開始深入到神經網路的技術細節中。

3 模型表示1

為了構建神經網路模型,我們需要首先思考大腦中的神經網路是怎樣的?每一個神經元都可以被認為是一個處理單元/神經核(processing unit/Nucleus),它含有許多輸入/樹突(input/Dendrite),並且有一個輸出/軸突(output/Axon)。神經網路是大量神經元相互連結並通過電脈衝來交流的一個網路。

下面是一組神經元的示意圖,神經元利用微弱的電流進行溝通。這些弱電流也稱作動作電位,其實就是一些微弱的電流。所以如果神經元想要傳遞一個訊息,它就會就通過它的軸突,傳送一段微弱電流給其他神經元,這就是軸突。

這裡是一條連線到輸入神經,或者連線另一個神經元樹突的神經,接下來這個神經元接收這條訊息,做一些計算,它有可能會反過來將在軸突上的自己的訊息傳給其他神經元。這就是所有人類思考的模型:我們的神經元把自己的收到的訊息進行計算,並向其他神經元傳遞訊息。這也是我們的感覺和肌肉運轉的原理。如果你想活動一塊肌肉,就會觸發一個神經元給你的肌肉傳送脈衝,並引起你的肌肉收縮。如果一些感官:比如說眼睛想要給大腦傳遞一個訊息,那麼它就像這樣傳送電脈衝給大腦的。

神經網路模型建立在很多神經元之上,每一個神經元又是一個個學習模型。這些神經元(也叫啟用單元,activation unit)採納一些特徵作為輸出,並且根據本身的模型提供一個輸出。下圖是一個以邏輯迴歸模型作為自身學習模型的神經元示例,在神經網路中,引數又可被成為權重(weight)。

我們設計出了類似於神經元的神經網路,效果如下:

其中是輸入單元(input units),我們將原始資料輸入給它們。是中間單元,它們負責將資料進行處理,然後呈遞到下一層。 最後是輸出單元,它負責計算。

神經網路模型是許多邏輯單元按照不同層級組織起來的網路,每一層的輸出變數都是下一層的輸入變數。下圖為一個3層的神經網路,第一層成為輸入層(Input Layer),最後一層稱為輸出層(Output Layer),中間一層成為隱藏層(Hidden Layers)。我們為每一層都增加一個偏差單位(bias unit):

下面引入一些標記法來幫助描述模型:代表第層的第個啟用單元。代表從第層對映到第層時的權重的矩陣,例如代表從第一層對映到第二層的權重的矩陣。其尺寸為:以第層的啟用單元數量為行數,以第層的啟用單元數加一為列數的矩陣。例如:上圖所示的神經網路中的尺寸為3*4。

對於上圖所示的模型,啟用單元和輸出分別表達為:

上面進行的討論中只是將特徵矩陣中的一行(一個訓練例項)餵給了神經網路,我們需要將整個訓練集都餵給我們的神經網路演算法來學習模型。

我們可以知道:每一個a都是由上一層所有的x和每一個x所對應的決定的。(我們把這樣從左到右的演算法稱為前向傳播演算法(FORWARD-PROPAGATION))

把分別用矩陣表示:

我們可以得到。

4 模型表示2

(FORWARD PROPAGATION)相對於使用迴圈來編碼,利用向量化的方法會使得計算更為簡便。以上面的神經網路為例,試著計算第二層的值:

令,則,計算後新增。計算輸出的值為:

令,則。這只是針對訓練集中一個訓練例項所進行的計算。如果我們要對整個訓練集進行計算,我們需要將訓練集特徵矩陣進行轉置,使得同一個例項的特徵都在同一列裡。即:

為了更好了瞭解Neuron Networks的工作原理,我們先把左半部分遮住:

右半部分其實就是以,按照Logistic Regression的方式輸出:

其實神經網路就像是logistic regression,只不過我們把logistic regression中的輸入向量變成了中間層的,即:。我們可以把看成更為高階的特徵值,也就是的進化體,並且它們是由與決定的,因為是梯度下降的,所以a是變化的,並且變得越來越厲害,所以這些更高階的特徵值遠比僅僅將次方厲害,也能更好的預測新資料。這就是神經網路相比於邏輯迴歸和線性迴歸的優勢。

好啦,今天關於神經網路的簡單介紹就到這裡啦,下期小Mi將會帶著大家進一步地進行一個更為直觀的理解。我們下期再見呦~(揮手十分鐘!)