咒語入門(數學符號入門)神經網路篇

咒語入門(數學符號入門)神經網路篇

來自專欄生命是終極技術

很久以前,生物學家們發現大腦的運轉機制是這樣的:

大腦里有很多神經元,互相連接。

當一個神經元興奮的時候,他會給附近的神經元發信號,附近的神經元和它關係好的,就興奮,關係不好的,就不興奮。

比如體驗甜味的神經元(們)和開心的神經元(們)關係比較好,所以哈根達斯是會讓妹子們開心的。


於是數學家們立刻寫下了公式

y=wx

這個公式很簡單,表示變數x引起了y的變化。數學家生怕人們看不懂它和神經元的關係,他又豐富了一下公式:

y=w_{i,j}x

所以這個式子表示 i 號神經元和 j 號神經元的關係(數學家喜歡用編號給別人起名字)。 xi 開心與否, yj 開心與否。

比如說,如果 w_{i,j} 是個大的正數,表示i和j關係很好,當i開心的時候(x為正),y會更加開心。而如果 w_{i,j} 是個負數,就表示它們關係不好,當 i 開心的時候, j 反而不開心。

這個 w 就是weight的首字母。weight是重量的意思,代表他在他心中的分量。

當然,數學家考慮到這個模型實在太簡單,於是又加了一個參數:

y=w_{i,j}x+b

b是bias的首字母,代表 j 的偏見。於是完美解決了大家高興到某個程度, j 才會高興的這種複雜人際關係。


但是別高興太早,王二跑過來說。人家生物學家指的是神經形成的網路,你這才描述了兩個神經元。

於是數學家寫下:

Y=WX+B

數學家說:這個可以表示很多個神經元之間的關係。

王二自然不滿意,說,你作弊,你就是換成了大寫字母。

數學家此時微微一笑,說,這個大寫字母代表矩陣。

王二仔細一看,上面的式子竟然自動變成了:

left[ egin{matrix} y_1 \ y_2 end{matrix} 
ight]= left[ egin{matrix} w_{1,1} & w_{1,2} \ w_{2,1} & w_{2,2} end{matrix} 
ight] left[ egin{matrix} x_1 \ x_2 end{matrix} 
ight] + left[ egin{matrix} b_1 \ b_2 end{matrix} 
ight]

可不是嗎,誰在誰心中的分量,誰的偏見,都有寫在上面。

而且因為矩陣的元素可更多,這個式子可以變成2個人的關係,也可以變成3個人的關係,也可以是4個人的關係。。。

總之,多少個人都不怕了。

但是王二覺得數學家很可怕。

數學家說,你只要給我 X=(x_1,x_2,x_3,cdots,x_n) ,以及相應的W和B,我就能計算出相應的Y。

王二說,我信。可是那一坨x是什麼玩意?

數學說,那坨x實際上就是上面矩陣中的X。X是豎的,不太方便寫下來。於是我就橫過來,用小括弧括起來,相當於豎著的中括弧括起來的。對了,我們也稱這種一行小括弧叫做向量。

王二翻了個白眼。早說向量我不就明白了。(我高中學過向量呢,驕傲)

王二現在絞盡腦汁找數學家的茬。終於讓他找著了。他拿著文獻甩在數學家臉上:

你這個模型,叫做感知機。弱點在於只有一層網路(矩陣只乘了一次),無法實現異或運算。

此時數學家微微一笑。

H_1=W_1X+B_1 \ Y=W_2 H_1+B_2

我們只要加入一個隱藏層(就是 H_1 )就可以實現兩層的網路啦。如果我們願意,可以加任意多層網路。

不過,數學家說,這個Y我們可以展開,最後發現,實質上和一層網路是等價的。證明過程留給有興趣的讀者自證。

所以我們需要引入非線性的激活函數。

首先解釋一下激活函數:就是x和y的關係函數。

然後解釋一下線性,簡單理解起來,函數圖像是一條直線的就是線性。(當然,這個理解真的很天真)

比如我們用一個非線性函數:

f(x)= egin{equation} egin{cases} wx,xgeq0 \ 0,x<0 end{cases} end{equation}

因為它是一條折線,所以非線性。(這個函數就是傳說中的ReLu)

現在我們神經網路大概變成:

H=f_{W1}(X)\ Y=f_{W2}(H)


我們舉個現實的例子:手寫識別。

手寫識別的時候,我們一次識別一個數字。

我們的輸入 X 是一張圖片。那麼這張圖片我們固定好了大小,比如是20x20的,那麼就有400個像素,這些像素或者白色,或者黑色。於是 X 就是一個400個元素的向量。

而Y呢?有兩種實現方式,一種是一個元素的向量,這個元素取值為0-9,另一種是10個元素的向量,其中每個元素的取值都是0或者1。第幾號元素取值為1表示選中了這個號碼。

一般的實現里是第二種。我們也不搞特殊化。

