1. 程式人生 > >機器學習之旅(四)

機器學習之旅(四)

吳恩達教授的機器學習課程的第四周相關內容:

1、神經網路:表述(Neural Networks: Representation)

1.1、非線性假設( Non-linear Hypotheses )

我們之前學的,無論是線性迴歸還是邏輯迴歸都有這樣一個缺點,即: 當特徵太多時,計算的負荷會非常大。
之前我們已經看到過,使用非線性的多項式項, 能夠幫助我們建立更好的分類模型。假
設我們有非常多的特徵,例如大於 100 個變數,我們希望用這 100 個特徵來構建一個非線性
的多項式模型,結果將是數量非常驚人的特徵組合,即便我們只採用兩兩特徵的組合, 我們也會有接近 5000(100*100/2))個組合而成的特徵。這對於一般的邏輯迴歸來說需要計算的特徵太多了。
普通的邏輯迴歸模型,不能有效地處理這麼多的特徵,這時候我們需要神經網路。
小結:線性迴歸和邏輯迴歸特徵的侷限性。

1.2、神經元和大腦( Neurons and the Brain)

神經網路是一種很古老的演算法,它最初產生的目的是製造能模擬大腦的機器。
從某種意義上來說,如果我們能找出大腦的學習演算法,然後在計算機上執行大腦學習演算法或與之相似的演算法,也許這將是我們向人工智慧邁進做出的最好的嘗試。人工智慧的夢想就是:有一天能製造出真正的智慧機器。
小結:模仿人類大腦。

1.3、模型表示 ( Model Representation)

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


神經網路模型建立在很多神經元之上,每一個神經元又是一個個學習模型。這些神經元(也叫啟用單元, activation unit)採納一些特徵作為輸出,並且根據本身的模型提供一個輸
出。在神經網路中,引數又可被成為權重(weight)。我們設計出了類似於神經元的神經網路, 效果如下:
在這裡插入圖片描述
其中 x1 , x2 , x3 是輸入單元(input units),我們將原始資料輸入給它們。a1 , a2 , a3 是中間單元,它們負責將資料進行處理,然後呈遞到下一層。最後是輸出單元,它負責計算 假設函式h。神經網路模型是許多邏輯單元按照不同層級組織起來的網路,每一層的輸出變數都是下一層的輸入變數。下圖為一個 3 層的神經網路,第一層成為輸入層(Input Layer),最後一層稱為輸出層(Output Layer),中間一層成為隱藏層(Hidden Layers)。我們為每一層都增加一個偏差單位(bias unit):
在這裡插入圖片描述

下面引入一些標記法來幫助描述模型:
a i ( j ) a_{i}^{\left ( j \right )} 代表第 j 層的第 i 個啟用單元。 θ ( j ) \theta ^{\left ( j \right )} 代表從第 j 層對映到第 j+1 層時的權重的矩陣,例如 θ ( 1 ) \theta ^{\left ( 1 \right )} 代表從第一層對映到第二層的權重的矩陣。其尺寸為:以第 j+1 層的啟用單元數量為行數,以第 j 層的啟用單元數加一為列數的矩陣。例如:上圖所示的神經網路中 θ ( 1 ) \theta ^{\left ( 1 \right )} 的尺寸為 3*4。
對於上圖所示的模型,啟用單元和輸出分別表達為:
在這裡插入圖片描述
我們把這樣從左到右的演算法稱為前向傳播演算法( FORWARD PROPAGATION )
( FORWARD PROPAGATION ) 相對於與使用迴圈來編碼,利用向量化的方法會使得計算更為簡便。以上面的神經網路為例,試著計算第二層的值:
在這裡插入圖片描述
我們令 z ( 2 ) = θ ( 1 ) x z^{\left ( 2\right )}=\theta ^{\left ( 1 \right )}x ,則 a ( 2 ) = g ( z ( 2 ) ) a^{\left ( 2 \right )}=g\left ( z ^{\left ( 2 \right )}\right ) ,計算後新增 a 0 ( 2 ) = 1 a_{0}^{\left ( 2 \right )}=1 。 計算輸出的值為:
在這裡插入圖片描述
我們令 z ( 3 ) = θ ( 2 ) a ( 2 ) z^{\left ( 3\right )}=\theta ^{\left ( 2 \right )} a^{\left ( 2 \right )} ,則 h θ ( x ) = a ( 3 ) = g ( z ( 3 ) ) h_{\theta }\left ( x \right )=a^{\left ( 3 \right )}=g\left ( z ^{\left ( 3 \right )}\right )
這只是針對訓練集中一個訓練例項所進行的計算。如果我們要對整個訓練集進行計算,
我們需要將訓練集特徵矩陣進行轉置,使得同一個例項的特徵都在同一列裡。即:
z ( 2 ) = θ ( 1 ) × X z^{\left ( 2\right )}=\theta ^{\left ( 1 \right )}\times X^{\top } , a ( 2 ) = g ( z ( 2 ) ) a^{\left ( 2 \right )}=g\left ( z ^{\left ( 2 \right )}\right )
我們可以把 a 0 , a 1 , a 2 , a 3 a_{0},a_{1},a_{2},a_{3} 看成更為高階的特徵值,也就是 x 0 , x 1 , x 2 , x 3 x_{0},x_{1},x_{2},x_{3} 的進化體,並且它
們是由 x 與 θ \theta 決定的,因為是梯度下降的,所以 a 是變化的,並且變得越來越厲害,所以這些更高階的特徵值遠比僅僅將 x 次方厲害,也能更好的預測新資料。
這就是神經網路相比於邏輯迴歸和線性迴歸的優勢。
小結:神經網路通常包括輸入層、隱藏層、輸出層,將邏輯單元按照不同層級組織起來的網路,每一層的輸出變數都是下一層的輸入變數。

