1. 程式人生 > >深度學習與神經網路入門必讀5!

深度學習與神經網路入門必讀5!

梯度下降學習法

(感覺英文文章講的很細,內容其實不多,就是講的基礎了點)既然我們有了神經網路的設計,它怎麼能學會識別數字呢?我們首先需要的是一個數據集,用來學習所謂的訓練資料集,我們將使用MNIST資料集,其中包含數以萬計的手寫數字的掃描影象,以及它們的正確分類。MNIST的名字來源於一個事實,即它是由美國國家標準和技術研究所收集的兩個資料集的一個修改子集。以下是來自MNIST的一些圖片:

這裡寫圖片描述

正如你所看到的,這些數字實際上和這一章開頭所顯示的一樣,是一種識別的挑戰。當然,在測試我們的網路時,我們會要求它識別那些不在訓練集中的影象!

MNIST的資料分為兩部分。第一部分包含6萬張圖片作為訓練資料。這些影象是從250人的筆跡樣本中掃描出來的,其中一半是美國人口普查局的僱員,其中一半是高中生。影象是灰度的,28 * 28畫素大小。MNIST資料集的第二部分是10000個影象作為測試資料。同樣,這些是28 * 28的灰度影象。我們將使用測試資料來評估我們的神經網路已經學會了如何識別數字。為了對效能進行良好的測試,測試資料取自不同的250人,而不是原始的培訓資料(儘管仍然是人口普查局員工和高中生之間的分組)。這有助於讓我們相信,我們的系統能夠識別那些在訓練中沒有看到的人的數字。

我們將使用符號x來表示訓練輸入。會方便認為每個訓練輸入x是28×28 = 784維向量。向量中的每個條目表示影象中單個畫素的灰度值。我們將用y =y(x)表示相應的期望輸出,y是一個10維的向量。例如,如果一個特定的訓練影象,x,描述了一個6,那麼y(x)=(0,0,0,0,0,0,1,0,0,0,)T是網路期望的輸出。注意,這裡的T是轉置操作,將行向量變成一個普通(列)向量。

我們想要的是一種演算法,它能讓我們找到權重和偏差,從而使網路輸出近似於y(x),用於所有訓練輸入x。為了量化我們達到這個目標的程度,我們定義了一個成本函式 *有時被稱為損失或目標函式。我們在本書中使用了損失函式這個術語,但是你應該注意其他術語,因為它經常用於研究論文和其他關於神經網路的討論。:

這裡寫圖片描述

在這裡,w表示網路中所有權值的集合,b所有的偏差,n是訓練輸入的總數,a是輸入時網路輸出的向量,並且總和除以所有訓練輸入,x。當然,輸出的a依賴於x、w和b,但是為了保持符號的簡單,我沒有明確表示這種依賴。符號∥v∥為v向量v的長度函式。我們稱它為二次成本函式;它有時也被稱為平均平方誤差或者只是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等等。事實證明,我們可以通過忽略大部分的結構來理解巨大的數量,只關注最小化的方面。現在我們將會忘記所有關於成本函式的具體形式,神經網路的連線,等等。相反,我們會想象我們只是得到了很多變數的函式我們想要最小化這個函式。我們將開發一種叫做梯度下降的技術,它可以用來解決這樣的最小化問題。然後我們回到我們想要最小化的特定函式神經網路。

假設我們要最小化某個函式,C(v)這可能是任何實值函式的變數,v = v1、v2,…。請注意,我已經用v替換了w和b表示法,以強調這可能是任何函式——我們在神經網路環境中不再具體地思考。為了最小化C(v),它有助於把C想象成兩個變數的函式,我們稱之為v1和v2:

這裡寫圖片描述

我們希望找到C達到全域性最小值的地方。當然,對於上面繪製的函式,我們可以看一下這個圖,找到最小值。從這個意義上說,我可能有點過於簡單的一個函式!一般的函式,C,可能是很多變數的一個複雜函式,通常不可能只盯著圖來找出最小值。

解決這個問題的一種方法是使用微積分來試圖找到最小的解析。我們可以計算導數,然後試著用它們來找出C是極值的位置。當C只是一個或幾個變數的函式時,可能會有一些運氣。但是當我們有更多的變數時,它就變成了一場噩夢。對於神經網路來說,我們通常需要更多的變數——最大的神經網路有成本函式,它以極其複雜的方式依賴數十億的權重和偏差。用微積分來最小化這是行不通的!

(在斷言我們將通過把C想象成兩個變數的函式來想象內部影象,我在兩段中翻了兩遍,然後說,“嘿,但是如果它是一個多變數的函式呢?“很抱歉。但請相信我,把C想象成兩個變數的函式確實有助於我們去理解。有時這種情況也會發生,比如最後兩段處理的是這樣的問題。而對數學的思考經常涉及到要同時處理多個直觀的圖形,有時候是可行的。)這一段翻譯的很爛,可以不看

所以微積分不起作用了。幸運的是,有一個漂亮的類比提出了一種演算法,它執行得很好。我們首先想到的是我們作為一個山谷的功能。如果你只是稍微看一下上面的情節,那應該不會太難。我們想象一個球滾下山谷的斜坡。我們的日常經驗告訴我們,球最終會滾到谷底。也許我們可以用這個方法來找出函式的最小值?我們隨機選擇一個(假想的)球的起點,然後模擬球滾到谷底時的運動。我們可以簡單地通過計算衍生工具(也許是一些二階導數)來做這個模擬——這些衍生品會告訴我們所有我們需要知道的關於這個山谷的“形狀”的資訊,因此我們的球應該如何滾動。

根據我剛剛寫的,你可能會認為我們會嘗試寫下牛頓的運動方程,考慮摩擦力和重力的影響,等等。實際上,我們不打算把球滾動的類比當真——我們正在設計一種演算法來最小化抄送,而不是對物理定律進行精確的模擬!從球的視角來解釋是在激發我們的想象力,而不是束縛我們的思維。因此我們不用去理清混亂的物理細節,而知識讓我們簡單地問自己:如果某天我們自己成為了上帝,並可以去構建自己的物理定律,可以決定如何滾球,那我們選擇什麼規律或運動定律來讓球總是滾山谷的底部?

為了把這個問題描述的更加精準,讓我們來思考當球在V1的方向移動了很小的距離V1,在V2方向移動了很小的距離V2,我們計算C函式的變化公式是:

這裡寫圖片描述

我們會找到一個合適的V1和V2用來使得C為負數,這樣即是讓球滾下山谷。