目錄
Relations between Layer Outputs
How to pick the 「best」 function?
Practical Issues for neural network
Stochastic gradient descent and Mini-batch
鏈接:http://speech.ee.ntu.edu.tw/~tlkagk/courses/MLDS_2015_2/Lecture/DNN%20(v4).pdf
在這一課中,我們需要研究三個問題:1. What is the model (function hypothesis set)? 2. What is the 「best」 function? 3. How to pick the 「best」 function? 這三個問題也是第一課中遺留下來需要解決的問題。接下來,我們就圍繞這三個問題進行研究。
在這一課中,我們主要是以分類問題爲主。這裏的分類有二分類和多分類。二分類一般可以應用於垃圾郵箱的識別,推薦系統,惡意軟件的檢測,股票漲跌的預測。多分類問題一般有手寫數字的識別(0,1,2,…,9),圖像識別(dog, cat, book,…)。語音識別是一個比多分類問題更復雜的問題,以後我們再進行更詳細的討論。
這裏,我們以手寫數字識別來作爲研究。假設,輸入的x和y都是固定等長度,即每個輸入x都是相同且相等的。這裏,x是一個N維的vector,y是一個M維的vector。這裏我們需要對y進行one-hot處理,而不是用1,2,3,…去表示。
這裏,每一個神經元的激活函數是sigmoid,這個函數很有意思,當z>0的時候,輸出的區域絕大部分映射到靠近1的地方。當z<0的時候,輸出的區域絕大部分映射到靠近0的區域。單個神經元可以解決二分類問題,但是對於多分類問題,單個神經元是無法解決的,所以需要用多個神經元才能解決,有多少類就需要用多少個神經元,即對應的多少輸出。這裏輸出的神經元有很多,每個y表示是某個數還是不是某個數,取max(yi)的最大的角標i位置對應的結果。
單個隱含層不能夠解決非線性問題,這也是爲啥1960s後神經網絡進入冷淡期的原因。
由上圖,我們可以看到,無論怎麼分,都不能將紅藍兩色的點分開。該怎麼辦?怎麼辦呢?我們可以借用XNOR gate的原理,將多個門並在一起。請看下圖:
在第一個圖中,使用了兩個神經元進行劃分,雖然沒有將紅藍兩色的點進行分開。但是我們這個結果作爲輸入,feed到另外一個神經元中,在feed之前,我們驚奇地發現,現在數據變得線性可分了。所以自然,第三個神經元就將其分開了。Oops~
公式一表示第l層中第i個神經元的輸出值
公式二表示第l層中的輸出向量
公式三表示在第l層中第i個神經元的激活函數輸入值
公式四表示在第l層中的激活函數輸入向量
公式五表示從第l-1層的第j個神經元到第l層的第i個神經元的權值
公式六表示從第l-1層到第l層的神經元權值矩陣
公式七表示在第l層的第i個神經元偏置
公式八表示在第l層的神經元偏置向量
最終,我們把上一個神經網絡層的輸出作爲輸入,代入激活函數中得到新的輸出,這樣構成了一個function set。在正常的編程中,其實並不會這麼算,而是把偏置加入權值矩陣中,在輸入的矩陣的前面加入一個1向量,進行矩陣的乘法,同樣可以得到以上的效果。
從paramaters set裏面選擇最適應驗證集的W, b。那麼怎麼去衡量這個function的好壞呢?我們可以用損失函數去衡量這個函數到底有多差,通常我們希望這個值越小越好,常用的損失函數有均方誤差、交叉熵。與之相反的是目標函數,我們希望越大越好,越大則越接近這個目標。
通常參數的選擇,我們一般使用梯度下降法。首先對參數進行隨機初始值,然後求損失函數關於參數的偏導,最後將偏導後的結果與原來的參數值進行更新。依次重複…這裏,求某個參數的偏導,即求斜率,當斜率<0的時候,如圖向右移動,當斜率>0的時候,向左移動。梯度下降法是求一個局部最優(下面會繼續展開討論)。
假設只有兩個參數,隨機初始化參數值,在「可視範圍」內,向損失值最小的地方移動,到了新的點,再在「可視範圍」內,向損失值更小的地方移動,以此類推。
對於損失函數,可以由泰勒公式展開,假設這個紅色的「可視區域」最夠小,小到只剩一個點,我們可以消去後面的二次項。最後求偏導整理後,可以發現損失函數其實是與參數成一次關係。即上一個損失函數到下一個損失函數的關係就是線性地加減。這也解釋了爲啥求偏導,以及爲啥更新公式長這樣。在實際中,這樣計算參數計算量會特別大,所以我們一般採用反向傳播。
思考:這裏,我們消去了二次項,但是加上二次項,可能對結果會更有幫助,但是這樣會增加計算量。這是一個待解決的問題。
因爲梯度下降法是求局部最優解,而SVM是求全局最優解,它是一個convex function,這也是爲啥SVM火了一段時間的原因。梯度下降法的權值無論從何地起始,都可能到最後會卡在local minima。但是後面人們研究發現,local minima並沒有想象的那麼多,主要的問題還是saddle point(鞍點),所以現在我們主要解決的是怎麼跳出鞍點。
不要讓所有的參數都相等,因爲在下次更新的時候還可能在一個地方。所以隨機初始化參數。這很重要。
對於學習率的設置,一直是一個叩待解決的問題。當學習率太大的時候,參數更新每一步都特別大,從而導致損失值一直都進入不了局部最優的區域。於是,我們將學習率調小,發現損失值一直在峯谷口徘徊,不能進去。所以,我們還需要繼續調小學習值。總的來說,學習值的調試也需要隨之迭代次數而不斷地減少。
訓練數據一共有r個。Gradient Descent是將其全部代入訓練,因爲計算矩陣變大,所以需要花費更多的時間。Stochastic Gradient Descent是每次去一個樣本去更新權值,這樣效果比較快。Mini-batch是將size(Mini-batch)個數全部綁定在一個去更新權值,它是Gradient Descent和Stochastic Gradient Descent的一種折中方法。雖然計算量和Stochastic Gradient Descent差不多,但是效果卻有很大多的差別。
從實驗結果圖可以看出,Gradient Descent將數據全部參數訓練和迭代更新,不但耗時多,而且效果低。Stochastic Gradient Descent每次代入一個數據更新,雖然時間上式提高了,但是一次性處理一個樣本,在數據量比較多多的情況下,耗時就會增加,不過正確率還是比較好的。Mini-batch效果最好,不但耗時低,而且正確率也很高。
首先對數據集分成訓練集,驗證集(知道真實標籤),測試集(直到deadline才知道真實標籤)。然後,我們需要確保訓練集上效果比較好的情況下,纔去看驗證集的效果(往往驗證集的效果低於訓練集的效果)。如果訓練集上效果不好,可能是由以下幾點原因造成:程序有bug;激活函數不好(局部最小,鞍點問題,改變訓練策略);模型本身就不好(function set假設得不好,需要一個更大的網絡)。當訓練集效果比較好的時候,我們再看驗證集。如果效果好,我們可以done。如果不好,可能是他由於過擬合造成的。造成過擬合的原始是訓練集和測試集的分佈往往不同,比如在手寫識別的例子中,「2」在訓練集中沒有圈,而在測試集中有圈。解決過擬合的原因一般是研究和尋找解決過擬合的算法和方法,比如加正則項。但是最簡單的是尋找更多的訓練數據集。