1.5 通過梯度下降學習(八)

現在我們設計了一個神經網絡,但是它怎樣通過學習來識別手寫數字呢?首先需要的是被稱為訓練數據集的數據集合。我們將使用 MNIST數據集,它包含了幾萬個手寫數字的掃描圖片,還要正確的分類。MNIST的名字來源于一個事實,它是一個修改通過NIST( the United States' National Institute of Standards and Technology)整理的兩個數據集合的子集。這里有幾張MNIST的圖片:

正如你看到的,事實上這些數字就是第一章展示要識別的數字。當然我們測試神經網絡的時候,我們會讓它識別不在這個訓練集中的圖片。

MNIST數據分為兩部分。第一部分包含60000張用來訓練的圖片。這些圖片通過掃描250個人的手寫獲取,他們一半是來自美國人口普查局的員工,一半來自于高中生。圖片均為灰度圖,大小為28x28像素。第二部分包含了10000個圖片的訓練集合。同樣是28x28的灰度圖。我們將用測試數據評估我們的神經網絡學習識別手寫數字的情況。為了使測試結構具有代表性,這些測試數據同樣來自于250個人。這讓我們確信系統可以識別來自于它訓練時沒有看到過的人寫的數字。

我們使用符號x代表訓練輸入。可以把每一個訓練輸入x看做一個28x28=784維的向量。向量的每一個元素代表圖片中一個像素的灰度值。我們用y = y(x)表示期望的輸出,y是一個10維的向量。例如,一個訓練圖片,x,寫的是6,那么y(x) = (0, 0, 0, 0, 0, 1, 0, 0, 0, 0)^T就是神經網絡期望的輸出(T表示轉置)。

我們實現的算法達到的效果是讓我們得到合適的權重向量和偏移向量,從而對每一個輸入x都可以得到一個相近的輸出y(x)。我們使用一個代價函數來量化我們的目標:

上式里,w表示網絡中的所有權重,b表示所有偏移,n是訓練輸入的總數,a是當x為輸入時的輸出向量。當然,輸出a決定于x,x和b。為了保持符號的簡潔性,我不會明確的解釋這種依賴性。符號∥v∥僅僅表示向量v的長度。我們稱C為二次代價函數;它有時也被稱為均方誤差(mean squared error)或者僅僅是MSE。通過查看二次代價函數,我們發現C(w, b)是 非負的,因為式子的每一部分都是非負的。而且,代價C(w, b)變得很小,或者說C(w, b)~0,意味著對所有的輸入x,y(x)都非常接近輸出a。因此,如果我們找到合適的權重和偏移使的C(w, b)~0,那么我們的訓練算法就做的很好。相反的,如果C(w, b)的話說明訓練算法做的不好,意味著對于大部分輸入來說y(x)和輸出a差別很大。所以我們的訓練算法的目標就是使的關于權重和偏移的代價函數C(w, b)值最小。換句話說,我們想要找到一組權重和偏移的集合使的代價盡可能的小。我們將使用一種被稱為梯度下降的算法。

為什么要引入二次代價函數呢?畢竟,我們的主要目的不是將數字圖片正確分類嗎?為什么不直接最大化數字,而去最小化一個像二次代價的代理呢?之所以這樣是因為在網絡中數字圖片被正確分類并不是一個關于權重和偏移的平滑函數。對大多數情況來說,對權重和偏移做很小的改變不能引起所有訓練圖片的正確性。這使得計算怎樣改變權重和偏移來提升性能變得很困難。如果我們使用了一個像二次代價的平滑函數,這就會使得計算怎樣改變權重和偏移變得簡單。這就是為什么我們首先使二次代價函數最小化然后再檢查正確性的原因。

即使給出我們將要使用一個平滑的代價函數,你也要思考我們為什么使用等式(6)的二次函數。這是一個非常特別的選擇嗎?如果我們選擇一個不同的代價函數,我們不會得到一組完全不同的最小權重和偏移集合嗎?這是一個很好的問題,一會兒我們將要從新檢查代價函數,并且做一些修改。然而,等式(6)代價函數對于在神經網絡中學習偏移工作的很好,因此我們現在任然使用它。

重復一遍,我們的目標是通過訓練神經網絡找到一組權重和偏移的集合使的二次代價函數C(w, b)最小。這是一個 適宜的問題,但是它任然有很多分散結構——w和b代表權重和偏移,σ函數潛伏在背后,神經網絡的構架,MNIST,等等。如果忽略大多數結構而僅僅集中在最小化方面,我們可以理解更多的東西。因此,我們現在忘掉代價函數的特殊性以及和神經網絡的聯系等等。取而代之,我們假設我們僅僅簡單的又有一個由很多變量的函數,然后最小化這個函數。我們將要使用梯度下降來解決類似的最小化問題。然后我們回到特殊函數來最小化我們的神經網絡。

Okay,假設我們將要最小化一類函數,C(v)。它可能又有很多實數變量,v = v1,v2,.....注意,我將使用v來代替w和b符號,一次來強調它可以是任何函數——不是在神經網絡中的特殊函數。為了最小化C(v),我們首先思考兩個變量的函數,變量稱為v1和v2:

我們將要做的是尋找C在哪里可以達到全局最小?,F在,當然,對于在上面繪畫出的函數我們可以用眼看到圖像并且找到最小點。由此看來,我的確好像展示了一個相當簡單的函數!一個函數C通常可能是一個有很多變量的復雜函數,并且不能如此簡單的用眼看到圖像并找到最小值。

一種解決問題的方法就是施工微積分分析來找到最小值。我們可以計算導數然后使用它們來找到C的極值。如果C是一個僅僅含有一個或者很少幾個變量的函數,那么我們很幸運。如果它含有很多變量,那將是一場噩夢。并且在神經網絡中,我們經常用用很多很多的變量——極端情況下,最大的神經網絡的代價函數依賴于數十億個權重和偏移。使用微積分來最小化完全無法工作。

Okay,看來微積分無法使用了。幸運的是,有一個漂亮的比喻暗示有一個算法可以工作的很好。我們把我們的函數看做一個山谷。如果你看一下上面的圖,這種想象應該不難。我們想象一個球從斜坡滾落。我們的常識告訴我們,球最終會落到谷底。難道我們不可以使用這種方法來尋找一種最小化的方法嗎?我們隨意為球選取一個起始點,然后模仿球向谷底滾落的過程。我們可以通過計算C的導數來模擬這個過程——這些導數可以告訴我們山谷中附近點的所有信息,那決定我們的球怎樣滾動。

通過我剛才的描述,你可能會想我們要分析球受到的摩擦和重力建立牛頓力學的方程式了。事實上,我們我們的類比不是很準確——我們要發明一個算法來最小化C,而不是精確的模擬物理定律!通過球的視角只是為了更愛好的想象,而不是束縛我們的想法。因此,避開散亂的物理細節,我們簡單的自問一下:如果我們有一天成我了上帝,并且可以建立自己的物理定律,指定球怎樣去滾落,我們應該指定怎樣的定律來使小球總是滾落到谷底呢?

使問題變的更加明確一些,讓我們想一下當我們在球的v1方向移動了很小的Δv1,在V2方向移動了很小的Δv2會發生什么。微積分告訴我們如下結果:

我們需要找到一個方法來選擇Δv1和Δv2使的ΔC是負的;也就是我們選擇他們,小球就會向谷底滾落。為了明白如何選擇,使用Δv代替向量v,Δv≡(Δv1,Δv2)^T。我們也定義向量的偏導數為C的梯度:


我們用?C表示梯度:

一會兒我們會使用梯度?C和Δv來重寫變化ΔC的表達式。在那之前,我想說明一些會讓人們困惑的梯度的問題。當第一次看到?C符號的時候,很多人會想為什么要用?符號,或者說,?符號有什么意義嗎?事實上,你可以把梯度僅僅看做一個簡單的數學記號-方便用來表示偏導的向量-這樣就不用寫兩個符號了。這樣來看,?僅僅是一面符號的旗幟,告訴你:“嗨,?C是一個梯度向量?!币灿泻芏嗥渌年P于?的解釋(比如,作為一種微分符號),但我們不需要這種觀點。

通過這個定義,表達式(7)可以被重寫為:

這個等式解釋了?C為什么被稱為梯度向量:?C和C中v的變化息息相關,只是我們把他稱為梯度罷了。但是真正令人興奮的還是這個等式用來尋找怎樣選擇Δv使的ΔC為負。尤其,假設我們選擇:

η是一個很小的正數(被稱為學習速率)。等式(9)告訴我們:


可得ΔC≤0恒成立,C將會一直減小,永不增大。這就是我們想要的。所以,我們將會使用等式(10)在我們的梯度下降算法中的小球的“運動定律”。也就是我們將用(10)來計算Δv,并使用結果來改變小球的位置v:

接下來將會重復這個運動。如果我們一直做這個,不斷重復,我們希望C一直減小直到達到全局最小值。

總結一下,梯度下降算法的工作就是重復計算梯度?C,然后朝著相反的方向運動,沿著山谷的墻壁“滾落”。如下圖:

注意,梯度下降并不是完全復制的真實的物理運動。真實的世界中,球擁有動量,它可以讓球滾落,甚至再次上升,只有有摩擦力,它才會滾落到谷底。同的是,我們選擇Δv的規則不一樣,就像再說“立馬下降!”。這仍然是一個尋找最小值的好辦法。

為了使梯度下降正確,我們需要選擇一個足夠小的學習速率使(9)式較接近。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容