1.4、樣本和直觀理解(Examples and Intuitions)

神經網路中,單層神經元(無中間層)的計算可用來表示邏輯運算,比如邏輯 AND、邏輯或 OR 。
舉例說明:邏輯與 AND;下圖中左半部分是神經網路的設計與 output 層表示式,右邊上部分是 sigmod 函式,下半部分是真值表。
我們可以用這樣的一個神經網路表示 AND 函式:
在這裡插入圖片描述
其中 θ 0 = 30 θ 1 = 20 θ 2 = 20 \theta_{0}=-30,\theta_{1}=20,\theta_{2}=20
我們的輸出函式 h θ ( x ) h_{\theta }\left ( x \right ) 即為:
h θ ( x ) = g ( 30 + 20 x 1 + 20 x 2 ) h_{\theta }\left ( x \right )=g\left ( -30+20x_{1}+20x_{2} \right )
我們知道 g(x)的影象是:
在這裡插入圖片描述
所以我們有: h θ ( x ) x 1 A N D x 2 h_{\theta }\left ( x \right )\approx x_{1} AND x_{2}
這就是 AND 函式。(NOT/OR/XNOR等相似不再介紹)。
小結:這種表示方法可以更易理解神經網路。

1.5、多類分類(Multiclass Classification)

當我們有不止兩種分類時(也就是 y=1,2,3….),比如以下這種情況,該怎麼辦? 如果我們要訓練一個神經網路演算法來識別路人、汽車、摩托車和卡車,在輸出層我們應該有 4 個
值。例如,第一個值為 1 或 0 用於預測是否是行人,第二個值用於判斷是否為汽車。輸入向量 x 有三個維度,兩個中間層,輸出層 4 個神經元分別用來表示 4 類,也就是每一個數據在輸出層都會出現 [ a b c d ] \begin{bmatrix} a & b & c & d\end{bmatrix}^{\top } ,且 a,b,c,d 中僅有一個為 1,表示當前類。 下面是該神經網路的可能結構示例:
在這裡插入圖片描述

2、第四周程式設計題

1、lrCostFunction.m,
J = -(y’log(sigmoid(Xtheta))+(1-y)'log(1-sigmoid(Xtheta)))/m+lambda/2/msum((theta(2:length(theta))).^2);
grad= (X’
(sigmoid(Xtheta)-y))/m;
temp=theta;
temp(1)=0;
grad=grad+lambda/m
temp;
和第三週程式設計題的costFunctionReg.m一樣。

2、oneVsAll.m,
initial_theta = zeros(n + 1, 1);
options = optimset(‘GradObj’, ‘on’, ‘MaxIter’, 50);

for c=1:num_labels
all_theta(c,:)=fmincg (@(t)(lrCostFunction(t, X, (y == c), lambda)),initial_theta,options);
end
當c是標量、y是矩陣時,y==c表示y的第c個位置處為1,其他位置為0的邏輯向量。

3、predictOneVsAll.m
[a,p]=max(Xall_theta’,[],2);=號後面的式子表示取Xall_theta’的每行的最大值組成一個列向量,a就是這個列向量,p是這個列向量的每個值的列索引(即其所在的列數)

4、predict.m
X=[ones(size(X,1),1),X];
a=sigmoid(XTheta1’);
a=[ones(size(a,1),1),a];
b=sigmoid(a
Theta2’);
[maxx,p]=max(b,[],2);
3層神經網路的計算,層層遞進。