天天看點

深度學習入門之從感覺機開始

深度學習的一些個人學習(1)

首先我們從感覺機開始說起。

通常感覺機的形式如下圖:

深度學習入門之從感覺機開始

其中 x1 x2 x3 是輸入,output是輸出。

當我們想由輸入得到輸出時,可以按照如下的公式得到:

output=⎧⎩⎨⎪⎪⎪⎪01if ∑jwjxj≤ thresholdif ∑jwjxj> threshold(1)

你可以這樣了解: x1,x2,x3 是衡量結果、影響最終結果判斷的因素,而 wj 則是用來判斷這些因素在對結果的影響中,能占多大的權重,也就是會多大程度上影響結果。通過(1)式我們也可以看出來,通過調節不同的threshold,我們可以獲得不同的判斷結果。

但是很明顯的,這麼簡單的模型不能了解我們這個世界,于是我們讓中間再加兩層:

深度學習入門之從感覺機開始

在這裡,輸入的的因素不僅僅做出一個判斷,而是三個。而這三個輸出結果,又成為下一層的輸入,綜合這一次的權重,影響第三層的結果判斷。以此類推,我們可以增加好多層的感覺機結構。

雖然這種情況下還是不能很好的描述我們這個世界,但是起碼朝着了解世界更前進了一步。

從上面的結構來看,我們會以為多層的感覺機有多個輸出結果,但是實際上隻有一個。我們這樣畫,隻是為了表明一個感覺機的多種不同的可能結果,作為下一層的輸入來說,是怎麼樣組合起來,是怎樣影響下一層的輸出的。這樣看起來比較友善些。

