咒語入門(數學符號入門)神經網路篇
來自專欄生命是終極技術
很久以前,生物學家們發現大腦的運轉機制是這樣的:
大腦里有很多神經元,互相連接。
當一個神經元興奮的時候,他會給附近的神經元發信號,附近的神經元和它關係好的,就興奮,關係不好的,就不興奮。
比如體驗甜味的神經元(們)和開心的神經元(們)關係比較好,所以哈根達斯是會讓妹子們開心的。
於是數學家們立刻寫下了公式
這個公式很簡單,表示變數x引起了y的變化。數學家生怕人們看不懂它和神經元的關係,他又豐富了一下公式:
所以這個式子表示 號神經元和 號神經元的關係(數學家喜歡用編號給別人起名字)。 是 開心與否, 是 開心與否。
比如說,如果 是個大的正數,表示i和j關係很好,當i開心的時候(x為正),y會更加開心。而如果 是個負數,就表示它們關係不好,當 開心的時候, 反而不開心。
這個 就是weight的首字母。weight是重量的意思,代表他在他心中的分量。
當然,數學家考慮到這個模型實在太簡單,於是又加了一個參數:
b是bias的首字母,代表 的偏見。於是完美解決了大家高興到某個程度, 才會高興的這種複雜人際關係。
但是別高興太早,王二跑過來說。人家生物學家指的是神經形成的網路,你這才描述了兩個神經元。
於是數學家寫下:
數學家說:這個可以表示很多個神經元之間的關係。
王二自然不滿意,說,你作弊,你就是換成了大寫字母。
數學家此時微微一笑,說,這個大寫字母代表矩陣。
王二仔細一看,上面的式子竟然自動變成了:
可不是嗎,誰在誰心中的分量,誰的偏見,都有寫在上面。
而且因為矩陣的元素可更多,這個式子可以變成2個人的關係,也可以變成3個人的關係,也可以是4個人的關係。。。
總之,多少個人都不怕了。
但是王二覺得數學家很可怕。
數學家說,你只要給我 ,以及相應的W和B,我就能計算出相應的Y。
王二說,我信。可是那一坨x是什麼玩意?
數學說,那坨x實際上就是上面矩陣中的X。X是豎的,不太方便寫下來。於是我就橫過來,用小括弧括起來,相當於豎著的中括弧括起來的。對了,我們也稱這種一行小括弧叫做向量。
王二翻了個白眼。早說向量我不就明白了。(我高中學過向量呢,驕傲)
王二現在絞盡腦汁找數學家的茬。終於讓他找著了。他拿著文獻甩在數學家臉上:
你這個模型,叫做感知機。弱點在於只有一層網路(矩陣只乘了一次),無法實現異或運算。
此時數學家微微一笑。
我們只要加入一個隱藏層(就是 )就可以實現兩層的網路啦。如果我們願意,可以加任意多層網路。
不過,數學家說,這個Y我們可以展開,最後發現,實質上和一層網路是等價的。證明過程留給有興趣的讀者自證。
所以我們需要引入非線性的激活函數。
首先解釋一下激活函數:就是x和y的關係函數。
然後解釋一下線性,簡單理解起來,函數圖像是一條直線的就是線性。(當然,這個理解真的很天真)
比如我們用一個非線性函數:
因為它是一條折線,所以非線性。(這個函數就是傳說中的ReLu)
現在我們神經網路大概變成:
我們舉個現實的例子:手寫識別。
手寫識別的時候,我們一次識別一個數字。
我們的輸入 是一張圖片。那麼這張圖片我們固定好了大小,比如是20x20的,那麼就有400個像素,這些像素或者白色,或者黑色。於是 就是一個400個元素的向量。
而Y呢?有兩種實現方式,一種是一個元素的向量,這個元素取值為0-9,另一種是10個元素的向量,其中每個元素的取值都是0或者1。第幾號元素取值為1表示選中了這個號碼。
一般的實現里是第二種。我們也不搞特殊化。
現在 和 中包含茫茫多的小 ,我們要找到它們的值。找參數的值的過程,稱之為「訓練」。
我們的訓練樣本,是一堆(n個)正確的X和Y。寫成數學符號是
我們從中取出一個輸入 ,也知道對應的 。
我們隨意設置參數,然後根據 計算出對應的 。
此時我們會發現 和正確的 是不一樣的(廢話,我們隨意設置的參數)。我們想衡量一下這個有多不一樣。
於是數學家們甩給我們平方和公式,說這個可以計算「損失」(偏離正確的道路的程度)
我們用同樣的參數,將訓練樣本中所有的樣本(有n個元素)都計算一遍損失。於是,我們得到一個向量
而總體損失就是:
我們接下來就可以訓練了。我們隨便取一堆參數,計算 ,如果不滿意,則再重新隨機選擇一堆參數。直到我們滿意為止。
這個訓練方式,稱為「猴子訓練法」。不過,我更願意翻譯為「瞎蒙訓練法」。它基本上是訓練不出滿意的參數的。
這時候生物學家又出場了。他們說,你們知道進化論嗎?知道人工選擇嗎?
知道知道,不就是適者生存嘛。於是,又有了下面的進化訓練法。
我們將神經網路的參數看成是一個大矩陣 ,那麼我們隨機取值n個W。
然後,我們計算出,對應的損失就是
這些損失有大有小,幹掉那一半損失比較大的(這叫人工選擇)。然後在剩餘的對應的參數裡面隨機改動一下(改某個矩陣中的某一個數字),這叫突變。
然後再來一輪,一輪又一輪,直到達到我們比較滿意的「損失程度」。
還別說,這個方法還真的可以!
這個時候,數學家又出場了。你們這個訓練方式不太適合計算機喲。我發現了一個更快的訓練方式,「梯度下降法」。
首先,把這個問題轉化成數學問題。
這是一個函數 求最小值的問題。
就是問W取值為何值時, 的值最小。
如果這個函數比較簡單,我們直接求導,令 即可。但是可惜這個函數太複雜了。
於是,我們隨機取W的值,然後按照梯度往下走就可以了。那麼梯度是什麼呢?我們待會再講。
先講講之前的進化演算法,就是保證了兩點:
- 在原來的W附近取得新的W
- 新的W所對應的 基本上是不斷變小的。
我們的梯度下降法優化的是在優化第二點。
梯度是什麼呢?
首先, ,但我們簡化一下,假如W只有兩個元素。
,把它看成平面上的一個點。
然後我們把 換個名字 ,於是
熟悉吧,這就是 軸高度啊。於是我們的梯度定義就出來了:
在點 處高度變化最劇烈的方向。記做 或
公式是:
看這裡又有很多新的符號。倒三角是梯度,我們已經解釋過了。那個倒過來的e, 是偏導數的意思。
設有二元函數 ,若以y為定值而非變數,則此時函數變成一元函數 ,此時對其求導 ,則結果中含有y,這就是x的偏導
當然,我們也可以寫成 ,至於分子上什麼時候放f(函數名),什麼時候放z(因變數),這個存乎一心(就是瞎jb亂放也沒問題)
這種表示一個向量。一般用 來表示空間xyz軸對應的基。
那麼基是什麼呢?就是單位1.
回過頭來說梯度公式。你可能好奇為啥它是變化最劇烈的方向,那麼你去自己證明吧。
我們的梯度公式可以推廣到任意維空間。
總之,我們沿著梯度的負方向,就可以保證每次 都不斷變小(跑過頭的時候除外)。
這就是梯度下降法。
待續吧
推薦閱讀: