學習 tensorflow,caffe 等深度學習框架前,需要先了解一些基礎概念。本文以筆記的形式記錄了一個零基礎的小白需要先了解的一些基礎概念。
人工智能(Artificial Intelligence)——為機器賦予人的智能
"強人工智能"(General AI):無所不能的機器,它有著我們所有的感知(甚至比人更多),我們所有的理性,可以像我們一樣思考
"弱人工智能"(Narrow AI):弱人工智能是能夠與人一樣,甚至比人更好地執行特定任務的技術。例如,Pinterest 上的圖像分類;或者 Facebook 的人臉識別。
強人工智能是愿景,弱人工智能是目前能實現的。
機器學習—— 一種實現人工智能的方法
機器學習最基本的做法,是使用算法來解析數據、從中學習,然后對真實世界中的事件做出決策和預測。
深度學習——一種實現機器學習的技術
機器學習可以通過神經網絡來實現。可以將深度學習簡單理解為,就是使用深度架構(比如深度神經網絡)的機器學習方法。目前深度架構大部分時候就是指深度神經網絡。
神經網絡組成
一個神經網絡由許多神經元組成,每個圓圈是一個神經元,每條線表示神經元之間的連接。x 表示的輸入數據,y 表示的是輸出數據,w 表示每層連接的權重。w 也就是我們構造完神經網絡之后需要確定的。
最左邊的叫做輸入層,這層負責接受輸入數據。
最右邊的叫做輸出層,我們可以從這層獲取神經網絡輸出數據
輸入層和輸出層之間叫做隱藏層。隱藏層層數不定,簡單的神經網絡可能是 2-3 層,復雜的也可能成百上千層,隱藏層較多的就叫做深度神經網絡。
深層網絡比淺層網絡的表達能力更強,能夠處理更多的數據。但是深度網絡的訓練更加復雜。需要大量的數據,很多的技巧才能訓練好一個深層網絡。
問題:假設計算速度足夠快,是不是深度網絡越深越好?
不是。深度網絡越深,對架構和算法的要求就越高。在超過架構和算法的瓶頸后,再增加深度也是徒勞。
神經元(感知器)
神經網絡由一個個的神經元構成,而一個神經元也由三部分組成。
輸入權值 每個輸入會對應一個權值 w,同時還會有一個偏置值 b。也就是圖中的 w0。訓練神經網絡的過程,其實就是確定權值 w 的過程。
激活函數 經過權值運算之后還會經歷激活函數再輸出。比如我們可以用階躍函數 f 來表示激活函數。
輸出 最終的輸出,感知器的輸出可以用這個公式來表示
神經元可以擬合任意的線性函數,如最簡單擬合 and 函數。
and 函數真值表如上圖所示。取 w1 = 0.5;w2 = 0.5 b = -0.8。激活函數取上面示例的階躍函數 f 表示。可以驗證此時神經元能表示 and 函數。
如輸入第一行,x1 = 0,x2 = 0 時,可以得到
y 為 0,這就是真值表的第一行。
在數學意義上,可以這樣理解 and 函數的神經元。它表示了一個線性分類問題,它就像是一條直線把分類 0(false,紅叉)和分類 1(true,綠點)分開
而實際上,神經元在數學上可以理解為一個數據分割問題。神經元是將神經網絡轉換成數學問題的關鍵。比如需要訓練神經網絡做一個分類器,那么在數學上可以將輸入的參數(x1,x2...,xn)理解為 m 維坐標系(設 x 是 m 元向量)上的 n 個點,而每個神經元則可以理解為一個個擬合函數。取 m 為 2,放在最簡單的二維坐標系里面進行理解。
此時輸入參數對應的是下圖中的黑點,每個神經元就是黑線(由于激勵函數的存在,不一定像下圖一樣是線性的,它可以是任意的形狀)。神經網絡由一個個神經元組成,這些神經元表示的擬合函數相互交錯就形成了各種各樣的區域。在下圖中可以直觀的看到,此時分類問題就是一個數學的問題,輸入參數落在 A 區域,那么就認為他是分類 1,落在 B 區域,則認為他是分類 2。依次類推,我們便建立了神經網絡分類器在數學上的表現含義。
激活函數
事實上,一個神經元不能擬合異或運算。在下圖中可以直觀的看到,你無法直接用一條直線將分類 0 和分類 1 分隔開。
此時可以借助激活函數來做分割。激活函數選擇閥值函數,也就是當輸入大于某個值時輸出 1(激活),小于等于那個值則輸出 0(沒有激活)。
擬合異或函數的神經網絡如圖所示:
圖中神經網絡分成三層。在第二層中,如果輸入大于 1.5 則輸出 1,否則 0;第三層,如果輸入大于 0.5,則輸出 1,否則 0.
第一層到第二層(閥值 1.5):
第二層到第三層(閥值 0.5):
可以看到最終結果與異或結果吻合。
其實,這里放在數學上理解體現的是一個升維思想。放在二維坐標中無法分割的點,可以放在三維坐標中分割。上面的神經網絡可以理解為只有最后一層,三個參數的神經元。激活函數是用來構造第三個參數的方式。這樣等同于將三個點放在三維坐標系中做數據分割。相當于在二維中無法解決中的問題升維到三維中解決。
深度學習過程
構造神經網絡
確定學習目標
學習
如何進行深度學習,過程基本都可以分為這三步來做。用一個簡單的例子來說明。如圖,假設我們需要通過深度學習來識別手寫圖片對應的數字。
1.構造神經網絡。這里可以采用最簡單的全連接神經網絡,也可以采用卷積神經網絡。同時確定神經元的激勵函數,神經網絡的層數等。基礎概念篇不做過多介紹
2.確定學習目標。這里簡單假設我們所有輸入的都是手寫的數字圖片。那么這里就有 10 個輸出,分別對應 0~9 的數字的比例。我們用 [y0,y1,...y9]表示,每個 y 值代表這張圖可能對應該數字的概率(y0 表示這張圖是數字 0 的概率)。對于上圖中第一個輸入圖片,在訓練過程中,我們知道第一張圖片輸出應該是數字 5。于是我們期望輸出是 [0,0,0,0,0,1,0,0,0,0]。但是實際上,我們的模型不是完美的,肯定會有誤差,我們得到的結果可能是 [0,0,0.1,0,0,0.88,0,0,0,0.02]。那么就會有個訓練得到的結果和期望結果的誤差。
這時候我們的學習目標也就是希望這個誤差能夠最小。誤差用 L 來表示,學習目標就是找到權值 w,使得 L 最小。當然,這里涉及到我們需要用一個公式來表達這個誤差 L,這個公式選取也很有學問,不同的公式最終在學習過程時收斂速度是不一樣的,通過訓練模型得到的權值 w 也是不一樣的。這里先不多介紹。
3.學習。假設我們神經模型確定下來的權值 w 與 L 的關系如圖所示(這里我們考慮最簡單的二維坐標下的情況,原理是相通的,推廣到多元坐標也是適用的)。由于數學模型的復雜,這里找最小值 L 的過程其實是找局部最小值的過程。
我們都知道,函數某個位置可導,那么就可以確定這個點的斜率。要找到局部最小值,可以根據這個點的斜率移動 w。如根據此時斜率的值我們可以確定 w 應該向右移動一段距離。
此時移動 w 的距離稱為步長。步長的選取很關鍵,如果步長過長,那么每次 w 偏移過大,永遠都找不到真正的最小值。而如果步長選取過小,那么收斂會變得很慢,而且有可能在中間某段平滑處停下來,找到的也不是真正的最小值。而步長怎么選擇呢?其實比較坑爹,某些時候有經驗值,大部分時候則只能自己調整去試驗。
在學習的過程中,遇到的最常見的一個問題是"走不動"了。比如在下圖中。從 A 點走到 B 點,B 點由于斜率平滑,慢慢走到了 C 點,這時候可能 C 點斜率是平滑了,那么 w 將無法繼續往下走,永遠停留在 C 點!這樣得到的神經網絡的誤差 L 顯然不是最小的,權值 w 也不是最佳的。
因此,在神經網絡學習過程中,常用的做法是模擬物理世界引入一個"動量球"。假設每次的移動看成 是一個"動量球"的移動。在移動過程中,"動量球"先從最高點往下走,雖然下載下來后斜率減少,但是由于"動量球"將移動下來的重力勢能轉變的動能,它會繼續往下走,從而移動過平緩區。當"動量球"到達某個局部最低點的時候,"動量球"會依靠自己的動能繼續滾動,設法尋找到下一個局部最低點。當然,"動量球"不是萬能的,它也可能會遇到"山坡"上不去最終滑下來停留在某個局部最小值(并不是真正的最小值)。但是"動量球"的引入,大大增加了學習過程的魯棒性,擴寬了局部最小值的尋找范圍。
實際上,借助理解神經網絡學習的過程,我們會更加理解為什么深度越高的網絡不一定就越好。對于深度越高的神經網絡,"平滑區"會越來越多,局部最小點也會越來越多。沒有合適的算法,很容易就陷入某個局部最小值里面去,而這個最小值可能還不如深度更淺的神經網絡獲得的局部最小值小。也就是說,神經網絡復雜之后,對架構和算法的要求大大加高。
卷積
如果對卷積這個數學概念還沒有了解,可以先看知乎這里通俗的解釋。
怎樣通俗易懂地解釋卷積?
如果沒有做過圖像處理,還需要先看看卷積核,感受一下它的神奇。
圖像卷積與濾波的一些知識點
以圖片的卷積為例,深度學習中的卷積計算就是使用卷積核遍歷一張圖片的過程。
根據對于邊緣的處理不同,卷積分為相同填充和有效填充兩種方法。相同填充中,超出邊界的部分使用補充 0 的方法,使得輸入和輸出的圖像尺寸相同。而在有效填充中,則不使用補充 0 的方法,因此輸出的尺寸會比輸入尺寸小一些。
例 1:3*3 的卷積核在 5*5 的圖像上進行有效填充的卷積過程
例 2. 兩個 3*3*3 卷積核在 5*5 圖像上進行相同填充卷積過程。動圖
圖像有 r,g,b 三個通道。這里使用卷積核也分為 3 個通道分別進行卷積運算
池化
池化是卷積神經網絡中用到的一種運算。在卷積神經網絡中,卷積層后面一般是池化層。先進行卷積運算,再進行池化運算。
池化層在神經網絡中起到的是降低參數和計算量,引入不變形的作用。
池化常用的是兩種,一種是 Avy Pooling,一種是 Max Pooling。下圖是 Max Pooling 的示意圖,可以看到分別找的是 2*2 矩陣中的最大值,Avy Pooling 則是將矩陣所有值加起來,求平均值。
評論
查看更多