本文將會介紹一種叫「神經網絡」(Neural Network)的機器學習算法。算法
咱們以前已經學習過線性迴歸和邏輯迴歸算法了,爲何還要研究神經網絡? 咱們先看一個例子。下面是一個監督學習分類問題的訓練集:網絡
若是利用邏輯迴歸算法來解決這個問題,首先須要構造一個包含不少非線性項的邏輯迴歸函數。以下所示:架構
這裏g還是sigmod函數,咱們能讓函數,包含不少像這樣的多項式項。事實上,當多項式項數足夠多時,那麼可能你可以獲得一個分開正負樣本的曲線:機器學習
這裏只有$x_1$和$x_2$兩項,所以能夠得出不錯的結果。但若是應對一些複雜的機器學習問題時,設計的項每每多餘兩項。假設咱們要預測某房子將來半年賣出去的可能性,這是一個分類問題,而特徵項可能有好比面積,層數,房間數等等不少,那麼咱們構建出來的函數將會很複雜,其中二次項的數目可能達到$\frac{n^2}{2}$,並且因爲項數過多,可能會致使過擬合問題。除此以外,運算量顯然也是很龐大的。不過也能夠試試只加入這些二次項的子集,好比$x_1^2$,$x_2^2$,$x_n^2$,這樣就只有n個二次項,但因爲忽略了太多二次項,獲得的結果可能會不許確。再者,這裏只討論了二次項,那三次項的數量一樣也是不少的。因此,當初始特徵個數n增大時 這些高階多項式項數將以幾何級數遞增,特徵空間也隨之急劇膨脹,當特徵個數n很大時找出附加項來創建一些分類器,這顯然並非一個好作法。
對於實際的不少機器學習問題,特徵個數n是很大的。好比一個計算機視覺的問題,假設你想要使用機器學習算法來訓練一個分類器,使它檢測一個圖像,來判斷圖像是否爲一輛汽車。咱們取出這幅圖片中的一小部分將其放大,好比圖中這個紅色方框內的部分,結果代表,當人眼看到一輛汽車時,計算機實際上看到的倒是這個一個數據矩陣或像這種格網,它們表示了像素強度值,告訴咱們圖像中每一個像素的亮度值。所以對於計算機視覺來講問題就變成了,根據這個像素點亮度矩陣來告訴咱們這些數值表明一個汽車門把手。函數
具體而言,當用機器學習算法構造一個汽車識別器時,咱們要想出一個帶標籤的樣本集,其中一些樣本是各種汽車,另外一部分樣本是其餘任何東西,將這個樣本集輸入給學習算法,以訓練出一個分類器,訓練完畢後,咱們輸入一幅新的圖片,讓分類器斷定,「這是什麼東西?」。爲了理解引入非線性分類器的必要性,咱們從學習算法的訓練樣本中挑出一些汽車圖片和一些非汽車圖片。學習
讓咱們從其中每幅圖片中挑出一組像素點,像素點1和像素點2,在座標系中標出這幅汽車的位置,在某一點上車的位置取決於像素點1和像素點2的亮度。讓咱們用一樣的方法標出其餘圖片中汽車的位置,而後咱們再舉幾個 關於汽車的不一樣的例子,觀察這兩個相同的像素位置。咱們用「+」表明是汽車,「-」表明非汽車,這些數據分佈在座標系的不一樣位置,咱們須要一個非線性分類器來分開這兩類樣本。假設咱們用50*50像素的圖片,那麼久一共是2500個像素點。所以,咱們的特徵向量的元素數量N=2500,特徵向量X包含了全部像素點的亮度值,對於典型的計算機圖片表示方法,若是存儲的是每一個像素點的灰度值,(色彩的強烈程度),那麼每一個元素的值,應該在0到255之間,所以,這個問題中n=2500,可是,這只是使用灰度圖片的狀況,若是咱們用的是RGB彩色圖像,每一個像素點包含紅、綠、藍三個子像素,那麼n=7500。
所以,若是咱們非要經過包含全部的二次項來解決這個非線性問題,那麼,這就是式子中的全部條件,$x_i*x_j$,連同開始的2500像素,總共大約有300萬個,這數字大得有點離譜了,對於每一個樣原本說,要發現並表示,全部這300萬個項,這計算成本過高了。所以,只是簡單的增長二次項或者三次項之類的邏輯迴歸算法並非一個解決複雜非線性問題的好辦法。人工智能
神經網絡產生的緣由,是人們想嘗試設計出模仿大腦的算法,神經網絡逐漸興起於,二十世紀八九十年代,應用得很是普遍,但因爲各類緣由,在90年代的後期應用減小了,可是最近神經網絡,又東山再起了。其中一個緣由是,神經網絡是計算量有些偏大的算法,然而,大概因爲近些年,計算機的運行速度變快,才足以真正運行起大規模的神經網絡。spa
大腦能經過看處理圖像,也能幫咱們作數學題能幫咱們處理各類事情。若是咱們想模仿它,那麼須要寫出不一樣的軟件來模擬大腦作不一樣事情的方法。不過能不能假設,大腦所作的這些事情不須要成百上千的程序去實現,相反的,大腦處理的方法,只須要一個單一的學習算法就能夠了?
以下圖, 圖中的片紅色區域聽覺皮層,咱們理解他人說的話靠的是耳朵接收到聲音信號並把聲音信號傳遞給你的聽覺皮層而後你才能明白個人話。
神經系統科學家作了一個有趣的實驗,把耳朵到聽覺皮層的神經切斷,在這種狀況下,將其從新接到一個動物的大腦上,這樣從眼睛到視神經的信號最終將傳到聽覺皮層,若是這樣作了,那麼結果代表,聽覺皮層將會學會「看」,這裏「看」表明了,咱們所知道的每層含義。因此,若是你對動物這樣作,那麼動物就能夠完成視覺辨別任務,它們能夠看圖像,並根據圖像作出適當的決定,它們正是經過腦組織中的這個部分完成的。設計
來看另外一個例子,圖中紅色的腦組織是你的軀體感受皮層,這是你用來處理觸覺的若是你作一個和剛纔相似的重接實驗,那麼軀體感受皮層也能學會」看「、這個實驗和其它一些相似的實驗被稱爲神經重接實驗。從這個意義上說,若是,人體有同一塊,腦組織能夠處理光、,聲或觸覺信號,那麼也許存在一種學習算法,能夠同時處理,視覺、聽覺和觸覺,而不是須要,運行上千個不一樣的程序,或者上千個不一樣的算法來作這些,大腦所完成的,成千上萬的美好事情,也許咱們須要作的就是找出,一些近似的或,實際的大腦學習算法,而後實現它,大腦經過自學掌握如何,處理這些不一樣類型的數據,圖片
從某種意義上來講,若是咱們能找出大腦的學習算法,而後在計算機上執行,大腦學習算法或與之類似的算法,也許這將是咱們向人工智能邁進作出的最好的嘗試,人工智能的夢想就是 有一天能製造出真正的智能機器。
神經網絡是在模仿大腦中的神經元或者神經網絡時發明的,所以,要解釋如何表示模型假設,咱們先來看單個 神經元在大腦中是什麼樣的。
神經元在大腦中,是什麼樣的,咱們的大腦中充滿了,這樣的神經元,神經元是大腦中的細胞,其中有兩點,值得咱們注意,一是神經元有,像這樣的細胞主體,二是神經元有,必定數量的,輸入神經,這些輸入神經叫作樹突,能夠把它們想象成輸入電線,它們接收來自其餘,神經元的信息,神經元的輸出神經叫作軸突,這些輸出神經,是用來,給其餘神經元傳遞信號,或者傳送信息的,簡而言之,神經元是一個計算單元,它從輸入神經接受必定數目的信息,並作一些計算,而後將結果經過它的,軸突傳送到其餘節點,或者大腦中的其餘神經元,下面是一組神經元的示意圖:
神經元利用微弱的電流進行溝通,這些弱電流也稱做動做電位,其實就是一些微弱的電流,因此若是神經元想要傳遞一個消息,它就會就經過它的軸突發送一段微弱電流給其餘神經元,接下來這個神經元接收這條消息作一些計算,它有可能會反過來將在軸突上的本身的消息傳給其餘神經元,這就是全部,人類思考的模型:咱們的神經元把,本身的收到的消息進行計算,並向其餘神經元傳遞消息,順便說一下,這也是咱們的感受和肌肉運轉的原理,若是你想活動一塊肌肉,就會觸發一個神經元,給你的肌肉發送脈衝,並引發你的肌肉收縮,若是一些感官好比說眼睛,想要給大腦傳遞一個消息,那麼它就像這樣發送。
在一個神經網絡裏,或者說在咱們在電腦上實現的人工神經網絡裏,咱們將使用一個很是簡單的模型來模擬神經元的工做,咱們將神經元模擬成一個邏輯單元。以下圖所示,當我畫一個這樣的,黃色圓圈能夠理解爲神經元的東西,而後咱們經過,它的樹突或者說它的輸入神經,傳遞給它一些信息,而後神經元作一些計算,並經過它的輸出神經,即它的軸突,輸出計算結果。這裏的$h_\theta(x) = \frac{1}{1+e^{-\theta^Tx}}$。一般x和θ是咱們的參數向量,這是一個簡單的模型,甚至說是一個過於簡單的模擬神經元的模型,它被輸入$x_1$,$x_2$和$x_3$,而後輸出一些相似這樣的結果,繪製一個神經網絡時,一般只繪製輸入節點$x_1$,$x_2$,$x_3$,但有時也能夠增長一個額外的節點$x_0$,這個$x_0$節點有時也被稱做偏置單位,或偏置神經元,但由於$x_0$老是等於1,因此有時候會畫出它有時不會畫出,這取決於它是否對例子有利。
有時咱們會說,這是一個神經元,一個有s型函數或者邏輯函數做爲激勵函數的人工神經元,在神經網絡術語中,激勵函數只是對相似非線性函數g(z)的另外一個術語稱呼,$g(z) = \frac{1}{1+e^{-z}}$,到目前爲止,我一直稱θ爲模型的參數,之後大概會繼續將這個術語與「參數」相對應,而不是與神經網絡,在關於神經網絡的文獻裏,有時你可能會看到人們,談論一個模型的權重,權重其實和,模型的參數,是同樣的東西,,這個小圈,表明一個單一的神經元,神經網絡其實就是,這些不一樣的神經元,組合在一塊兒的集合。
圖中,網絡中的第一層,也被稱爲輸入層,由於咱們在這一層,輸入咱們的特徵項,$x_1$,$x_2$,$x_3$,最後一層,也稱爲輸出層,由於這一層的神經元指的是輸出,假設的最終計算結果,中間的兩層,也被稱做隱藏層,隱藏層不是一個,很合適的術語,可是,直覺上咱們知道,在監督學習中,你能看到輸入,也能看到正確的輸出,而隱藏層的值,你在訓練集裏是看不到的,它的值不是x,也不是y,因此咱們叫它隱藏層,隱藏層也可能不止一個,實際上任何,非輸入層或非輸出層的層,就被稱爲隱藏層。
接下來咱們逐步分析圖表中的計算步驟,首先咱們須要解釋一些記號:
我要使用a上標(j)下標i表示,第j層的第i個神經元或單元,具體來講,圖中好比a上標(2),下標1,表示第2層的第一個激勵,即隱藏層的第一個激勵,所謂激勵(activation),是指由一個具體神經元讀入,計算並輸出的值。此外,咱們的神經網絡,被這些矩陣參數化,θ上標(j),它將成爲一個波矩陣,控制着從一層,好比說從第一層到第二層或者第二層到第三層的做用。
因此,這就是這張圖所表示的計算,好比這裏的第一個隱藏單元,是這樣計算它的值的,如圖中公式所示:$a_1^(2)$等於s函數,做用在這種,第一個公式中輸入的線性組合上的結果,第二個隱藏單元,等於s函數做用在這個第二個線性組合上的值,以此類推。在這裏,咱們有三個輸入單元和三個隱藏單元,這樣一來,參數矩陣控制了,咱們來自三個輸入單元三個隱藏單元的映射,所以$\Theta^(1)$的維數,將變成3,$\Theta^(1)$將變成一個3*4維的矩陣,更通常的,若是一個網絡在第j層有$s_j$個單元,在j+1層有,$s_{j+1}$個單元,那麼矩陣$\Theta^(j)$,即控制第j層到第j+1層映射的矩陣的,維度爲$s_{j+1}*(s_j+1)$,因此$\Theta^(j)$的維度是,$s_{j+1}$行,$s_j+1$列。最後,在輸出層,咱們還有一個單元,它計算h(x),這個也能夠,寫成$a_1^(3)$就等於後面這塊,注意到我這裏,寫了個上標2,由於$\Theta$上標2,是參數矩陣,或着說是權重矩陣,該矩陣控制從第二層即隱藏層的3個單位到第三層的一個單元,即輸出單元的映射。總之,以上咱們,展現了像這樣一張圖是怎樣定義一我的工神經網絡的,這個神經網絡定義了函數h從輸入x到輸出y的映射,我將這些假設的參數,記爲大寫的$\Theta$,這樣一來,不一樣的$\Theta$,對應了不一樣的假設,因此咱們有不一樣的函數,好比說從,x到y的映射。
在上述的式子裏,咱們將g的部分表達爲$z_1^(2)$即$a_1^2 = g(z_1^(2))$,$a_2^2 = g(z_2^(2))$,$a_3^2 = g(z_3^(2))$,因此這些z值都是一個線性組合,是輸入值$x_0$,$x_1$,$x_2$,$x_3$的加權線性組合,他將會進入一個特定的神經元。也就是說,對於j=2的第k個節點有:
用向量表示x和$z^j$爲:
在上述示例中:
$z^(2) = \Theta^(1)$, $a^(2) = g(z^(2))$,這裏的$z^(2)$是個三維向量,$a^(2)$也是個三維向量,所以這裏的激勵g將sigmod函數逐元素做用於$z^(2)$中的每一個元素。這裏咱們還有隱藏的偏置單元只是未在圖中畫出,爲了注意這額外的偏置單元,咱們額外加上一個$a_0^(2) = 1$,這樣$a^(2)$就是一個四維特徵向量。而後咱們爲了計算假設的實際輸出值,咱們只須要計算$z^(3)$,它等於上圖中g括號中的部分,$z^(3) = \Theta^(2)a^(2)$,則假設輸出$h_\Theta(x) = a^(3) = g(z^(3))$。
這個計算h(x)的過程,也稱爲前向傳播(forward propagation),這樣命名是由於咱們從輸入層的激勵開始,而後前向傳播給隱藏層並計算隱藏層的激勵,而後咱們繼續前向傳播,並計算輸出層的激勵。這個從輸入層到隱藏層再到輸入層依次計算激勵的過程就叫作前向傳播。
定義$x = a^(1)$,咱們能夠將等式轉換成:
這種前向傳播的方式,也能夠幫助咱們理解神經網絡的原理和它爲何可以幫助咱們學習非線性假設。以下圖神經網絡,假設咱們只看後半部分,也就是從隱藏層到輸出層的部分,這看起來就很想邏輯迴歸。
邏輯迴歸中,咱們用輸出層這個節點,即這個邏輯迴歸單元來預測$h(x)$的值,具體來講,假設函數的等式爲:
$$ h_\Theta(x) = g(\Theta_10^2a_0^2+\Theta_11^2a_1^2+\Theta_12^2a_2^2+\Theta_13^2a_3^2) $$
顯然這裏很像是邏輯迴歸模型,只是這裏的$\Theta$咱們用的是大寫的。這樣作完,咱們只獲得了邏輯迴歸,可是邏輯迴歸的輸入特徵值是經過隱藏層計算的。它不是使用$x_1$,$x_2$,$x_3$做爲輸入特徵,而是用$a_1$, $a_2$,$a_3$做爲新的輸入特徵。一樣咱們須要把上標加上來和以前的記號保持一致。有趣的是,特徵項$a_1$, $a_2$,$a_3$它們是做爲輸入的函數來學習的,具體來講,就是從第一層映射到第二層的函數,這個函數由其餘 一組參數$\Theta^(1)$決定。因此,在神經網絡中它沒有使用輸入特徵$x_1$,$x_2$,$x_3$來訓練邏輯迴歸,而是本身訓練邏輯迴歸的輸入$a_1$, $a_2$,$a_3$。能夠想象,若是在$\Theta^(1)$中選擇不一樣的參數,有時能夠學習到一些頗有趣和複雜的特徵 就能夠獲得一個更好的假設,比使用原始輸入$x_1$,$x_2$,$x_3$時獲得的假設更好。你也能夠選擇多項式項$x_1$,$x_2$,$x_3$等做爲輸入項,但這個算法能夠靈活地快速學習任意的特徵項,把這些$a_1$, $a_2$,$a_3$輸入最後的單元,實際上,它就是邏輯迴歸。
你還能夠用其餘類型的圖來表示神經網絡中神經元相鏈接的方式,稱爲神經網絡的架構,因此說,架構是指,不一樣的神經元是如何相互鏈接的,這裏有一個不一樣的,神經網絡架構的例子以下圖所示:
你能夠,意識到這個第二層是如何工做的。在這裏,咱們有三個隱藏單元,它們根據輸入層計算一個複雜的函數,而後第三層能夠將第二層訓練出的特徵項做爲輸入,並在第三層計算一些更復雜的函數,這樣,在你到達輸出層以前即第四層,就能夠利用第三層訓練出的更復雜的特徵項做爲輸入,以此獲得很是有趣的非線性假設。順便說一下,在這樣的網絡裏,第一層被稱爲輸入層,第四層仍然是咱們的輸出層,這個網絡有兩個隱藏層,因此,任何一個不是,輸入層或輸出層的,都被稱爲隱藏層。
以上,爲吳恩達機器學習第四周關於神經網絡概念部分的課程筆記。