#頭條創作挑戰賽#
深度學習的出現,讓視覺識别得到了普遍的應用,這裡簡單說說它的數學原理。
黑白圖像是一個二維的矩陣:寬度、高度,就可以确定像素值的位置。
彩色圖像是一個三維的矩陣:寬度、高度、顔色,就可以确定像素值的位置。
原始圖像裡,大量的信息都是線性相關的:占的字節數很多,而且不能疊加。
圖像處理,就是把原始圖像通過一組基展開,讓它的每一維之間是線性無關的。
說白了,就是把曲線坐标系盡量變成直角坐标系,讓表達弧長的系數矩陣盡量簡化。
看過我前幾篇廣義相對論的文章的,應該知道:
直角坐标系裡,弧長的平方是 ds^2 = dx^2 dy^2.
曲線坐标系裡,弧長的平方是 ds^2 = Adx^2 Bdy^2 Cdxdy,它的坐标實際上不是線性無關的,因為它有交叉的二次項dxdy。
所以,直角坐标系裡弧長的矩陣隻有2個值不為0,但曲線坐标系裡不為0的值更多。
如下圖:
人眼周圍的像素,肯定都是相關的!
整個人臉的像素都是相關的,因為人臉也是一個特别複雜的曲面:
它也有個曲面方程: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,可數,就可以用離散的序列去近似。
不要去想數學上那些古怪的函數,在實際工程上暫時遇不到那類函數:任何人的臉都是連續的曲面。
既然是連續曲面,它就可以用折線去近似。
用折線去拟合曲線
極值點之間的曲線,可以認為是單調的!
所以,機器學習上才可以用sigmond、tanh、relu去當激活函數:它們3個都是單調的。
tanh(WX b):
權值W和偏置b确定當前折線的斜率和截距,
tanh函數确定這個位置的折線要不要激活:輸出-1或1,還是輸出随着WX b變化。
要在極值點以外,讓WX b落在tanh()的非激活區!
上圖的紅線與綠線之間的空白區域,就是拟合的誤差。
增加折線的數量,也就是增加神經元的個數,就可以減少誤差。
所以,三層神經網絡就可以把連續函數拟合到任意精度。
tanh的近似圖像
3,BP算法的收斂性,
權值W和偏置b的數值,是通過誤差反傳算法(BP算法)來叠代求解的。
訓練樣本,就是人臉曲面的采樣數據。
雖然不知道人臉曲面的解析式,但隻要它能在一組基上展開,那麼它就可以表示成級數的形式:
把不同的樣本X帶進這個級數之後,形成的關于系數a的一次方程組的行列式 != 0:
所以,當獨立的樣本數 > N的時候,解是存在的、唯一的。
所以,模型越複雜,需要的樣本就越多。
但是不知道g(X)的解析式(而且這個矩陣很大),沒法直接求解(隻能叠代)。
BP算法要想随着叠代而收斂,叠代算子T就必須滿足壓縮映射條件:
|| Tx - Tx' || < || x - x'||.
同類樣本之間的“神經距離”,應該随着叠代,比樣本之間的歐幾裡德距離要小。
這樣,“神經距離”才會類似于叠代次數的等比數列,比值q < 1 所以收斂。
所以,選擇合适的學習率是非常重要的!
所以,神經網絡的調參非常的坑[捂臉]
4,梯度消失問題,
因為sigmond / tanh的值越接近極限,導數越小,所以在網絡層數太多的時候很難訓練。
然後,就出現了relu函數。
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算法”。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!