現在 f_{W1}f_{W2} 中包含茫茫多的小 w ,我們要找到它們的值。找參數的值的過程,稱之為「訓練」。

我們的訓練樣本,是一堆(n個)正確的X和Y。寫成數學符號是 ((X_1,Y_1),(X_2,Y_2),(X_3,Y_3),cdots,(X_n,Y_n))

我們從中取出一個輸入 X_1 ,也知道對應的 Y_1

我們隨意設置參數,然後根據 X_1 計算出對應的 Y_1』

此時我們會發現 Y_1 和正確的 Y_1 是不一樣的(廢話,我們隨意設置的參數)。我們想衡量一下這個有多不一樣。

於是數學家們甩給我們平方和公式,說這個可以計算「損失」(偏離正確的道路的程度)

loss(Y,Y)=Sigma (y_i-y_i)^2

我們用同樣的參數,將訓練樣本中所有的樣本(有n個元素)都計算一遍損失。於是,我們得到一個向量

L=(loss(Y_1,Y_1),loss(Y_2,Y_2),loss(Y_3,Y_3),cdots,loss(Y_n,Y_n))

而總體損失就是:

l=Sigma loss(Y_i,Y_i)/n

我們接下來就可以訓練了。我們隨便取一堆參數,計算 l ,如果不滿意,則再重新隨機選擇一堆參數。直到我們滿意為止。

這個訓練方式,稱為「猴子訓練法」。不過,我更願意翻譯為「瞎蒙訓練法」。它基本上是訓練不出滿意的參數的。

這時候生物學家又出場了。他們說,你們知道進化論嗎?知道人工選擇嗎?

知道知道,不就是適者生存嘛。於是,又有了下面的進化訓練法。

我們將神經網路的參數看成是一個大矩陣 W ,那麼我們隨機取值n個W。

round_1=(W_1,W_2,W_3,cdots,W_n)

然後,我們計算出,對應的損失就是

L_1=(l_1,l_2,l_3,cdots,l_n)

這些損失有大有小,幹掉那一半損失比較大的(這叫人工選擇)。然後在剩餘的對應的參數裡面隨機改動一下(改某個矩陣中的某一個數字),這叫突變。

然後再來一輪,一輪又一輪,直到達到我們比較滿意的「損失程度」。

還別說,這個方法還真的可以!


這個時候,數學家又出場了。你們這個訓練方式不太適合計算機喲。我發現了一個更快的訓練方式,「梯度下降法」。

首先,把這個問題轉化成數學問題。

這是一個函數 l(W) 求最小值的問題。

就是問W取值為何值時, l 的值最小。

如果這個函數比較簡單,我們直接求導,令 l(W)=0 即可。但是可惜這個函數太複雜了。

於是,我們隨機取W的值,然後按照梯度往下走就可以了。那麼梯度是什麼呢?我們待會再講。

先講講之前的進化演算法,就是保證了兩點:

  1. 在原來的W附近取得新的W
  2. 新的W所對應的 l 基本上是不斷變小的。

我們的梯度下降法優化的是在優化第二點。

梯度是什麼呢?

首先, W=(w_1,w_2,w_3,cdots,w_n) ,但我們簡化一下,假如W只有兩個元素。

W=(x,y) ,把它看成平面上的一個點。

然後我們把 l 換個名字 z ,於是 l(W)=l(x,y)=z(x,y)

熟悉吧,這就是 z 軸高度啊。於是我們的梯度定義就出來了:

在點 P=(x,y) 處高度變化最劇烈的方向。記做 mathrm{grad} f(x,y)	riangledown f(x,y)

公式是:

	riangledown f(x,y)=frac{partial f}{partial x}vec i +frac{partial f}{partial y}vec j

看這裡又有很多新的符號。倒三角是梯度,我們已經解釋過了。那個倒過來的e, partial 是偏導數的意思。

設有二元函數 z=f(x,y) ,若以y為定值而非變數,則此時函數變成一元函數 z=f(x) ,此時對其求導 frac{mathrm dz}{mathrm dx} ,則結果中含有y,這就是x的偏導 frac{partial z}{partial x}

當然,我們也可以寫成 frac{partial f}{partial x} ,至於分子上什麼時候放f(函數名),什麼時候放z(因變數),這個存乎一心(就是瞎jb亂放也沒問題)

vec i 這種表示一個向量。一般用 vec i,vec j,vec k 來表示空間xyz軸對應的基。

那麼基是什麼呢?就是單位1.

回過頭來說梯度公式。你可能好奇為啥它是變化最劇烈的方向,那麼你去自己證明吧。

我們的梯度公式可以推廣到任意維空間。

總之,我們沿著梯度的負方向,就可以保證每次 l 都不斷變小(跑過頭的時候除外)。

這就是梯度下降法。


待續吧


推薦閱讀:

TAG:數學符號 | 數學 | 機器學習 |