天天看點

AI算法的數學原理

作者:底層技術棧

#頭條創作挑戰賽#

深度學習的出現,讓視覺識别得到了普遍的應用,這裡簡單說說它的數學原理。

黑白圖像是一個二維的矩陣:寬度、高度,就可以确定像素值的位置。

彩色圖像是一個三維的矩陣:寬度、高度、顔色,就可以确定像素值的位置。

原始圖像裡,大量的資訊都是線性相關的:占的位元組數很多,而且不能疊加。

圖像處理,就是把原始圖像通過一組基展開,讓它的每一維之間是線性無關的。

說白了,就是把曲線坐标系盡量變成直角坐标系,讓表達弧長的系數矩陣盡量簡化。

看過我前幾篇廣義相對論的文章的,應該知道:

直角坐标系裡,弧長的平方是 ds^2 = dx^2 + dy^2.

曲線坐标系裡,弧長的平方是 ds^2 = Adx^2 + Bdy^2 + Cdxdy,它的坐标實際上不是線性無關的,因為它有交叉的二次項dxdy。

是以,直角坐标系裡弧長的矩陣隻有2個值不為0,但曲線坐标系裡不為0的值更多。

如下圖:

AI算法的數學原理

人眼周圍的像素,肯定都是相關的!

整個人臉的像素都是相關的,因為人臉也是一個特别複雜的曲面:

它也有個曲面方程:f(x, y, z, c) = 0.

x, y, z表示三維坐标,c表示顔色。

雖然沒法簡單地給出人臉的解析式,但可以用神經網絡去近似它:

1,人臉是連續的。

就算臉上受傷了那也是連續的,否則麻煩就大了[捂臉]

既然是連續的,那麼極值點最多隻有可數個,為什麼?

極值的定義是:在x0的某個鄰域 N(x0, r) 内,有 f(x0) >= f(x) 或 f(x0) <= f(x).

這個鄰域有一個足夠小的半徑r,在這個鄰域内必然存在至少1個有理數。

因為有理數在實數裡是稠密的,即:實數的任意一個鄰域裡都存在有理數。

那麼,這個有理數就可以作為這個極值點的代号:它們是一一對應的。

并且,有理數是可數的。

是以,連續函數的極值點,最多隻有可數個。

2,可數,就可以用離散的序列去近似。

不要去想數學上那些古怪的函數,在實際工程上暫時遇不到那類函數:任何人的臉都是連續的曲面。

既然是連續曲面,它就可以用折線去近似。

AI算法的數學原理

用折線去拟合曲線

極值點之間的曲線,可以認為是單調的!

是以,機器學習上才可以用sigmond、tanh、relu去當激活函數:它們3個都是單調的。

tanh(WX + b):

權值W和偏置b确定目前折線的斜率和截距,

tanh函數确定這個位置的折線要不要激活:輸出-1或1,還是輸出随着WX + b變化。

要在極值點以外,讓WX + b落在tanh()的非激活區!

上圖的紅線與綠線之間的空白區域,就是拟合的誤差。

增加折線的數量,也就是增加神經元的個數,就可以減少誤差。

是以,三層神經網絡就可以把連續函數拟合到任意精度。

AI算法的數學原理

tanh的近似圖像

3,BP算法的收斂性,

權值W和偏置b的數值,是通過誤差反傳算法(BP算法)來疊代求解的。

訓練樣本,就是人臉曲面的采樣資料。

雖然不知道人臉曲面的解析式,但隻要它能在一組基上展開,那麼它就可以表示成級數的形式:

把不同的樣本X帶進這個級數之後,形成的關于系數a的一次方程組的行列式 != 0:

是以,當獨立的樣本數 > N的時候,解是存在的、唯一的。

是以,模型越複雜,需要的樣本就越多。

但是不知道g(X)的解析式(而且這個矩陣很大),沒法直接求解(隻能疊代)。

BP算法要想随着疊代而收斂,疊代算子T就必須滿足壓縮映射條件:

|| Tx - Tx' || < || x - x'||.

同類樣本之間的“神經距離”,應該随着疊代,比樣本之間的歐幾裡德距離要小。

這樣,“神經距離”才會類似于疊代次數的等比數列,比值q < 1 是以收斂。

是以,選擇合适的學習率是非常重要的!

是以,神經網絡的調參非常的坑[捂臉]

4,梯度消失問題,

因為sigmond / tanh的值越接近極限,導數越小,是以在網絡層數太多的時候很難訓練。

然後,就出現了relu函數。

AI算法的數學原理

leaky_relu函數

随着網絡層數增多,不管梯度 > 1 還是 < 1,都會導緻梯度随着層數而急劇增大或減少!

這會讓學習率很難選,因為它在每一層的效果不一樣。

最好的梯度是1,這樣所有層的訓練難度是一樣的。

然後,就出現了relu函數:x > 0時,y = x;x < 0時,y = 0.

後來,為了避免relu在x < 0時沒法訓練的問題,又改成了leaky_relu:x > 0時,y = x;x < 0時,y = 0.2x.

讓函數在非激活區也有一個 < 1的梯度,勉強可以訓練。

這麼一改進之後,深度學習的模型終于可以訓練了[呲牙]

實際上訓練起來依然很複雜,如果樣本的分類數量很多,還是一樣的難訓練[捂臉]

5,什麼是非線性?

實際上,隻要f(x) 對x的2個範圍有不同的斜率,就是非線性。

f(x) = x是線性的,因為它對所有的x都有斜率1。

f(x) = tanh(x) 是非線性的,因為它的斜率一直随着x變化。

f(x) = {

x | x >= 0;

0.2x | x < 0} 也是非線性,因為它對正負數的斜率不一樣。

非線性的作用,就是在WX + b落到極值點之外的時候,要有一個非激活區。

有1個非激活區就行,因為可以用兩層網絡的串聯形成2個非激活區。

(就跟模拟電路的高通濾波+低通濾波 = 帶通濾波一樣)

是以,relu做激活函數時,網絡的層數比sigmond的要多。

6,讓神經網絡使用“最少的坐标”,

如果選擇的基是最合适的,那麼把原始圖像展開所需的不為0的系數就會最少。

在深度學習的訓練中,怎麼做到這點?

實際是先讓網絡的權值随着層數的增加越來越少,然後用BP算法去訓練它[呲牙]

因為每個樣本都有類型的标注,同類之間的誤差要盡量小,不同類之間的誤差要盡量大:

當權值越來越少時,BP算法一樣會盡量增大不同樣本之間的距離;

然後,系數和基就都訓練出來了

這個過程跟寫代碼一樣:程式員為了減少代碼行數,然後不斷地把重複代碼寫成函數。

然後,函數越來越多,代碼越來越少。

函數就是“基”,實參就是“系數”,每個版本就是一次“BP算法”。

繼續閱讀