Featured Post

#48常識集_類神經網路_上




#48常識集_類神經網路_上


/*-------------分隔線-------------*/
其實本站目前並不會立即使用到類神經網路相關知識,只是發現好像蠻多人沒機會學到,所以各位讀者就當常識聽過去這樣。 在Coursera上面machine learning的課很多,有興趣讀者可再自行深究。
/*-------------分隔線-------------*/


基本觀念

在進入類神經網路之前,我們需要先對machine learning是怎麼運作的有個基本的觀念。基本上我們期望的結果是當我們輸入一些資訊(input)之後,電腦能夠用它內建的一些模型跑一跑,最後給出一個或一組答案(output)。比方說輸入「McBurney sign (+)(一個和盲腸炎有關的表徵)」、「Murphy sign (-)(一個和膽囊炎有關的表徵)」、.....之類的資訊然後電腦就跑出「1. acute appendicitis急性盲腸炎」、「2. acute diverticulitis急性憩室炎」、...blablabla。但是不同的input重要性並不相同,比方說發燒通常是一個比較敏感但不特異的表徵,Straight leg raise test (+)則通常是一個比較特異的表徵(通常是暗示有腰椎椎間盤突出),所以不同的input會有不同的權重(weight)。
所以基本觀念其實就是像上圖畫的這樣,有好多input,根據權重輸入到combiner裡面,combiner算一算結果之後,看你希望輸出的形式是如何,來決定你需要甚麼limiter(例如一個Heaviside function可以把output變成二元的0或1,雖然這個函數通常不會被拿來用,因為他不是處處可微分。)但很顯然一開始我們不會知道權重應該怎麼設定,所以如果我們把輸出的output和我們心目中的標準答案比對一下,就可以求出錯誤(error)有多少,我們就可以依據error來調整權重的大小。這基本上就是machine learning在做的事情。

如何調整權重?Gradient Descent Method

現在大家已經知道基本精神是怎麼一回事啦,所以我們要先來舉一個簡單的例子(這還不是類神經網路)來看看我們怎麼調整權重。
上圖是一個非常非常簡單的學習模型(learning model),只有兩個input x1, x2,輸出Y=w1x1+w2x2。把Y和標準答案D比較可以得到squared error E = e^2 = (D-Y)^2。現在重點來了,我們要如何依據這個錯誤值來修正權重w1 & w2呢???
一切都要回到我們最基本的微積分~~。在茫茫參數海中,如何從目前錯誤值很大的參數設定,邁向錯誤值最小的參數設定呢?利用偏微分的方式,我們可以知道錯誤值在參數空間中,變化量最劇烈的方向在哪裡,這個方向其實就是在(∂E/∂w1, ∂E/∂w2)的地方(上圖的紅色箭頭,z方向的大小只是示意而已,因為參數空間w1-w2是二維的)。但如果沿著這個方向走是錯誤值會增加最快的方向,所以我們要修正目前的參數,當然就應該往反方向走,也就是往(-∂E/∂w1, -∂E/∂w2)的方向前進(上圖的綠色箭頭)。但通常為了避免我們一次走太大步(如果目前的參數設定已經離理想參數設定很近了,很容易走超過),通常會乘上一個α(大概是個0.01或0.001之類的數字)避免我們衝過頭。

概念清楚的話我們就可以看看如何實現他。記得e = D - Y。 E = e^2 = (D-Y)^2。
∂E/∂w1 = ∂(D-Y)^2/∂w1 = -2(D-Y)∂Y/∂w1=-2(D-Y)x1 = -2e*x1
同理∂E/∂w2 = -2e*x2。
所以我們要修正參數的方式就會是w1' = w1 + α*e*x1  ,  w2' = w2 + α*e*x2。
然後持之以恆的算下去,我們就會慢慢邁向理想的參數設定了~(好勵志)。

小提醒

剛剛那張參數空間中錯誤值的圖看起來很直觀,就是中間那點的error最小。可是現實世界通常是長成這個樣子:
頓時之間感受到人間的險惡是否。因為我們不知道到底哪一個凹谷才是真正的最小值,所以一般而言我們都需要從一千個不同的起始條件開始跑,最後再看看誰的error真正最小,才不會被local minimum迷惑了喔。

Comments