8.1 非線性假設
無論是線性迴歸還是邏輯迴歸都有這樣一個缺點,即:當特徵太多時,計算的負荷會非常大。
下面是一個例子:
當我們使用, 的多次項式進行預測時,我們可以應用的很好。
之前我們已經看到過,使用非線性的多項式項,能夠幫助我們建立更好的分類模型。假設我們有非常多的特徵,例如大於100個變量,我們希望用這100個特徵來構建一個非線性的多項式模型,結果將是數量非常驚人的特徵組合,即便我們只採用兩兩特徵的組合(),我們也會有接近5000個組合而成的特徵。這對於一般的邏輯迴歸來說需要計算的特徵太多了。
假設我們希望訓練一個模型來識別視覺對象(例如識別一張圖片上是否是一輛汽車),我們怎樣才能這麼做呢?一種方法是我們利用很多汽車的圖片和很多非汽車的圖片,然後利用這些圖片上一個個像素的值(飽和度或亮度)來作爲特徵。
假如我們只選用灰度圖片,每個像素則只有一個值(而非 RGB值),我們可以選取圖片上的兩個不同位置上的兩個像素,然後訓練一個邏輯迴歸算法利用這兩個像素的值來判斷圖片上是否是汽車:
假使我們採用的都是50x50像素的小圖片,並且我們將所有的像素視爲特徵,則會有 2500個特徵,如果我們要進一步將兩兩特徵組合構成一個多項式模型,則會有約個(接近3百萬個)特徵。普通的邏輯迴歸模型,不能有效地處理這麼多的特徵,這時候我們需要神經網絡。
8.2 模型表示1
爲了構建神經網絡模型,我們需要首先思考大腦中的神經網絡是怎樣的?每一個神經元都可以被認爲是一個處理單元/神經核(processing unit/Nucleus),它含有許多輸入/樹突(input/Dendrite),並且有一個輸出/軸突(output/Axon)。神經網絡是大量神經元相互鏈接並通過電脈衝來交流的一個網絡。
神經網絡模型建立在很多神經元之上,每一個神經元又是一個個學習模型。這些神經元(也叫激活單元,activation unit)採納一些特徵作爲輸出,並且根據本身的模型提供一個輸出。下圖是一個以邏輯迴歸模型作爲自身學習模型的神經元示例,在神經網絡中,參數又可被稱爲權重(weight)。
我們設計出了類似於神經元的神經網絡,效果如下:
其中, ,,是輸入單元(input units),我們將原始數據輸入給它們。
是中間單元,它們負責將數據進行處理,然後呈遞到下一層。
最後是輸出單元,它負責計算。
神經網絡模型是許多邏輯單元按照不同層級組織起來的網絡,每一層的輸出變量都是下一層的輸入變量。下圖爲一個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分別用矩陣表示:
我們可以得到θ⋅X=a。
8.3 模型表示2
相對於使用循環來編碼,利用向量化的方法會使得計算更爲簡便。以上面的神經網絡爲例,試着計算第二層的值:
如上,我們令,則 ,計算後添加。 計算輸出的值爲
我們令 ,則 。
這只是針對訓練集中一個訓練實例所進行的計算。如果我們要對整個訓練集進行計算,我們需要將訓練集特徵矩陣進行轉置,使得同一個實例的特徵都在同一列裏。即:
, 。
爲了更好了瞭解Neuron Networks的工作原理,我們先把左半部分遮住:
右半部分其實就是以,按照Logistic Regression的方式輸出:
其實神經網絡就像是logistic regression,只不過我們把logistic regression中的輸入向量變成了中間層的 ,我們可以把看成更爲高級的特徵值,也就是的進化體,並且它們是由 x與θ決定的,因爲是梯度下降的,所以a是變化的,並且變得越來越厲害,所以這些更高級的特徵值遠比僅僅將 x次方厲害,也能更好的預測新數據。
這就是神經網絡相比於邏輯迴歸和線性迴歸的優勢。
這個計算的過程也稱爲前向傳播。這樣命名是因爲我們從輸入單元的激活項開始,然後向前傳播給隱藏層並計算隱藏層的激活項,然後我們繼續向前傳播,並計算出輸出層的激活項。
8.4 樣本與直觀理解1
從本質上講,神經網絡能夠通過學習得出其自身的一系列特徵。在普通的邏輯迴歸中,我們被限制爲使用數據中的原始特徵,我們雖然可以使用一些二項式項來組合這些特徵,但是我們仍然受到這些原始特徵的限制。在神經網絡中,原始特徵只是輸入層,在我們上面三層的神經網絡例子中,第三層也就是輸出層做出的預測利用的是第二層的特徵,而非輸入層中的原始特徵,我們可以認爲第二層中的特徵是神經網絡通過學習後自己得出的一系列用於預測輸出變量的新特徵。
神經網絡中,單層神經元(無中間層)的計算可用來表示邏輯運算,比如邏輯與(AND)、邏輯或(OR)。
舉例說明:邏輯與(AND);下圖中左半部分是神經網絡的設計與output層表達式,右邊上部分是sigmod函數,下半部分是真值表。
我們可以用這樣的一個神經網絡表示AND 函數:
其中
我們的輸出函數即爲:
我們知道g(x)的圖像是:
所以我們有:
接下來再介紹一個OR函數:
可以發現: OR與AND整體一樣,區別只在於的取值不同。
8.5 樣本與直觀理解2
關於計算非線性的假設函數。
二元邏輯運算符(BINARY LOGICAL OPERATORS)當輸入特徵爲布爾值(0或1)時,我們可以用一個單一的激活層可以作爲二元邏輯運算符,爲了表示不同的運算符,我們只需要選擇不同的權重即可。
下圖的神經元(三個權重分別爲-30,20,20)可以被視爲作用同於邏輯與(AND):
下圖的神經元(三個權重分別爲-10,20,20)可以被視爲作用等同於邏輯或(OR):
下圖的神經元(兩個權重分別爲 10,-20)可以被視爲作用等同於邏輯非(NOT):
我們可以利用神經元來組合成更爲複雜的神經網絡以實現更復雜的運算。例如我們要實現XNOR 功能(輸入的兩個值必須一樣,均爲1或均爲0),即
首先構造一個能表達部分的神經元:
然後將表示 AND 的神經元和表示的神經元以及表示 OR 的神經元進行組合:
我們就得到了一個能實現 XNOR 運算符功能的神經網絡。
按這種方法我們可以逐漸構造出越來越複雜的函數,也能得到更加厲害的特徵值。;這就是神經網絡的厲害之處。
8.6 多類別分類
當我們有不止兩種分類時(也就是y=1,2,3…),比如以下這種情況,該怎麼辦?如果我們要訓練一個神經網絡算法來識別路人、汽車、摩托車和卡車,在輸出層我們應該有4個值。例如,第一個值爲1或0用於預測是否是行人,第二個值用於判斷是否爲汽車。
輸入向量x有三個維度,兩個中間層,輸出層4個神經元分別用來表示4類,也就是每一個數據在輸出層都會出現,且a,b,c,d中僅有一個爲1,表示當前類。下面是該神經網絡的可能結構示例:
神經網絡算法的輸出結果爲四種可能情形之一:
參考資料: