咱們以前學的,不管是線性迴歸仍是邏輯迴歸都有這樣一個缺點,即:當特徵太多時,計算的負荷會很是大。html
下面是一個例子:git
當咱們使用x1, x2的屢次項式進行預測時,咱們能夠應用的很好。 以前咱們已經看到過,使用非線性的多項式項,可以幫助咱們創建更好的分類模型。假設咱們有很是多的特徵,例如大於100個變量,咱們但願用這100個特徵來構建一個非線性的多項式模型,結果將是數量很是驚人的特徵組合,即使咱們只採用兩兩特徵的組合(x1x2+x1x3+x1x4+...+x2x3+x2x4+...+x99x100),咱們也會有接近5000個組合而成的特徵。這對於通常的邏輯迴歸來講須要計算的特徵太多了。github
假設咱們但願訓練一個模型來識別視覺對象(例如識別一張圖片上是不是一輛汽車),咱們怎樣才能這麼作呢?一種方法是咱們利用不少汽車的圖片和不少非汽車的圖片,而後利用這些圖片上一個個像素的值(飽和度或亮度)來做爲特徵。算法
假如咱們只選用灰度圖片,每一個像素則只有一個值(而非 RGB值),咱們能夠選取圖片上的兩個不一樣位置上的兩個像素,而後訓練一個邏輯迴歸算法利用這兩個像素的值來判斷圖片上是不是汽車:markdown
假使咱們採用的都是50x50像素的小圖片,而且咱們將全部的像素視爲特徵,則會有 2500個特徵,若是咱們要進一步將兩兩特徵組合構成一個多項式模型,則會有約25002/2個(接近3百萬個)特徵。普通的邏輯迴歸模型,不能有效地處理這麼多的特徵,這時候咱們須要神經網絡。網絡
神經網絡是一種很古老的算法,它最初產生的目的是製造能模擬大腦的機器。app
在這門課中,我將向大家介紹神經網絡。由於它能很好地解決不一樣的機器學習問題。而不僅由於它們在邏輯上行得通,在這段視頻中,我想告訴大家一些神經網絡的背景知識,由此咱們能知道能夠用它們來作什麼。無論是將其應用到現代的機器學習問題上,仍是應用到那些你可能會感興趣的問題中。也許,這一偉大的人工智能夢想在將來能製造出真正的智能機器。另外,咱們還將講解神經網絡是怎麼涉及這些問題的神經網絡產生的緣由是人們想嘗試設計出模仿大腦的算法,從某種意義上說若是咱們想要創建學習系統,那爲何不去模仿咱們所認識的最神奇的學習機器——人類的大腦呢?機器學習
神經網絡逐漸興起於二十世紀八九十年代,應用得很是普遍。但因爲各類緣由,在90年代的後期應用減小了。可是最近,神經網絡又東山再起了。其中一個緣由是:神經網絡是計算量有些偏大的算法。然而大概因爲近些年計算機的運行速度變快,才足以真正運行起大規模的神經網絡。正是因爲這個緣由和其餘一些咱們後面會討論到的技術因素,現在的神經網絡對於許多應用來講是最早進的技術。當你想模擬大腦時,是指想製造出與人類大腦做用效果相同的機器。大腦能夠學會去以看而不是聽的方式處理圖像,學會處理咱們的觸覺。函數
咱們能學習數學,學着作微積分,並且大腦能處理各類不一樣的使人驚奇的事情。彷佛若是你想要模仿它,你得寫不少不一樣的軟件來模擬全部這些五花八門的奇妙的事情。不過能不能假設大腦作全部這些,不一樣事情的方法,不須要用上千個不一樣的程序去實現。相反的,大腦處理的方法,只須要一個單一的學習算法就能夠了?儘管這只是一個假設,不過讓我和你分享,一些這方面的證據。學習
大腦的這一部分這一小片紅色區域是你的聽覺皮層,你如今正在理解個人話,這靠的是耳朵。耳朵接收到聲音信號,並把聲音信號傳遞給你的聽覺皮層,正因如此,你才能明白個人話。
神經系統科學家作了下面這個有趣的實驗,把耳朵到聽覺皮層的神經切斷。在這種狀況下,將其從新接到一個動物的大腦上,這樣從眼睛到視神經的信號最終將傳到聽覺皮層。若是這樣作了。那麼結果代表聽覺皮層將會學會「看」。這裏的「看」表明了咱們所知道的每層含義。因此,若是你對動物這樣作,那麼動物就能夠完成視覺辨別任務,它們能夠看圖像,並根據圖像作出適當的決定。它們正是經過腦組織中的這個部分完成的。下面再舉另外一個例子,這塊紅色的腦組織是你的軀體感受皮層,這是你用來處理觸覺的,若是你作一個和剛纔相似的重接實驗,那麼軀體感受皮層也能學會「看」。這個實驗和其它一些相似的實驗,被稱爲神經重接實驗,從這個意義上說,若是人體有同一塊腦組織能夠處理光、聲或觸覺信號,那麼也許存在一種學習算法,能夠同時處理視覺、聽覺和觸覺,而不是須要運行上千個不一樣的程序,或者上千個不一樣的算法來作這些大腦所完成的成千上萬的美好事情。也許咱們須要作的就是找出一些近似的或實際的大腦學習算法,而後實現它大腦經過自學掌握如何處理這些不一樣類型的數據。在很大的程度上,能夠猜測若是咱們把幾乎任何一種傳感器接入到大腦的幾乎任何一個部位的話,大腦就會學會處理它。
下面再舉幾個例子:
這張圖是用舌頭學會「看」的一個例子。它的原理是:這其實是一個名爲BrainPort的系統,它如今正在FDA (美國食品和藥物管理局)的臨牀試驗階段,它能幫助失明人士看見事物。它的原理是,你在前額上帶一個灰度攝像頭,面朝前,它就能獲取你面前事物的低分辨率的灰度圖像。你連一根線到舌頭上安裝的電極陣列上,那麼每一個像素都被映射到你舌頭的某個位置上,可能電壓值高的點對應一個暗像素電壓值低的點。對應於亮像素,即便依靠它如今的功能,使用這種系統就能讓你我在幾十分鐘裏就學會用咱們的舌頭「看」東西。
這是第二個例子,關於人體回聲定位或者說人體聲納。你有兩種方法能夠實現:你能夠彈響指,或者咂舌頭。不過如今有失明人士,確實在學校裏接受這樣的培訓,並學會解讀從環境反彈回來的聲波模式—這就是聲納。若是你搜索YouTube以後,就會發現有些視頻講述了一個使人稱奇的孩子,他由於癌症眼球慘遭移除,雖然失去了眼球,可是經過打響指,他能夠四處走動而不撞到任何東西,他能滑滑板,他能夠將籃球投入籃框中。注意這是一個沒有眼球的孩子。
第三個例子是觸覺皮帶,若是你把它戴在腰上,蜂鳴器會響,並且老是朝向北時發出嗡嗡聲。它可使人擁有方向感,用相似於鳥類感知方向的方式。
還有一些離奇的例子:
若是你在青蛙身上插入第三隻眼,青蛙也能學會使用那隻眼睛。所以,這將會很是使人驚奇。若是你能把幾乎任何傳感器接入到大腦中,大腦的學習算法就能找出學習數據的方法,並處理這些數據。從某種意義上來講,若是咱們能找出大腦的學習算法,而後在計算機上執行大腦學習算法或與之類似的算法,也許這將是咱們向人工智能邁進作出的最好的嘗試。人工智能的夢想就是:有一天能製造出真正的智能機器。
神經網絡可能爲咱們打開一扇進入遙遠的人工智能夢的窗戶,但我在這節課中講授神經網絡的緣由,主要是對於現代機器學習應用。它是最有效的技術方法。所以在接下來的一些課程中,咱們將開始深刻到神經網絡的技術細節。
爲了構建神經網絡模型,咱們須要首先思考大腦中的神經網絡是怎樣的?每個神經元均可以被認爲是一個處理單元/神經核(processing unit/Nucleus),它含有許多輸入/樹突(input/Dendrite),而且有一個輸出/軸突(output/Axon)。神經網絡是大量神經元相互連接並經過電脈衝來交流的一個網絡。
下面是一組神經元的示意圖,神經元利用微弱的電流進行溝通。這些弱電流也稱做動做電位,其實就是一些微弱的電流。因此若是神經元想要傳遞一個消息,它就會就經過它的軸突,發送一段微弱電流給其餘神經元,這就是軸突。
這裏是一條鏈接到輸入神經,或者鏈接另外一個神經元樹突的神經,接下來這個神經元接收這條消息,作一些計算,它有可能會反過來將在軸突上的本身的消息傳給其餘神經元。這就是全部人類思考的模型:咱們的神經元把本身的收到的消息進行計算,並向其餘神經元傳遞消息。這也是咱們的感受和肌肉運轉的原理。若是你想活動一塊肌肉,就會觸發一個神經元給你的肌肉發送脈衝,並引發你的肌肉收縮。若是一些感官:好比說眼睛想要給大腦傳遞一個消息,那麼它就像這樣發送電脈衝給大腦的。
神經網絡模型創建在不少神經元之上,每個神經元又是一個個學習模型。這些神經元(也叫激活單元,activation unit)採納一些特徵做爲輸出,而且根據自己的模型提供一個輸出。下圖是一個以邏輯迴歸模型做爲自身學習模型的神經元示例,在神經網絡中,參數又可被成爲權重(weight)。
咱們設計出了相似於神經元的神經網絡,效果以下:
其中x1, x2, x3是輸入單元(input units),咱們將原始數據輸入給它們。 a1, a2, a3是中間單元,它們負責將數據進行處理,而後呈遞到下一層。 最後是輸出單元,它負責計算。
神經網絡模型是許多邏輯單元按照不一樣層級組織起來的網絡,每一層的輸出變量都是下一層的輸入變量。下圖爲一個3層的神經網絡,第一層成爲輸入層(Input Layer),最後一層稱爲輸出層(Output Layer),中間一層成爲隱藏層(Hidden Layers)。咱們爲每一層都增長一個誤差單位(bias unit):
下面引入一些標記法來幫助描述模型: 表明第j 層的第 i 個激活單元。
表明從第 j 層映射到第 j+1 層時的權重的矩陣,例如
表明從第一層映射到第二層的權重的矩陣。其尺寸爲:以第 j+1層的激活單元數量爲行數,以第 j 層的激活單元數加一爲列數的矩陣。例如:上圖所示的神經網絡中
的尺寸爲 3*4。
對於上圖所示的模型,激活單元和輸出分別表達爲:
上面進行的討論中只是將特徵矩陣中的一行(一個訓練實例)餵給了神經網絡,咱們須要將整個訓練集都餵給咱們的神經網絡算法來學習模型。
咱們能夠知道:每個a都是由上一層全部的x和每個x所對應的決定的。(咱們把這樣從左到右的算法稱爲前向傳播算法( FORWARD PROPAGATION ))
把x, , a 分別用矩陣表示:
咱們能夠獲得。
( FORWARD PROPAGATION ) 相對於使用循環來編碼,利用向量化的方法會使得計算更爲簡便。以上面的神經網絡爲例,試着計算第二層的值:
咱們令,則
。 這只是針對訓練集中一個訓練實例所進行的計算。若是咱們要對整個訓練集進行計算,咱們須要將訓練集特徵矩陣進行轉置,使得同一個實例的特徵都在同一列裏。即:
。
爲了更好了瞭解Neuron Networks的工做原理,咱們先把左半部分遮住:
右半部分其實就是以a0, a1, a_2, a3, 按照Logistic Regression的方式輸出:
其實神經網絡就像是logistic regression,只不過咱們把logistic regression中的輸入向量 變成了中間層的
, 即:
咱們能夠把
當作更爲高級的特徵值,也就是
的進化體,而且它們是由 x與
決定的,由於是梯度降低的,因此a是變化的,而且變得愈來愈厲害,因此這些更高級的特徵值遠比僅僅將 x次方厲害,也能更好的預測新數據。 這就是神經網絡相比於邏輯迴歸和線性迴歸的優點。
從本質上講,神經網絡可以經過學習得出其自身的一系列特徵。在普通的邏輯迴歸中,咱們被限制爲使用數據中的原始特徵,咱們雖然可使用一些二項式項來組合這些特徵,可是咱們仍然受到這些原始特徵的限制。在神經網絡中,原始特徵只是輸入層,在咱們上面三層的神經網絡例子中,第三層也就是輸出層作出的預測利用的是第二層的特徵,而非輸入層中的原始特徵,咱們能夠認爲第二層中的特徵是神經網絡經過學習後本身得出的一系列用於預測輸出變量的新特徵。
神經網絡中,單層神經元(無中間層)的計算可用來表示邏輯運算,好比邏輯與(AND)、邏輯或(OR)。
舉例說明:邏輯與(AND);下圖中左半部分是神經網絡的設計與output層表達式,右邊上部分是sigmod函數,下半部分是真值表。
咱們能夠用這樣的一個神經網絡表示AND 函數:
其中 咱們的輸出函數
即爲:
咱們知道的圖像是:
因此咱們有:
因此咱們的:
這就是AND函數。
接下來再介紹一個OR函數:
OR與AND總體同樣,區別只在於的取值不一樣。
二元邏輯運算符(BINARY LOGICAL OPERATORS)當輸入特徵爲布爾值(0或1)時,咱們能夠用一個單一的激活層能夠做爲二元邏輯運算符,爲了表示不一樣的運算符,咱們只須要選擇不一樣的權重便可。
下圖的神經元(三個權重分別爲-30,20,20)能夠被視爲做用同於邏輯與(AND):
下圖的神經元(三個權重分別爲-10,20,20)能夠被視爲做用等同於邏輯或(OR):
下圖的神經元(兩個權重分別爲 10,-20)能夠被視爲做用等同於邏輯非(NOT):
咱們能夠利用神經元來組合成更爲複雜的神經網絡以實現更復雜的運算。例如咱們要實現XNOR 功能(輸入的兩個值必須同樣,均爲1或均爲0),即 首先構造一個能表達
部分的神經元:
而後將表示 AND 的神經元和表示的神經元以及表示 OR 的神經元進行組合:
咱們就獲得了一個能實現 運算符功能的神經網絡。
按這種方法咱們能夠逐漸構造出愈來愈複雜的函數,也能獲得更加厲害的特徵值。
這就是神經網絡的厲害之處。
當咱們有不止兩種分類時(也就是),好比如下這種狀況,該怎麼辦?若是咱們要訓練一個神經網絡算法來識別路人、汽車、摩托車和卡車,在輸出層咱們應該有4個值。例如,第一個值爲1或0用於預測是不是行人,第二個值用於判斷是否爲汽車。
輸入向量x有三個維度,兩個中間層,輸出層4個神經元分別用來表示4類,也就是每個數據在輸出層都會出現,且a,b,c,d中僅有一個爲1,表示當前類。下面是該神經網絡的可能結構示例:
神經網絡算法的輸出結果爲四種可能情形之一:
參考:
[1] 吳恩達機器學習課程:https://study.163.com/course/courseMain.htm?courseId=1004570029
[2] https://www.cnblogs.com/sl0309/category/1382582.html
[3] https://github.com/fengdu78/Coursera-ML-AndrewNg-Notes/blob/master/markdown/week4.md