我們簡化下公式(1):

  1. 我們用向量點乘來代替 ∑jwjxj :

    w⋅x=∑jwjxj

  2. 将thresh_hold進行轉化,放到方程裡面去 b≡−thresh_hold

    通過上面的轉化,我們可以重寫(1)

    output={01if w⋅x+b≤0if w⋅x+b>0(2)

b我們稱之為偏差,可以了解為我們讓結果輸出為1的難易程度:b越大,結果為1就越難;b越小,結果為1就越簡單。

這樣一看,公式是不是清爽了好多。

通過感覺機,我們可以“制作”簡單的與門,或門,或者與非門。

例如我們看下面的例子:

深度學習入門之從感覺機開始

我們可以看到:輸入(0,0) ,(-2)* 0 + (-2)*0 +3 = 3 ,結果輸出為正;

我們輸入(1,0)(0,1),都會輸出結果1;而如果輸入(1,1),就會輸出結果-1;

這樣,我們就實作了一個與非門!

利用這個與非門,我們可以實作一些更複雜的邏輯,比如:

計算bitwise sum,也就是bit和;還可以用來辨別當x1 x2都設定為1時進行辨別:

深度學習入門之從感覺機開始

可以自己看下結果:當x1, x2均為輸入1時, x1x2結果為1,其餘為0;

然後可以自己再設定下x1 x2分别為0,1,看下 x1⊕x2 ,可以看到結果就是他們的bit相加的結果。

注意,這裡顯示的器件都是nand門,也就是與非門。

通過這裡我們可以看到感覺機的一些潛力:他可以根據我們輸入的一些因素,來對最終的結果産生影響,而不用我們人為的去定義一些規則。是以我們可以更深入的去挖掘它。

sigmod 神經元

想一下:我們想要使用感覺機來處理結果,比如我們有一個要處理的圖像,圖像是數字8。我們的感覺機最終的輸出結果是數字9.那麼如何來進行調整呢?加入你有一個小扳手,可以輕輕的調動參數w的值的話,那麼理想的情況應該是:我稍微動一點扳手,也就是稍微動下w,那麼最終的結果就稍微的變下,在這裡我們可以了解為圖像是9的機率小了些,而圖像為8的機率大了些;我使勁的動了下調整的扳手,那麼相對的8,9 的機率也會變大。這種情況下,實在是太友善我們調整參數了。

深度學習入門之從感覺機開始

但是實際上你要相信,美好的事情不會這麼容易發生。

更通常的情況是,你稍微扳了下扳手,這一層的輸出結果沒啥變化;你使勁扳了下,還是沒啥變化;你再扳,結果噗的發生了突變,比如說從0變到了1,而這種突變使得後面各層的輸入輸出都會發生巨大變化!

牽一發而動全身,南美的蝴蝶啊,同志們。

是以,如果你不斷的調參,最後的輸出即使是9,那麼在用這個網絡去預測别的圖像的時候,結果也會變得十分的有問題。

那麼怎麼解決這個問題呢?很明顯,我們就找一個“動一下參數,結果就稍微動一下的輸出函數”就可以了。而sigmod函數就是我們的真命天子了。

sigmod函數如下:

σ(z)≡11+e−z.(3)

為了避免你忘了z,我們将z帶入一下:

11+exp(−∑jwjxj−b).(4)

這就是我們新的輸出公式了。

為什麼我們要選擇這個函數作為我門的輸出公示呢?

一開始,我們說,是為了實作“你動一點,我動一點”這個功能而選擇的它。

首先,讓我們來看下這個函數本身,能不能作為一個激活函數。

當z很大時,結果趨向于1;當z很小時,結果趨向于0;

我們看下該函數的圖形:

從該圖形我們也可以看出,sigmod函數的有着很好的平滑性,這種平滑性的有點就是:我們在對結果求導之後,得到的結果:

Δoutput≈∑j∂output∂wjΔwj+∂output∂bΔb,(5)

sigmod的這種平滑性,使得最終的結果也可以可控。想象一下,如果結果直接是

如果直接是這種形狀,那麼導數直接為0,就會影響我們的“微調”。

為什麼我們用這個函數,而不是用其他的呢?實際上,我們也會用其他的函數來作為激活函數。我們選用sigmod函數,是因為sigmod函數的求導有着十分好的性質,這個性質友善我們進行處理。

于是,通常情況下,我們可以得到如下的模型:

深度學習入門之從感覺機開始

這種模型,就是深度學習的模型了。

當然有時候,由于一些曆史的原因,我們也會稱之為multilayer perceptrons or*MLPs*。

接下來我們用一個例子來詳細的說明。這個例子是用來識别手寫字元的,例如:

深度學習入門之從感覺機開始

我們希望可以從這個圖檔中,把裡面的數字識别出來。

假設我們的輸入為x,所希望的輸出為y,也就是說我們給了一個字元“5”,那麼輸出的結果y(x)就是“5”。設定輸入輸出關系為y = y(x). 而a,則是我們輸入字元“5”,我們通過深度學習網絡能得到的結果。至于這個結果是5,還是其他的結果,就取決于我們的這個學習網絡的能耐了。

那麼,怎麼來衡量這個網絡結果的好壞呢?我們希望的情況是,通過調整合适的w和b,進而使得理想結果y(x)與a的結果盡量的小。我們使用代價函數來表征這個結果:

C(w,b)≡12n∑x∥y(x)−a∥2.(6)

我們稱該方程為二次代價方程,也成為均值平方差或者MSE。

從方程的形式我們可以看出來, C(w,b) 是非負的。而且,當我們的網絡預測的很好時,它的結果就是 C(w,b)≈0 ;當預測的結果很差時,它的結果就是 C(w,b) 很大。是以,我們希望通過調整w,b,使得(6)很小,進而使得誤差很小。

怎麼找w,b呢?

這時候,梯度下降gradient descent 就要出場了。

也許有人會問了,我們的本心是為了預測圖檔準确識别的數量,為什麼不直接去衡量圖檔識别的準确率,而是間接的要通過一個二次方的代價呢?本來這是可以的,但是有個問題:圖檔的準确率對于w和b來說不是平滑可導的, 大部分情況下,小的w和b的改變對于結果沒啥影響,這就很不利于調整參數。而如果用(6)式的話,就會有一個平滑可導的結果,進而可以讓我們可以友善的去調整參數。

但是也會有人問,想要一個平滑可導的函數,好。可是,為什麼非得選二次方呢?是随機選的嗎?我們選其他的,那麼不就得到了完全不同的w和b?

這是有道理的,後面我們再探讨這個事情。但是,二次導數在大部分情況下,是切實可行的,是以我們暫時先用這個進行計算。

接下來,我們暫時忘記我們要做的事情,把目标轉移到另外一個問題上來。盡管可能你覺得很奇怪(當然,我知道其實你并不覺得),這個問題的探讨會很有幫助。

假設我們有一個函數 C(v) ,其中 v=v1,v2,v3…… 假設我們隻有兩個參數,我們可以畫出如下的圖形:

深度學習入門之從感覺機開始

很明顯的,我們可以看到有個谷底,這個谷底就是我們夢寐以求的最小值。然後我們就知道,我們肯定可以找到這個最小的點。但是我們肯定不能用肉眼來看最小值,而是用積分的方法來求。但是這個積分的方法話,對于隻有幾個參數的來說還行,但是參數一多,根本就無能為力了。

那麼,我們該怎麼求呢?

想象一下,我們站在一個山谷的谷頂,向下扔球,這個球會怎麼樣呢?這個球會自然的向谷底的地方滑去(假如沒有摩擦力的話),那不正是我們期望的?!

假定一下,我們如果是個數學世界的造物主,有設定數學世界實體規律的能力,想要球按照上面的方式滾動,我們該怎麼設計呢?

假如我們隻有兩個方向,v1和v2,我們向v1方向移動了 ∇v1 ,向v2方向移動了 ∇v2 ,那麼我們可以知道總的移動:

ΔC≈∂C∂v1Δv1+∂C∂v2Δv2.(7)

是以,我們希望給 ∇v1,∇v2 找到一個值,使得 ∇C 為負值,這樣,就使得球不斷的往下走了麼!

我們用下式進行變化:

∇C≡(∂C∂v1,∂C∂v2)T.(8)

于是就可以得到:

ΔC≈∇C⋅Δv.(9)

是以,我們設定

Δv=−η∇C,(10)

這樣

ΔC≈−η∇C⋅∇C=−η∥∇C∥2

就一定是負值了!就一定可以向下走了!( η 設定為正值)

于是

v→v′=v−η∇C.(11)

這樣不斷地循環,我們就可以不斷地向下走了!一直走到世界的,不是,是谷的低谷!

而且,更好的是,我們不僅僅希望向下走,而且可以以最快的速度向下走,這個問題也通過這個公式解決了。

設想下,我們移動 ∇v ,希望極可能的減小C ,也就是盡可能的使 ΔC≈∇C⋅Δv 小。也就是說,限定 ∥Δv∥=ϵ 步長的情況下,使其最小。可以證明,在當 Δv=−η∇C 時會使其盡可能的小。

是以,既可以減小,而且又可以盡量小!

好了,重新回到我們的深度學習的世界中來。

在這裡, v1−>wk,v2−>bl ,是以我們可以設定為:

wkbl→→w′k=wk−η∂C∂wkb′l=bl−η∂C∂bl.(16)(17)

通過反複的疊代,我們可以找到C的最小值了。

再想一下,我門的代價函數是:

C(w,b)≡12n∑x∥y(x)−a∥2

設定

Cx≡∥y(x)−a∥22

于是就有 C=1n∑xCx ,求偏導則有: ∇C=1n∑x∇Cx

其中 x 是樣例點的個數。可以看出來,每次更新,都需要綜合考慮所有的樣例點進行計算,可見非常的耗時。

是以,為了提高速度,有一種随機梯度下降的方法,來進行計算梯度。這個方法的思想就是,選擇訓練樣本點中的一小部分來計算∇C ,通過這種處理,我們可以更快的來計算梯度下降。

那麼,為什麼我們可以這麼算呢?

你可以這樣假定:

∑mj=1∇CXjm≈∑x∇Cxn=∇C,(18)

這樣,我們就可以得到:

∇C≈1m∑j=1m∇CXj,(19)

wk→w′k=wk−ηm∑j∂CXj∂wk(20) \

bl→b′l=bl−ηm∑j∂CXj∂bl(21) \

由此可見,我們可以有這種随機梯度下降的方法,來計算我們的函數了。

neuralnetworksanddeeplearning Michael Nielsen

繼續閱讀