2017年5月6日 星期六

為何Neural Network要用到線性代數?

Neural Network用到許多基礎數學:線性代數和微積分。用微積分的原因,之前講過了:
為何Neural Network要用到微積分?

但為何會用到線性代數?是為了讓程式比較好寫。並且,只有一個Node不需要線性代數,多個Node才需要。

我們先考慮一個Node的情況:


為了要調整Weight,去找Error Function的最小值,我們用w對E做微分:


這個公式的由來,請參考此篇:
如何計算Neural Network的Error Function的斜率?

接下來,用Gradient Descent方法,調整weight,程式會這樣寫。

w = w + △w 

每次微調weight的量為:


為何weight的微調量會是負的?以及Learning Rate的作用為何?請參考:
Learning Rate在Neural Network的作用

前面說過,只有一個Node是不需要線性代數,所以先從簡單的2*2 Node開始,將線性代數拉進來:


上圖,我們觀察到,2*2 Node之間,穿插了4個△w ,套用上面的公式,這4個△w 用下面4條式子表示:


可以用Matrix表達這4條式子。對Matrix的基本運算不熟的人,可以上網去搜,去堆敲,可以發現,其實沒什麼大不了的。不過就是將4條式子,改用簡精的1條式子表達而己,其運算方式,和運算量,都沒變:


再整理一下:


這樣是否更精簡了?x頭上的那個T是Transposing的意思,這裡就不多解釋了。大家可以上網去搜,自己推敲一下。

再強調一次,這裡的e和E,雖然都叫Error,卻是完全不同的功能。前篇有提醒過大家:
Back-Propagating Errors

將來,我會把Back-Propagating Error加進來,去推導完整的3-Layer Neural Network公式。這樣,大家用這些公式,應該就知道如何Coding了。

當然,這些公式,不是我發明的。只是從程序員的角度,改一下書中的符號,除了能幫助理解,也為了將來Coding方便。因為有時候,書中的符號會讓人混淆,如將e和E混合使用,造成理解錯誤。所以自己定義符號,然後再重新推導公式一遍,就像Coding要遵循Coding Standard一樣,這樣一來,有了推導的過程,就能清楚了解事物的原理。這一段是題外話。

-Count

沒有留言:

張貼留言