日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

第三章 改进神经网络的学习方式(上中)

發(fā)布時(shí)間:2025/3/21 编程问答 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第三章 改进神经网络的学习方式(上中) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

過匹配和規(guī)范化


諾貝爾獎(jiǎng)得主美籍意大利裔物理學(xué)家恩里科·費(fèi)米曾被問到他對(duì)一個(gè)同僚提出的嘗試解決一個(gè)重要的未解決物理難題的數(shù)學(xué)模型。模型和實(shí)驗(yàn)非常匹配,但是費(fèi)米卻對(duì)其產(chǎn)生了懷疑。他問模型中需要設(shè)置的自由參數(shù)有多少個(gè)。答案是“4”。費(fèi)米回答道:“我記得我的朋友約翰·馮·諾依曼過去常說,有四個(gè)參數(shù),我可以模擬一頭大象,而有五個(gè)參數(shù),我還能讓他卷鼻子。”

這里,其實(shí)是說擁有大量的自由參數(shù)的模型能夠描述特別神奇的現(xiàn)象。即使這樣的模型能夠很好的擬合已有的數(shù)據(jù),但并不表示是一個(gè)好模型。因?yàn)檫@可能只是因?yàn)槟P椭凶銐虻淖杂啥仁沟盟梢悦枋鰩缀跛薪o定大小的數(shù)據(jù)集,不需要對(duì)現(xiàn)象的本質(zhì)有創(chuàng)新的認(rèn)知。所以發(fā)生這種情形時(shí),模型對(duì)已有的數(shù)據(jù)會(huì)表現(xiàn)的很好,但是對(duì)新的數(shù)據(jù)很難泛化。對(duì)一個(gè)模型真正的測(cè)驗(yàn)就是它對(duì)沒有見過的場(chǎng)景的預(yù)測(cè)能力。

費(fèi)米和馮·諾依曼對(duì)有四個(gè)參數(shù)的模型就開始懷疑了。我們用來對(duì) MNIST 數(shù)字分類的 $$30$$ 個(gè)隱藏神經(jīng)元神經(jīng)網(wǎng)絡(luò)擁有將近 $$24,000$$ 個(gè)參數(shù)!當(dāng)然很多。我們有 $$100$$ 個(gè)隱藏元的網(wǎng)絡(luò)擁有將近 $$80,000$$ 個(gè)參數(shù),而目前最先進(jìn)的深度神經(jīng)網(wǎng)絡(luò)包含百萬級(jí)或者十億級(jí)的參數(shù)。我們應(yīng)當(dāng)信賴這些結(jié)果么?

讓我們將問題暴露出來,通過構(gòu)造一個(gè)網(wǎng)絡(luò)泛化能力很差的例子。我們的網(wǎng)絡(luò)有 $$30$$ 個(gè)隱藏神經(jīng)元,共 $$23,860$$ 個(gè)參數(shù)。但是我們不會(huì)使用所有 $$50,000$$ 幅訓(xùn)練圖像。相反,我們只使用前 $$1000$$ 幅圖像。使用這個(gè)受限的集合,會(huì)讓泛化的問題突顯。按照同樣的方式,使用交叉熵代價(jià)函數(shù),學(xué)習(xí)率設(shè)置為 $$\eta=0.5$$ 而 minibatch 大小設(shè)置為 $$10$$。不過這里我們訓(xùn)練回合設(shè)置為 $$400$$,比前面的要多很多,因?yàn)槲覀冎挥昧松倭康挠?xùn)練樣本。我們現(xiàn)在使用 network2 來研究代價(jià)函數(shù)改變的情況:

>>> import mnist_loader >>> training_data, validation_data, test_data = \ ... mnist_loader.load_data_wrapper() >>> import network2 >>> net = network2.Network([784, 30, 10], cost=network2.CrossEntropyCost) >>> net.large_weight_initializer() >>> net.SGD(training_data[:1000], 400, 10, 0.5, evaluation_data=test_data, ... monitor_evaluation_accuracy=True, monitor_training_cost=True)

使用上面的結(jié)果,我們可以畫出代價(jià)函數(shù)變化的情況:


這看起來令人振奮,因?yàn)榇鷥r(jià)函數(shù)有一個(gè)光滑的下降,跟我們預(yù)期一致。注意,我只是展示了 $$200$$ 到 $$399$$ 回合的情況。這給出了很好的近距離理解訓(xùn)練后期的情況,這也是出現(xiàn)有趣現(xiàn)象的地方。

讓我們看看分類準(zhǔn)確度在測(cè)試集上的表現(xiàn):


這里我還是聚焦到了后面的過程。 在前 $$200$$ 回合(圖中沒有顯示)準(zhǔn)確度提升到了 82%。然后學(xué)習(xí)逐漸變緩。最終,在 $$280$$ 回合左右分類準(zhǔn)確度就停止了增長。后面的回合,僅僅看到了在 $$280$$ 回合準(zhǔn)確度周圍隨機(jī)的震蕩。將這幅圖和前面的圖進(jìn)行對(duì)比,和訓(xùn)練數(shù)據(jù)相關(guān)的代價(jià)函數(shù)持續(xù)平滑下降。如果我們只看哪個(gè)代價(jià),我們會(huì)發(fā)現(xiàn)模型的表現(xiàn)變得“更好”。但是測(cè)試準(zhǔn)確度展示了提升只是一種假象。就像費(fèi)米不大喜歡的那個(gè)模型一樣,我們的網(wǎng)絡(luò)在 $$280$$ 回合后就不在能夠繁華到測(cè)試數(shù)據(jù)上。所以這種學(xué)習(xí)不大有用。也可以說網(wǎng)絡(luò)在 $$280$$ 后就過匹配(或者過度訓(xùn)練)了。

你可能想知道這里的問題是不是由于我們看的是訓(xùn)練數(shù)據(jù)的代價(jià),而對(duì)比的卻是測(cè)試數(shù)據(jù)上的分類準(zhǔn)確度導(dǎo)致的。換言之,可能我們這里在進(jìn)行蘋果和橙子的對(duì)比。如果我們比較訓(xùn)練數(shù)據(jù)上的代價(jià)和測(cè)試數(shù)據(jù)上的代價(jià),會(huì)發(fā)生什么,我們是在比較類似的度量么?或者可能我們可以比較在兩個(gè)數(shù)據(jù)集上的分類準(zhǔn)確度啊?實(shí)際上,不管我們使用什么度量的方式盡管,細(xì)節(jié)會(huì)變化,但本質(zhì)上都是一樣的。
讓我們來看看測(cè)試數(shù)據(jù)集上的代價(jià)變化情況:


我們可以看到測(cè)試集上的代價(jià)在 $$15$$ 回合前一直在提升,隨后越來越差,盡管訓(xùn)練數(shù)據(jù)機(jī)上的代價(jià)表現(xiàn)是越來越好的。這其實(shí)是另一種模型過匹配的標(biāo)志。盡管,這里帶來了關(guān)于我們應(yīng)當(dāng)將 $$15$$ 還是 $$280$$ 回合當(dāng)作是過匹配占主導(dǎo)的時(shí)間點(diǎn)的困擾。從一個(gè)實(shí)踐角度,我們真的關(guān)心的是提升測(cè)試數(shù)據(jù)集上的分類準(zhǔn)確度,而測(cè)試集合上的代價(jià)不過是分類準(zhǔn)確度的一個(gè)反應(yīng)。所以更加合理的選擇就是將 $$280$$ 看成是過匹配開始占統(tǒng)治地位的時(shí)間點(diǎn)。

另一個(gè)過匹配的信號(hào)在訓(xùn)練數(shù)據(jù)上的分類準(zhǔn)確度上也能看出來:


準(zhǔn)確度一直在提升接近 100%。也就是說,我們的網(wǎng)絡(luò)能夠正確地對(duì)所有 $$1000$$ 幅圖像進(jìn)行分類!而在同時(shí),我們的測(cè)試準(zhǔn)確度僅僅能夠達(dá)到 82.27%。所以我們的網(wǎng)絡(luò)實(shí)際上在學(xué)習(xí)訓(xùn)練數(shù)據(jù)集的特例,而不是能夠一般地進(jìn)行識(shí)別。我們的網(wǎng)絡(luò)幾乎是在單純記憶訓(xùn)練集合,而沒有對(duì)數(shù)字本質(zhì)進(jìn)行理解能夠泛化到測(cè)試數(shù)據(jù)集上。

過匹配是神經(jīng)網(wǎng)絡(luò)的一個(gè)主要問題。這在現(xiàn)代網(wǎng)絡(luò)中特別正常,因?yàn)榫W(wǎng)絡(luò)權(quán)重和偏差數(shù)量巨大。為了高效地訓(xùn)練,我們需要一種檢測(cè)過匹配是不是發(fā)生的技術(shù),這樣我們不會(huì)過度訓(xùn)練。并且我們也想要找到一些技術(shù)來降低過匹配的影響。

檢測(cè)過匹配的明顯方法是使用上面的方法——跟蹤測(cè)試數(shù)據(jù)集合上的準(zhǔn)確度隨訓(xùn)練變化情況。如果我們看到測(cè)試數(shù)據(jù)上的準(zhǔn)確度不再提升,那么我們就停止訓(xùn)練。當(dāng)然,嚴(yán)格地說,這其實(shí)并非是過匹配的一個(gè)必要現(xiàn)象,因?yàn)闇y(cè)試集和訓(xùn)練集上的準(zhǔn)確度可能會(huì)同時(shí)停止提升。當(dāng)然,采用這樣的方式是可以阻止過匹配的。

實(shí)際上,我們會(huì)使用這種方式變形來試驗(yàn)。記得之前我們載入 MNIST 數(shù)據(jù)的時(shí)候有:

>>> import mnist_loader >>> training_data, validation_data, test_data = \ ... mnist_loader.load_data_wrapper()

到現(xiàn)在我們一直在使用 training_data 和 test_data,沒有用過 validation_data。validation_data 中包含了 $$10,000$$ 幅數(shù)字圖像,這些圖像和訓(xùn)練數(shù)據(jù)集中的 $$50,000$$ 幅圖像以及測(cè)試數(shù)據(jù)集中的 $$10,000$$ 幅都不相同。我們會(huì)使用 validation_data 來防止過匹配。我們會(huì)使用和上面應(yīng)用在 test_data 的策略。我們每個(gè)回合都計(jì)算在 validation_data 上的分類準(zhǔn)確度。一旦分類準(zhǔn)確度已經(jīng)飽和,就停止訓(xùn)練。這個(gè)策略被稱為 提前停止(Early stopping)。當(dāng)然,實(shí)際應(yīng)用中,我們不會(huì)立即知道什么時(shí)候準(zhǔn)確度會(huì)飽和。相反,我們會(huì)一直訓(xùn)練知道我們確信準(zhǔn)確度已經(jīng)飽和。

這里需要一些判定標(biāo)準(zhǔn)來確定什么時(shí)候停止。在我前面的圖中,將 $$280$$ 回合看成是飽和的地方。可能這有點(diǎn)太悲觀了。因?yàn)樯窠?jīng)網(wǎng)絡(luò)有時(shí)候會(huì)訓(xùn)練過程中處在一個(gè)平原期,然后又開始提升。如果在 $$400$$ 回合后,性能又開始提升(也許只是一些少量提升),那我也不會(huì)詫異。所以,在提前停止中采取一點(diǎn)激進(jìn)的策略也是可以的。

為何要使用 validation_data 來替代 test_data 防止過匹配問題?實(shí)際上,這是一個(gè)更為一般的策略的一部分,這個(gè)一般的策略就是使用 validation_data 來衡量不同的超參數(shù)(如訓(xùn)練回合,學(xué)習(xí)率,最好的網(wǎng)絡(luò)架構(gòu)等等)的選擇的效果。我們使用這樣方法來找到超參數(shù)的合適值。因此,盡管到現(xiàn)在我并沒有提及這點(diǎn),但其實(shí)本書前面已經(jīng)稍微介紹了一些超參數(shù)選擇的方法。

當(dāng)然,這對(duì)于我們前面關(guān)于 validation_data 取代 test_data 來防止過匹配的原因仍舊沒有回答。實(shí)際上,有一個(gè)更加一般的問題,就是為何用validation_data 取代 test_data 來設(shè)置更好的超參數(shù)?為了理解這點(diǎn),想想當(dāng)設(shè)置超參數(shù)時(shí),我們想要嘗試許多不同的超參數(shù)選擇。如果我們?cè)O(shè)置超參數(shù)是基于 test_data 的話,可能最終我們就會(huì)得到過匹配于 test_data 的超參數(shù)。也就是說,我們可能會(huì)找到那些 符合 test_data 特點(diǎn)的超參數(shù),但是網(wǎng)絡(luò)的性能并不能夠泛化到其他數(shù)據(jù)集合上。我們借助 validation_data 來克服這個(gè)問題。然后一旦獲得了想要的超參數(shù),最終我們就使用 test_data 進(jìn)行準(zhǔn)確度測(cè)量。這給了我們?cè)?test_data 上結(jié)果是一個(gè)網(wǎng)絡(luò)泛化能力真正的度量方式的信心。換言之,你可以將驗(yàn)證集看成是一種特殊的訓(xùn)練數(shù)據(jù)集能夠幫助我們學(xué)習(xí)好的超參數(shù)。這種尋找好的超參數(shù)的觀點(diǎn)有時(shí)候被稱為 hold out 方法,因?yàn)?validation_data 是從訓(xùn)練集中保留出來的一部分。

在實(shí)際應(yīng)用中,甚至在衡量了測(cè)試集上的性能后,我們可能也會(huì)改變想法并去嘗試另外的方法——也許是一種不同的網(wǎng)絡(luò)架構(gòu)——這將會(huì)引入尋找新的超參數(shù)的的過程。如果我們這樣做,難道不會(huì)產(chǎn)生過匹配于 test_data 的困境么?我們是不是需要一種潛在無限大的數(shù)據(jù)集的回歸,這樣才能夠確信模型能夠泛化?去除這樣的疑惑其實(shí)是一個(gè)深刻而困難的問題。但是對(duì)實(shí)際應(yīng)用的目標(biāo),我們不會(huì)擔(dān)心太多。相反,我們會(huì)繼續(xù)采用基于 training_data, validation_data, and test_data 的基本 hold out 方法。

我們已經(jīng)研究了在使用 $$1,000$$ 幅訓(xùn)練圖像時(shí)的過匹配問題。那么如果我們使用所有的訓(xùn)練數(shù)據(jù)會(huì)發(fā)生什么?我們會(huì)保留所有其他的參數(shù)都一樣($$30$$ 個(gè)隱藏元,學(xué)習(xí)率 $$0.5$$,mini-batch 規(guī)模為 $$10$$),但是訓(xùn)練回合為 $$30$$ 次。下圖展示了分類準(zhǔn)確度在訓(xùn)練和測(cè)試集上的變化情況。注意我們使用的測(cè)試數(shù)據(jù),而不是驗(yàn)證集合,為了讓結(jié)果看起來和前面的圖更方便比較。


如你所見,測(cè)試集和訓(xùn)練集上的準(zhǔn)確度相比我們使用 $$1,000$$ 個(gè)訓(xùn)練數(shù)據(jù)時(shí)相差更小。特別地,在訓(xùn)練數(shù)據(jù)上的最佳的分類準(zhǔn)確度 97.86% 只比測(cè)試集上的 95.33% 準(zhǔn)確度高一點(diǎn)點(diǎn)。而之前的例子中,這個(gè)差距是 17.73%!過匹配仍然發(fā)生了,但是已經(jīng)減輕了不少。我們的網(wǎng)絡(luò)從訓(xùn)練數(shù)據(jù)上更好地泛化到了測(cè)試數(shù)據(jù)上。一般來說,最好的降低過匹配的方式之一就是增加訓(xùn)練樣本的量。有了足夠的訓(xùn)練數(shù)據(jù),就算是一個(gè)規(guī)模非常大的網(wǎng)絡(luò)也不大容易過匹配。不幸的是,訓(xùn)練數(shù)據(jù)其實(shí)是很難或者很昂貴的資源,所以這不是一種太切實(shí)際的選擇。

規(guī)范化

增加訓(xùn)練樣本的數(shù)量是一種減輕過匹配的方法。還有其他的一下方法能夠減輕過匹配的程度么?一種可行的方式就是降低網(wǎng)絡(luò)的規(guī)模。然而,大的網(wǎng)絡(luò)擁有一種比小網(wǎng)絡(luò)更強(qiáng)的潛力,所以這里存在一種應(yīng)用冗余性的選項(xiàng)。

幸運(yùn)的是,還有其他的技術(shù)能夠緩解過匹配,即使我們只有一個(gè)固定的網(wǎng)絡(luò)和固定的訓(xùn)練集合。這種技術(shù)就是規(guī)范化。本節(jié),我會(huì)給出一種最為常用的規(guī)范化手段——有時(shí)候被稱為權(quán)重下降(weight decay)或者 L2 規(guī)范化。L2 規(guī)范化的想法是增加一個(gè)額外的項(xiàng)到代價(jià)函數(shù)上,這個(gè)項(xiàng)叫做 規(guī)范化 項(xiàng)。下面是規(guī)范化交叉熵:


其中第一個(gè)項(xiàng)就是常規(guī)的交叉熵的表達(dá)式。第二個(gè)現(xiàn)在加入到就是所有權(quán)重的平方的和。然后使用一個(gè)因子 $$\lambdas/2n$$ 進(jìn)行量化調(diào)整,其中 $$\lambda > 0$$ 可以成為 規(guī)范化參數(shù),而 $$n$$ 就是訓(xùn)練集合的大小。我們會(huì)在后面討論 $$\lambdas$$ 的選擇策略。需要注意的是,規(guī)范化項(xiàng)里面并不包含偏差。這點(diǎn)我們后面也會(huì)在講述。

當(dāng)然,對(duì)其他的代價(jià)函數(shù)也可以進(jìn)行規(guī)范化,例如二次代價(jià)函數(shù)。類似的規(guī)范化的形式如下:


兩者都可以寫成這樣:


其中 $$C_0$$ 是原始的代價(jià)函數(shù)。

直覺地看,規(guī)范化的效果是讓網(wǎng)絡(luò)傾向于學(xué)習(xí)小一點(diǎn)的權(quán)重,其他的東西都一樣的。大的權(quán)重只有能夠給出代價(jià)函數(shù)第一項(xiàng)足夠的提升時(shí)才被允許。換言之,規(guī)范化可以當(dāng)做一種尋找小的權(quán)重和最小化原始的代價(jià)函數(shù)之間的折中。這兩部分之前相對(duì)的重要性就由 $$\lambda$$ 的值來控制了:$$\lambda$$ 越小,就偏向于最小化原始代價(jià)函數(shù),反之,傾向于小的權(quán)重。

現(xiàn)在,對(duì)于這樣的折中為何能夠減輕過匹配還不是很清楚!但是,實(shí)際表現(xiàn)表明了這點(diǎn)。我們會(huì)在下一節(jié)來回答這個(gè)問題。但現(xiàn)在,我們來看看一個(gè)規(guī)范化的確減輕過匹配的例子。

為了構(gòu)造這個(gè)例子,我們首先需要弄清楚如何將隨機(jī)梯度下降算法應(yīng)用在一個(gè)規(guī)范化的神經(jīng)網(wǎng)絡(luò)上。特別地,我們需要知道如何計(jì)算偏導(dǎo)數(shù) $$\partial C/\partial w$$ 和 $$\partial C/\partial b$$。對(duì)公式(87)進(jìn)行求偏導(dǎo)數(shù)得:


$$\partial C_0/\partial w$$ 和 $$\partial C_0/\partial b$$ 可以通過反向傳播進(jìn)行計(jì)算,和上一章中的那樣。所以我們看到其實(shí)計(jì)算規(guī)范化的代價(jià)函數(shù)的梯度是很簡單的:僅僅需要反向傳播,然后加上 $$\frac{\lambda}{n} w$$ 得到所有權(quán)重的偏導(dǎo)數(shù)。而偏差的偏導(dǎo)數(shù)就不要變化,所以梯度下降學(xué)習(xí)規(guī)則不會(huì)發(fā)生變化:


權(quán)重的學(xué)習(xí)規(guī)則就變成:


這其實(shí)和通常的梯度下降學(xué)習(xí)規(guī)則相同歐諾個(gè),除了乘了 $$1-\frac{\eta\lambda}{n}$$ 因子。這里就是權(quán)重下降的來源。粗看,這樣會(huì)導(dǎo)致權(quán)重會(huì)不斷下降到 $$0$$。但是實(shí)際不是這樣的,因?yàn)槿绻谠即鷥r(jià)函數(shù)中造成下降的話其他的項(xiàng)可能會(huì)讓權(quán)重增加。

好的,這就是梯度下降工作的原理。那么隨機(jī)梯度下降呢?正如在沒有規(guī)范化的隨機(jī)梯度下降中,我們可以通過平均 minibatch 中 $$m$$ 個(gè)訓(xùn)練樣本來估計(jì) $$\partial C_0/\partial w$$。因此,為了隨機(jī)梯度下降的規(guī)范化學(xué)習(xí)規(guī)則就變成(參考 方程(20))


其中后面一項(xiàng)是對(duì) minibatch 中的訓(xùn)練樣本 $$x$$ 進(jìn)行求和,而 $$C_x$$ 是對(duì)每個(gè)訓(xùn)練樣本的(無規(guī)范化的)代價(jià)。這其實(shí)和之前通常的隨機(jī)梯度下降的規(guī)則是一樣的,除了有一個(gè)權(quán)重下降的因子 $$1-\frac{\eta\lambda}{n}$$。最后,為了完備性,我給出偏差的規(guī)范化的學(xué)習(xí)規(guī)則。這當(dāng)然是和我們之前的非規(guī)范化的情形一致了(參考公式(32))


這里也是對(duì)minibatch 中的訓(xùn)練樣本 $$x$$ 進(jìn)行求和的。

讓我們看看規(guī)范化給網(wǎng)絡(luò)帶來的性能提升吧。這里還會(huì)使用有 $$30$$ 個(gè)隱藏神經(jīng)元、minibatch 為 $$10$$,學(xué)習(xí)率為 $$0.5$$,使用交叉熵的神經(jīng)網(wǎng)絡(luò)。然而,這次我們會(huì)使用規(guī)范化參數(shù)為 $$\lambda = 0.1$$。注意在代碼中,我們使用的變量名字為 lmbda,這是因?yàn)樵?Python 中 lambda 是關(guān)鍵字,尤其特定的作用。我也會(huì)使用 test_data,而不是 validation_data。不過嚴(yán)格地講,我們應(yīng)當(dāng)使用 validation_data的,因?yàn)榍懊嬉呀?jīng)講過了。這里我這樣做,是因?yàn)檫@會(huì)讓結(jié)果和非規(guī)范化的結(jié)果對(duì)比起來效果更加直接。你可以輕松地調(diào)整為 validation_data,你會(huì)發(fā)現(xiàn)有相似的結(jié)果。

>>> import mnist_loader >>> training_data, validation_data, test_data = \ ... mnist_loader.load_data_wrapper() >>> import network2 >>> net = network2.Network([784, 30, 10], cost=network2.CrossEntropyCost) >>> net.large_weight_initializer() >>> net.SGD(training_data[:1000], 400, 10, 0.5, ... evaluation_data=test_data, lmbda = 0.1, ... monitor_evaluation_cost=True, monitor_evaluation_accuracy=True, ... monitor_training_cost=True, monitor_training_accuracy=True)

訓(xùn)練集上的代價(jià)函數(shù)持續(xù)下降,和前面無規(guī)范化的情況一樣的規(guī)律:


但是這里測(cè)試集上的準(zhǔn)確度是隨著回合次數(shù)持續(xù)增加的:


顯然,規(guī)范化的使用能夠解決過匹配的問題。而且,準(zhǔn)確度相當(dāng)搞了,最高處達(dá)到了 87.1%,相較于之前的 82.27%。因此,我們幾乎可以確信持續(xù)訓(xùn)練會(huì)有更加好的結(jié)果。實(shí)驗(yàn)起來,規(guī)范化讓網(wǎng)絡(luò)具有更好的泛化能力,顯著地減輕了過匹配的效果。

如果我們換成全部的訓(xùn)練數(shù)據(jù)進(jìn)行訓(xùn)練呢?當(dāng)然,我們之前已經(jīng)看到過匹配在大規(guī)模的數(shù)據(jù)上其實(shí)不是那么明顯了。那規(guī)范化能不能起到相應(yīng)的作用呢?保持超參數(shù)和之前一樣。不過我們這里需要改變規(guī)范化參數(shù)。原因在于訓(xùn)練數(shù)據(jù)的大小已經(jīng)從 $$n=1,000$$ 改成了 $$n=50,000$$,這個(gè)會(huì)改變權(quán)重下降因子 $$1-\frac{\eta\lambda}{n}$$。如果我們持續(xù)使用 $$\lambda = 0.1$$ 就會(huì)產(chǎn)生很小的權(quán)重下降,因此就將規(guī)范化的效果降低很多。我們通過將 $$\lambda = 5.0$$ 來補(bǔ)償這種下降。

好了,來訓(xùn)練網(wǎng)絡(luò),重新初始化權(quán)重:

>>> net.large_weight_initializer() >>> net.SGD(training_data, 30, 10, 0.5, ... evaluation_data=test_data, lmbda = 5.0, ... monitor_evaluation_accuracy=True, monitor_training_accuracy=True)

我們得到:


這個(gè)結(jié)果很不錯(cuò)。第一,我們?cè)跍y(cè)試集上的分類準(zhǔn)確度在使用規(guī)范化后有了提升,從 95.49% 到 96.49%。這是個(gè)很大的進(jìn)步。第二,我們可以看到在訓(xùn)練數(shù)據(jù)和測(cè)試數(shù)據(jù)上的結(jié)果之間的差距也更小了。這仍然是一個(gè)大的差距,不過我們已經(jīng)顯著得到了本質(zhì)上的降低過匹配的進(jìn)步。

最后,我們看看在我們使用 $$100$$ 個(gè)隱藏元和規(guī)范化參數(shù)為 $$\lambda = 5.0$$ 相應(yīng)的測(cè)試分類準(zhǔn)確度。我不會(huì)給出詳細(xì)分析,就為了有趣,來看看我們使用一些技巧(交叉熵函數(shù)和 $$L2$$ 規(guī)范化)能夠達(dá)到多高的準(zhǔn)確度。

>>> net = network2.Network([784, 100, 10], cost=network2.CrossEntropyCost) >>> net.large_weight_initializer() >>> net.SGD(training_data, 30, 10, 0.5, lmbda=5.0, ... evaluation_data=validation_data, ... monitor_evaluation_accuracy=True)

最終在驗(yàn)證集上的準(zhǔn)確度達(dá)到了 97.92%。這是比 $$30$$ 個(gè)隱藏元的較大飛躍。實(shí)際上,稍微改變一點(diǎn),$$60$$ 回合 $$\eta=0.1$$ 和 $$\lambda = 5.0$$。我們就突破了 98%,達(dá)到了 98.04% 的分類準(zhǔn)確度。對(duì)于 $$152$$ 行代碼這個(gè)效果還真不錯(cuò)!

我們討論了作為一種減輕過匹配和提高分類準(zhǔn)確度的方式的規(guī)范化技術(shù)。實(shí)際上,這不是僅有的好處。實(shí)踐表明,在使用不同的(隨機(jī))權(quán)重初始化進(jìn)行多次 MNIST 網(wǎng)絡(luò)訓(xùn)練的時(shí)候,我發(fā)現(xiàn)無規(guī)范化的網(wǎng)絡(luò)會(huì)偶然被限制住,明顯困在了代價(jià)函數(shù)的局部最優(yōu)值處。結(jié)果就是不同的運(yùn)行會(huì)給出相差很大的結(jié)果。對(duì)比看來,規(guī)范化的網(wǎng)絡(luò)能夠提供更容易復(fù)制的結(jié)果。

為何會(huì)這樣子?從經(jīng)驗(yàn)上看,如果代價(jià)函數(shù)是無規(guī)范化的,那么權(quán)重向量的長度可能會(huì)增長,而其他的東西都保持一樣。隨著時(shí)間的推移,這個(gè)會(huì)導(dǎo)致權(quán)重向量變得非常大。所以會(huì)使得權(quán)重向困在差不多方向上,因?yàn)橛捎谔荻认陆档母淖儺?dāng)長度很大的時(shí)候僅僅會(huì)在那個(gè)方向發(fā)生微小的變化。我相信這個(gè)現(xiàn)象讓學(xué)習(xí)算法更難有效地探索權(quán)重空間,最終導(dǎo)致很難找到代價(jià)函數(shù)的最優(yōu)值。

為何規(guī)范化可以幫助減輕過匹配

我們已經(jīng)看到了規(guī)范化在實(shí)踐中能夠減少過匹配了。這是令人振奮的,不過,這背后的原因還不得而知!通常的說法是:小的權(quán)重在某種程度上,意味著更低的復(fù)雜性,也就給出了一種更簡單卻更強(qiáng)大的數(shù)據(jù)解釋,因此應(yīng)該優(yōu)先選擇。這雖然很簡短,不過暗藏了一些可能看起來會(huì)令人困惑的因素。讓我們將這個(gè)解釋細(xì)化,認(rèn)真地研究一下。現(xiàn)在給一個(gè)簡單的數(shù)據(jù)集,我們?yōu)槠浣⒛P?#xff1a;


這里我們其實(shí)在研究某種真實(shí)的現(xiàn)象,$$x$$ 和 $$y$$ 表示真實(shí)的數(shù)據(jù)。我們的目標(biāo)是訓(xùn)練一個(gè)模型來預(yù)測(cè) $$y$$ 關(guān)于 $$x$$ 的函數(shù)。我們可以使用神經(jīng)網(wǎng)絡(luò)來構(gòu)建這個(gè)模型,但是我們先來個(gè)簡單的:用一個(gè)多項(xiàng)式來擬合數(shù)據(jù)。這樣做的原因其實(shí)是多項(xiàng)式相比神經(jīng)網(wǎng)絡(luò)能夠讓事情變得更加清楚。一旦我們理解了多項(xiàng)式的場(chǎng)景,對(duì)于神經(jīng)網(wǎng)絡(luò)可以如法炮制。現(xiàn)在,圖中有十個(gè)點(diǎn),我們就可以找到唯一的 $$9$$ 階多項(xiàng)式 $$y=a_0x^9 + a_1x^8 + ... + a_9$$ 來完全擬合數(shù)據(jù)。下面是多項(xiàng)式的圖像:

I won't show the coefficients explicitly, although they are easy to find using a routine such as Numpy's polyfit
. You can view the exact form of the polynomial in the source code for the graph if you're curious. It's the function p(x)
defined starting on line 14 of the program which produces the graph.


這給出了一個(gè)完美的擬合。但是我們同樣也能夠使用線性模型 $$y=2x$$ 得到一個(gè)好的擬合效果:


哪個(gè)是更好的模型?哪個(gè)更可能是真的?還有哪個(gè)模型更可能泛化到其他的擁有同樣現(xiàn)象的樣本上?

這些都是很難回答的問題。實(shí)際上,我們?nèi)绻麤]有關(guān)于現(xiàn)象背后的信息的話,并不能確定給出上面任何一個(gè)問題的答案。但是讓我們考慮兩種可能的情況:(1)$$9$$ 階多項(xiàng)式實(shí)際上是完全描述了真實(shí)情況的模型,最終它能夠很好地泛化;(2)正確的模型是 $$y=2x$$,但是存在著由于測(cè)量誤差導(dǎo)致的額外的噪聲,使得模型不能夠準(zhǔn)確擬合。

先驗(yàn)假設(shè)無法說出哪個(gè)是正確的(或者,如果還有其他的情況出現(xiàn))。邏輯上講,這些都可能出現(xiàn)。并且這不是易見的差異。在給出的數(shù)據(jù)上,兩個(gè)模型的表現(xiàn)其實(shí)是差不多的。但是假設(shè)我們想要預(yù)測(cè)對(duì)應(yīng)于某個(gè)超過了圖中所有的 $$x$$ 的 $$y$$ 的值,在兩個(gè)模型給出的結(jié)果之間肯定有一個(gè)極大的差距,因?yàn)?$$9$$ 階多項(xiàng)式模型肯定會(huì)被 $$x^9$$ 主導(dǎo),而線性模型只是線性的增長。

在科學(xué)中,一種觀點(diǎn)是我們除非不得已應(yīng)該追隨更簡單的解釋。當(dāng)我們找到一個(gè)簡單模型似乎能夠解釋很多數(shù)據(jù)樣本的時(shí)候,我們都會(huì)激動(dòng)地認(rèn)為發(fā)現(xiàn)了規(guī)律!總之,這看起來簡單的解決僅僅會(huì)是偶然出現(xiàn)的不大可能。我們懷疑模型必須表達(dá)出某些關(guān)于現(xiàn)象的內(nèi)在的真理。如上面的例子,線性模型加噪聲肯定比多項(xiàng)式更加可能。所以如果簡單性是偶然出現(xiàn)的話就很令人詫異。因此我們會(huì)認(rèn)為線性模型加噪聲表達(dá)除了一些潛在的真理。從這個(gè)角度看,多項(xiàng)式模型僅僅是學(xué)習(xí)到了局部噪聲的影響效果。所以盡管多是對(duì)于這些特定的數(shù)據(jù)點(diǎn)表現(xiàn)得很好。模型最終會(huì)在未知數(shù)據(jù)上的泛化上出現(xiàn)問題,所以噪聲線性模型具有更強(qiáng)大的預(yù)測(cè)能力。

讓我們從這個(gè)觀點(diǎn)來看神經(jīng)網(wǎng)絡(luò)。假設(shè)神經(jīng)網(wǎng)絡(luò)大多數(shù)有很小的權(quán)重,這最可能出現(xiàn)在規(guī)范化的網(wǎng)絡(luò)中。更小的權(quán)重意味著網(wǎng)絡(luò)的行為不會(huì)因?yàn)槲覀冸S便改變了一個(gè)輸入而改變太大。這會(huì)讓規(guī)范化網(wǎng)絡(luò)學(xué)習(xí)局部噪聲的影響更加困難。將它看做是一種讓單個(gè)的證據(jù)不會(huì)影響網(wǎng)絡(luò)輸出太多的方式。相對(duì)的,規(guī)范化網(wǎng)絡(luò)學(xué)習(xí)去對(duì)整個(gè)訓(xùn)練集中經(jīng)常出現(xiàn)的證據(jù)進(jìn)行反應(yīng)。對(duì)比看,大權(quán)重的網(wǎng)絡(luò)可能會(huì)因?yàn)檩斎氲奈⑿「淖兌a(chǎn)生比較大的行為改變。所以一個(gè)無規(guī)范化的網(wǎng)絡(luò)可以使用大的權(quán)重來學(xué)習(xí)包含訓(xùn)練數(shù)據(jù)中的噪聲的大量信息的復(fù)雜模型。簡言之,規(guī)范化網(wǎng)絡(luò)受限于根據(jù)訓(xùn)練數(shù)據(jù)中常見的模式來構(gòu)造相對(duì)簡單的模型,而能夠抵抗訓(xùn)練數(shù)據(jù)中的噪聲的特性影響。我們的想法就是這可以讓我們的網(wǎng)絡(luò)對(duì)看到的現(xiàn)象進(jìn)行真實(shí)的學(xué)習(xí),并能夠根據(jù)已經(jīng)學(xué)到的知識(shí)更好地進(jìn)行泛化。

所以,傾向于更簡單的解釋的想法其實(shí)會(huì)讓我們覺得緊張。人們有時(shí)候?qū)⑦@個(gè)想法稱為“奧卡姆剃刀原則”,然后就會(huì)熱情地將其當(dāng)成某種科學(xué)原理來應(yīng)用這個(gè)法則。但是,這就不是一個(gè)一般的科學(xué)原理。也沒有任何先驗(yàn)的邏輯原因來說明簡單的解釋就比更為負(fù)責(zé)的解釋要好。實(shí)際上,有時(shí)候更加復(fù)雜的解釋其實(shí)是正確的。

讓我介紹兩個(gè)說明復(fù)雜正確的例子。在 $$1940$$ 年代,物理學(xué)家 Marcel Schein 發(fā)布了一個(gè)發(fā)現(xiàn)新粒子的聲明。而他工作的公司,GE,非常歡喜,就廣泛地推廣這個(gè)發(fā)現(xiàn)。但是物理學(xué)及 Hans Bethe 就有懷疑。Bethe 訪問了 Schein,看著那些展示 Schein 的新粒子的軌跡的盤子。但是在每個(gè) plate 上,Bethe 都發(fā)現(xiàn)了某個(gè)說明數(shù)據(jù)需要被去除的問題。最后 Schein 展示給 Bethe 一個(gè)看起來很好的 plate。Bethe 說這可能就是一個(gè)統(tǒng)計(jì)上的僥幸。Schein 說,“使得,但是這個(gè)可能就是統(tǒng)計(jì)學(xué),甚至是根據(jù)你自己的公式,也就是 $$1/5$$ 的概率。” Bethe 說:“但我們已經(jīng)看過了這 $$5$$ 個(gè)plate 了”。最終,Schein 說:“但是在我的plate中,每個(gè)好的plate,每個(gè)好的場(chǎng)景,你使用了不同的理論(說它們是新的粒子)進(jìn)行解釋,而我只有一種假設(shè)來解釋所有的 plate。” Bethe 回答說,“在你和我的解釋之間的唯一差別就是你的是錯(cuò)的,而我所有的觀點(diǎn)是正確的。你單一的解釋是錯(cuò)誤的,我的多重解釋所有都是正確的。”后續(xù)的工作證實(shí)了,Bethe 的想法是正確的而 Schein 粒子不再正確。

注意:這一段翻譯得很不好,請(qǐng)參考原文

第二個(gè)例子,在 $$1859$$ 年,天文學(xué)家 Urbain Le Verrier 觀察到水星并沒有按照牛頓萬有引力給出的軌跡進(jìn)行運(yùn)轉(zhuǎn)。與牛頓力學(xué)只有很小的偏差,那時(shí)候一些解釋就是牛頓力學(xué)需要一些微小的改動(dòng)了。在 $$1916$$ 年愛因斯坦證明偏差用他的廣義相對(duì)論可以解釋得更好,這是一種和牛頓重力體系相差很大的理論,基于更復(fù)雜的數(shù)學(xué)。盡管引入了更多的復(fù)雜性,現(xiàn)如今愛因斯坦的解釋其實(shí)是正確的,而牛頓力學(xué)即使加入一些調(diào)整,仍舊是錯(cuò)誤的。這部分因?yàn)槲覀冎缾垡蛩固沟睦碚摬粌H僅解釋了這個(gè)問題,還有很多其他牛頓力學(xué)無法解釋的問題也能夠完美解釋。另外,令人印象深刻的是,愛因斯坦的理論準(zhǔn)確地給出了一些牛頓力學(xué)沒能夠預(yù)測(cè)到的顯現(xiàn)。但是這些令人印象深刻的現(xiàn)象其實(shí)在先前的時(shí)代是觀測(cè)不到的。如果一個(gè)人僅僅通過簡單性作為判斷合理模型的基礎(chǔ),那么一些牛頓力學(xué)的改進(jìn)理論可能會(huì)看起來更加合理一些。

從這些故事中可以讀出三點(diǎn)。第一,確定兩種解釋中哪個(gè)“更加簡單”其實(shí)是一件相當(dāng)微妙的工作。第二,即使我們可以做出這樣一個(gè)判斷,簡單性也是一個(gè)使用時(shí)需要相當(dāng)小心的指導(dǎo)!第三,對(duì)模型真正的測(cè)試不是簡單性,而是它在新場(chǎng)景中對(duì)新的活動(dòng)中的預(yù)測(cè)能力。

所以,我們應(yīng)當(dāng)時(shí)時(shí)記住這一點(diǎn),規(guī)范化的神經(jīng)網(wǎng)絡(luò)常常能夠比非規(guī)范化的泛化能力更強(qiáng),這只是一種實(shí)驗(yàn)事實(shí)(empirical fact)。所以,本書剩下的內(nèi)容,我們也會(huì)頻繁地使用規(guī)范化技術(shù)。我已經(jīng)在上面講過了為何現(xiàn)在還沒有一個(gè)人能夠發(fā)展出一整套具有說服力的關(guān)于規(guī)范化可以幫助網(wǎng)絡(luò)泛化的理論解釋。實(shí)際上,研究者們不斷地在寫自己嘗試不同的規(guī)范化方法,然后看看哪種表現(xiàn)更好,嘗試?yán)斫鉃楹尾煌挠^點(diǎn)表現(xiàn)的更好。所以你可以將規(guī)范化看做某種任意整合的技術(shù)。盡管其效果不錯(cuò),但我們并沒有一套完整的關(guān)于所發(fā)生情況的理解,僅僅是一些不完備的啟發(fā)式規(guī)則或者經(jīng)驗(yàn)。

這里也有更深的問題,這個(gè)問題也是有關(guān)科學(xué)的關(guān)鍵問題——我們?nèi)绾畏夯R?guī)范化能夠給我們一種計(jì)算上的魔力幫助神經(jīng)網(wǎng)絡(luò)更好地泛化,但是并不會(huì)帶來原理上理解的指導(dǎo),甚至不會(huì)告訴我們什么樣的觀點(diǎn)才是最好的。

這個(gè)問題要追溯到歸納問題,最先由蘇格蘭哲學(xué)家大衛(wèi) 休謨?cè)?"An Enquiry Concerning Human Understanding" (1748) 中提出。在現(xiàn)代機(jī)器學(xué)習(xí)領(lǐng)域中歸納問題被 David Wolpert 和 William Macready 描述成無免費(fèi)午餐定理。

這實(shí)在是令人困擾,因?yàn)樵谌粘I钪?#xff0c;我們?nèi)祟愒诜夯媳憩F(xiàn)很好。給一個(gè)兒童幾幅大象的圖片,他就能快速地學(xué)會(huì)認(rèn)識(shí)其他的大象。當(dāng)然,他們偶爾也會(huì)搞錯(cuò),很可能將一只犀牛誤認(rèn)為大象,但是一般說來,這個(gè)過程會(huì)相當(dāng)準(zhǔn)確。所以我們有個(gè)系統(tǒng)——人的大腦——擁有超大量的自由變量。在受到僅僅少量的訓(xùn)練圖像后,系統(tǒng)學(xué)會(huì)了在其他圖像的推廣。某種程度上,我們的大腦的規(guī)范化做得特別好!怎么做的?現(xiàn)在還不得而知。我期望若干年后,我們能夠發(fā)展出更加強(qiáng)大的技術(shù)來規(guī)范化神經(jīng)網(wǎng)絡(luò),最終這些技術(shù)會(huì)讓神經(jīng)網(wǎng)絡(luò)甚至在小的訓(xùn)練集上也能夠?qū)W到強(qiáng)大的泛化能力。

實(shí)際上,我們的網(wǎng)絡(luò)已經(jīng)比我們預(yù)先期望的要好一些了。擁有 $$100$$ 個(gè)隱藏元的網(wǎng)絡(luò)會(huì)有接近 $$80,000$$ 個(gè)參數(shù)。我們的訓(xùn)練集僅僅有 $$50,000$$ 幅圖像。這好像是用一個(gè) $$80,000$$ 階的多項(xiàng)式來擬合 $$50,000$$ 個(gè)數(shù)據(jù)點(diǎn)。我們的網(wǎng)絡(luò)肯定會(huì)過匹配得很嚴(yán)重。但是,這樣的網(wǎng)絡(luò)實(shí)際上卻泛化得很好。為什么?這一點(diǎn)并沒有很好滴理解。這里有個(gè)猜想:梯度下降學(xué)習(xí)的動(dòng)態(tài)有一種自規(guī)范化的效應(yīng)。這真是一個(gè)意料之外的巧合,但也帶來了對(duì)于這種現(xiàn)象本質(zhì)無知的不安。不過,我們還是會(huì)在后面依照這種實(shí)踐的觀點(diǎn)來應(yīng)用規(guī)范化技術(shù)的。
神經(jīng)網(wǎng)絡(luò)也是由于這點(diǎn)表現(xiàn)才更好一些。

現(xiàn)在我們回到前面留下來的一個(gè)細(xì)節(jié):L2 規(guī)范化沒有限制偏差,以此作為本節(jié)的結(jié)論。當(dāng)然了,對(duì)規(guī)范化的過程稍作調(diào)整就可以對(duì)偏差進(jìn)行規(guī)范了。實(shí)踐看來,做出這樣的調(diào)整并不會(huì)對(duì)結(jié)果改變太多,所以,在某種程度上,對(duì)不對(duì)偏差進(jìn)行規(guī)范化其實(shí)就是一種習(xí)慣了。然而,需要注意的是,有一個(gè)大的偏差并不會(huì)像大的權(quán)重那樣會(huì)讓神經(jīng)元對(duì)輸入太過敏感。所以我們不需要對(duì)大的偏差所帶來的學(xué)習(xí)訓(xùn)練數(shù)據(jù)的噪聲太過擔(dān)心。同時(shí),允許大的偏差能夠讓網(wǎng)絡(luò)更加靈活——因?yàn)?#xff0c;大的偏差讓神經(jīng)元更加容易飽和,這有時(shí)候是我們所要達(dá)到的效果。所以,我們通常不會(huì)對(duì)偏差進(jìn)行規(guī)范化。

規(guī)范化的其他技術(shù)

除了 L2 外還有很多規(guī)范化技術(shù)。實(shí)際上,正是由于數(shù)量眾多,我這里也不回將所有的都列舉出來。在本節(jié),我簡要地給出三種減輕過匹配的其他的方法:L1 規(guī)范化、dropout 和人工增加訓(xùn)練樣本。我們不會(huì)像上面介紹得那么深入。其實(shí),目的只是想讓讀者熟悉這些主要的思想,然后來體會(huì)一下規(guī)范化技術(shù)的多樣性。

L1 規(guī)范化:這個(gè)方法其實(shí)是在代價(jià)函數(shù)上加上一個(gè)權(quán)重絕對(duì)值的和:


直覺上看,這和 L2 規(guī)范化相似,懲罰大的權(quán)重,傾向于讓網(wǎng)絡(luò)的權(quán)重變小。當(dāng)然,L1 規(guī)范化和 L2 規(guī)范化并不相同,所以我們不應(yīng)該期望 L1 規(guī)范化是進(jìn)行同樣的行為。讓我們來看看試著理解使用 L1 規(guī)范化和 L2 規(guī)范化所不同的地方。

首先,我們會(huì)研究一下代價(jià)函數(shù)的偏導(dǎo)數(shù)。對(duì)(95)求導(dǎo)我們有:


其中 $$sgn(w)$$ 就是 $$w$$ 的正負(fù)號(hào)。使用這個(gè)表達(dá)式,我們可以輕易地對(duì)反向傳播進(jìn)行修改從而使用基于 L1 規(guī)范化的隨機(jī)梯度下降進(jìn)行學(xué)習(xí)。對(duì) L1 規(guī)范化的網(wǎng)絡(luò)進(jìn)行更新的規(guī)則就是


其中和往常一樣,我們可以用 minibatch 的均值來估計(jì) $$\partial C_0/\partial w$$。對(duì)比公式(93)的 L2 規(guī)范化,


在兩種情形下,規(guī)范化的效果就是縮小權(quán)重。這和我們想要讓權(quán)重不會(huì)太大的直覺目標(biāo)相符。在 L1 規(guī)范化中,權(quán)重按照一個(gè)接近 $$0$$ 的常量進(jìn)行縮小。在 L2 規(guī)范化中,權(quán)重同按照一個(gè)和 $$w$$ 成比例的量進(jìn)行縮小的。所以,當(dāng)一個(gè)特定的權(quán)重絕對(duì)值 $$|w|$$很大時(shí),L1 規(guī)范化縮小得遠(yuǎn)比 L2 規(guī)范化要小得多。而一個(gè)特定的權(quán)重絕對(duì)值 $$|w|$$很小時(shí),L1 規(guī)范化權(quán)值要比 L2 規(guī)范化縮小得更大。最終的結(jié)果就是:L1 規(guī)范化傾向于聚集網(wǎng)絡(luò)的權(quán)重在相對(duì)少量的高重要度連接上,而其他權(quán)重就會(huì)被驅(qū)使向 $$0$$ 接近。

我在上面的討論中其實(shí)忽略了一個(gè)問題——在 $$w=0$$ 的時(shí)候,偏導(dǎo)數(shù) $$\partial C/\partial w$$ 未定義。原因在于函數(shù) $$|w|$$ 在 $$w=0$$ 時(shí)有個(gè)直角,事實(shí)上,導(dǎo)數(shù)是不存在的。不過也沒有關(guān)系。我們下面要做的就是應(yīng)用無規(guī)范化的通常的梯度下降的規(guī)則在 $$w=0$$ 處。這應(yīng)該不會(huì)有什么問題,直覺上看,規(guī)范化的效果就是縮小權(quán)重,顯然,不能對(duì)一個(gè)已經(jīng)是 $$0$$ 的權(quán)重進(jìn)行縮小了。更準(zhǔn)確地說,我們將會(huì)使用方程(96)(97)并約定 $$sgn(0)=0$$。這樣就給出了一種緊致的規(guī)則來進(jìn)行采用 L1 規(guī)范化的隨機(jī)梯度下降學(xué)習(xí)。

Dropout :Dropout 是一種相當(dāng)激進(jìn)的技術(shù)。和 L1、L2 規(guī)范化不同,dropout 并不依賴對(duì)代價(jià)函數(shù)的變更。而是,在 dropout 中,我們改變了網(wǎng)絡(luò)本身。讓我在給出為何工作的原理之前描述一下 dropout 基本的工作機(jī)制和所得到的結(jié)果。

假設(shè)我們嘗試訓(xùn)練一個(gè)網(wǎng)絡(luò):


特別地,假設(shè)我們有一個(gè)訓(xùn)練數(shù)據(jù) $$x$$ 和 對(duì)應(yīng)的目標(biāo)輸出 $$y$$。通常我們會(huì)通過在網(wǎng)絡(luò)中前向傳播 $$x$$ ,然后進(jìn)行反向傳播來確定對(duì)梯度的共現(xiàn)。使用 dropout,這個(gè)過程就改了。我們會(huì)從隨機(jī)(臨時(shí))地刪除網(wǎng)絡(luò)中的一半的神經(jīng)元開始,讓輸入層和輸出層的神經(jīng)元保持不變。在此之后,我們會(huì)得到最終的網(wǎng)絡(luò)。注意那些被 dropout 的神經(jīng)元,即那些臨時(shí)性刪除的神經(jīng)元,用虛圈表示在途中:


我們前向傳播輸入,通過修改后的網(wǎng)絡(luò),然后反向傳播結(jié)果,同樣通過這個(gè)修改后的網(wǎng)絡(luò)。在 minibatch 的若干樣本上進(jìn)行這些步驟后,我們對(duì)那些權(quán)重和偏差進(jìn)行更新。然后重復(fù)這個(gè)過程,首先重置 dropout 的神經(jīng)元,然后選擇新的隨機(jī)隱藏元的子集進(jìn)行刪除,估計(jì)對(duì)一個(gè)不同的minibatch的梯度,然后更新權(quán)重和偏差。

通過不斷地重復(fù),我們的網(wǎng)絡(luò)會(huì)學(xué)到一個(gè)權(quán)重和偏差的集合。當(dāng)然,這些權(quán)重和偏差也是在一般的隱藏元被丟棄的情形下學(xué)到的。當(dāng)我們實(shí)際運(yùn)行整個(gè)網(wǎng)絡(luò)時(shí),是指兩倍的隱藏元將會(huì)被激活。為了補(bǔ)償這個(gè),我們將從隱藏元出去的權(quán)重減半了。

這個(gè) dropout 過程可能看起來奇怪和ad hoc。為什么我們期待這樣的方法能夠進(jìn)行規(guī)范化呢?為了解釋所發(fā)生的事,我希望你停下來想一下沒有 dropout 的訓(xùn)練方式。特別地,想象一下我們訓(xùn)練幾個(gè)不同的神經(jīng)網(wǎng)絡(luò),使用的同一個(gè)訓(xùn)練數(shù)據(jù)。當(dāng)然,網(wǎng)絡(luò)可能不是從同一初始狀態(tài)開始的,最終的結(jié)果也會(huì)有一些差異。出現(xiàn)這種情況時(shí),我們可以使用一些平均或者投票的方式來確定接受哪個(gè)輸出。例如,如果我們訓(xùn)練了五個(gè)網(wǎng)絡(luò),其中三個(gè)被分類當(dāng)做是 $$3$$,那很可能它就是 $$3$$。另外兩個(gè)可能就犯了錯(cuò)誤。這種平均的方式通常是一種強(qiáng)大(盡管代價(jià)昂貴)的方式來減輕過匹配。原因在于不同的網(wǎng)絡(luò)可能會(huì)以不同的方式過匹配,平均法可能會(huì)幫助我們消除那樣的過匹配。

那么這和 dropout 有什么關(guān)系呢?啟發(fā)式地看,當(dāng)我們丟掉不同的神經(jīng)元集合時(shí),有點(diǎn)像我們?cè)谟?xùn)練不同的神經(jīng)網(wǎng)絡(luò)。所以,dropout 過程就如同大量不同網(wǎng)絡(luò)的效果的平均那樣。不同的網(wǎng)絡(luò)以不同的方式過匹配了,所以,dropout 的網(wǎng)絡(luò)會(huì)減輕過匹配。

一個(gè)相關(guān)的啟發(fā)式解釋在早期使用這項(xiàng)技術(shù)的論文中曾經(jīng)給出:“因?yàn)樯窠?jīng)元不能依賴其他神經(jīng)元特定的存在,這個(gè)技術(shù)其實(shí)減少了復(fù)雜的互適應(yīng)的神經(jīng)元。所以,強(qiáng)制要學(xué)習(xí)那些在神經(jīng)元的不同隨機(jī)子集中更加健壯的特征。”換言之,如果我們就愛那個(gè)神經(jīng)網(wǎng)絡(luò)看做一個(gè)進(jìn)行預(yù)測(cè)的模型的話,我們就可以將 dropout 看做是一種確保模型對(duì)于證據(jù)丟失健壯的方式。這樣看來,dropout 和 L1、L2 規(guī)范化也是有相似之處的,這也傾向于更小的權(quán)重,最后讓網(wǎng)絡(luò)對(duì)丟失個(gè)體連接的場(chǎng)景更加健壯。

當(dāng)然,真正衡量 dropout 的方式在提升神經(jīng)網(wǎng)絡(luò)性能上應(yīng)用得相當(dāng)成功。原始論文介紹了用來解決很多不同問題的技術(shù)。對(duì)我們來說,特別感興趣的是他們應(yīng)用 dropout 在 MNIST 數(shù)字分類上,使用了一個(gè)和我們之前介紹的那種初級(jí)的前向神經(jīng)網(wǎng)絡(luò)。這篇文章關(guān)注到最好的結(jié)果是在測(cè)試集上去得到 98.4% 的準(zhǔn)確度。他們使用dropout 和 L2 規(guī)范化的組合將其提高到了 98.7%。類似重要的結(jié)果在其他不同的任務(wù)上也取得了一定的成效。dropout 已經(jīng)在過匹配問題尤其突出的訓(xùn)練大規(guī)模深度網(wǎng)絡(luò)中。

人工擴(kuò)展訓(xùn)練數(shù)據(jù):我們前面看到了 MNIST 分類準(zhǔn)確度在我們使用 $$1,000$$ 幅訓(xùn)練圖像時(shí)候下降到了 $$80$$ 年代的準(zhǔn)確度。這種情況并不奇怪,因?yàn)楦俚挠?xùn)練數(shù)據(jù)意味著我們的網(wǎng)絡(luò)所接觸到較少的人類手寫的數(shù)字中的變化。讓我們訓(xùn)練 $$30$$ 個(gè)隱藏元的網(wǎng)絡(luò),使用不同的訓(xùn)練數(shù)據(jù)集,來看看性能的變化情況。我們使用 minibatch 大小為 $$10$$,學(xué)習(xí)率是 $$\eta=0.5$$,規(guī)范化參數(shù)是 $$\lambda=5.0$$,交叉熵代價(jià)函數(shù)。我們?cè)谌坑?xùn)練數(shù)據(jù)集合上訓(xùn)練 30 個(gè)回合,然后會(huì)隨著訓(xùn)練數(shù)據(jù)量的下降而成比例變化回合數(shù)。為了確保權(quán)重下降因子在訓(xùn)練數(shù)據(jù)集上相同,我們會(huì)在全部訓(xùn)練集上使用規(guī)范化參數(shù)為 $$\lambda = 5.0$$,然后在使用更小的訓(xùn)練集的時(shí)候成比例地下降 $$\lambda$$ 值。

This and the next two graph are produced with the program more_data.py.


如你所見,分類準(zhǔn)確度在使用更多的訓(xùn)練數(shù)據(jù)時(shí)提升了很大。根據(jù)這個(gè)趨勢(shì)的話,提升會(huì)隨著更多的數(shù)據(jù)而不斷增加。當(dāng)然,在訓(xùn)練的后期我們看到學(xué)習(xí)過程已經(jīng)進(jìn)入了飽和狀態(tài)。然而,如果我們使用對(duì)數(shù)作為橫坐標(biāo)的話,可以重畫此圖如下:


這看起來到了后面結(jié)束的地方,增加仍舊明顯。這表明如果我們使用大量更多的訓(xùn)練數(shù)據(jù)——不妨設(shè)百萬或者十億級(jí)的手寫樣本——那么,我們可能會(huì)得到更好的性能,即使是用這樣的簡單網(wǎng)絡(luò)。

獲取更多的訓(xùn)練樣本其實(shí)是很重要的想法。不幸的是,這個(gè)方法代價(jià)很大,在實(shí)踐中常常是很難達(dá)到的。不過,還有一種方法能夠獲得類似的效果,那就是進(jìn)行人工的樣本擴(kuò)展。假設(shè)我們使用一個(gè) $$5$$ 的訓(xùn)練樣本,


將其進(jìn)行旋轉(zhuǎn),比如說 $$15$$°:


這還是會(huì)被設(shè)別為同樣的數(shù)字的。但是在像素層級(jí)這和任何一幅在 MNIST 訓(xùn)練數(shù)據(jù)中的圖像都不相同。所以將這樣的樣本加入到訓(xùn)練數(shù)據(jù)中是很可能幫助我們學(xué)習(xí)有關(guān)手寫數(shù)字更多知識(shí)的方法。而且,顯然,我們不會(huì)就只對(duì)這幅圖進(jìn)行人工的改造。我們可以在所有的 MNIST 訓(xùn)練樣本上通過和多小的旋轉(zhuǎn)擴(kuò)展訓(xùn)練數(shù)據(jù),然后使用擴(kuò)展后的訓(xùn)練數(shù)據(jù)來提升我們網(wǎng)絡(luò)的性能。

這個(gè)想法非常強(qiáng)大并且已經(jīng)被廣發(fā)應(yīng)用了。讓我們看看一些在 MNIST 上使用了類似的方法進(jìn)行研究成果。其中一種他們考慮的網(wǎng)絡(luò)結(jié)構(gòu)其實(shí)和我們已經(jīng)使用過的類似——一個(gè)擁有 800 個(gè)隱藏元的前驅(qū)神經(jīng)網(wǎng)絡(luò),使用了交叉熵代價(jià)函數(shù)。在標(biāo)準(zhǔn)的 MNIST 訓(xùn)練數(shù)據(jù)上運(yùn)行這個(gè)網(wǎng)絡(luò),得到了 98.4% 的分類準(zhǔn)確度,其中使用了不只是旋轉(zhuǎn)還包括轉(zhuǎn)換和扭曲。通過在這個(gè)擴(kuò)展后的數(shù)據(jù)集上的訓(xùn)練,他們提升到了 98.9% 的準(zhǔn)確度。然后還在“彈性扭曲(elastic distortion)”的數(shù)據(jù)上進(jìn)行了實(shí)驗(yàn),這是一種特殊的為了模仿手部肌肉的隨機(jī)抖動(dòng)的圖像扭曲方法。通過使用彈性扭曲擴(kuò)展的數(shù)據(jù),他們最終達(dá)到了 99.3% 的分類準(zhǔn)確度。他們通過展示訓(xùn)練數(shù)據(jù)的所有類型的變體來擴(kuò)展了網(wǎng)絡(luò)的經(jīng)驗(yàn)。

Best Practices for Convolutional Neural Networks Applied to Visual Document Analysis, by Patrice Simard, Dave Steinkraus, and John Platt (2003).

這個(gè)想法的變體也可以用在提升手寫數(shù)字識(shí)別之外不同學(xué)習(xí)任務(wù)上的性能。一般就是通過應(yīng)用反映真實(shí)世界變化的操作來擴(kuò)展訓(xùn)練數(shù)據(jù)。找到這些方法其實(shí)并不困難。例如,你要構(gòu)建一個(gè)神經(jīng)網(wǎng)絡(luò)來進(jìn)行語音識(shí)別。我們?nèi)祟惿踔量梢栽谟斜尘霸肼暤那闆r下識(shí)別語音。所以你可以通過增加背景噪聲來擴(kuò)展你的訓(xùn)練數(shù)據(jù)。我們同樣能夠?qū)ζ溥M(jìn)行加速和減速來獲得相應(yīng)的擴(kuò)展數(shù)據(jù)。所以這是另外的一些擴(kuò)展訓(xùn)練數(shù)據(jù)的方法。這些技術(shù)并不總是有用——例如,其實(shí)與其在數(shù)據(jù)中加入噪聲,倒不如先對(duì)數(shù)據(jù)進(jìn)行噪聲的清理,這樣可能更加有效。當(dāng)然,記住可以進(jìn)行數(shù)據(jù)的擴(kuò)展,尋求應(yīng)用的機(jī)會(huì)還是相當(dāng)有價(jià)值的一件事。

練習(xí)

  • 正如上面討論的那樣,一種擴(kuò)展 MNIST 訓(xùn)練數(shù)據(jù)的方式是用一些微小的旋轉(zhuǎn)。如果我們?cè)试S過大的旋轉(zhuǎn),則會(huì)出現(xiàn)什么狀況呢?

大數(shù)據(jù)的旁白和對(duì)分類準(zhǔn)確度的影響:讓我們看看神經(jīng)網(wǎng)絡(luò)準(zhǔn)確度隨著訓(xùn)練集大小變化的情況:


假設(shè),我們使用別的什么方法來進(jìn)行分類。例如,我們使用 SVM。正如第一章介紹的那樣,不要擔(dān)心你熟不熟悉 SVM,我們不進(jìn)行深入的討論。下面是 SVM 模型的準(zhǔn)確度隨著訓(xùn)練數(shù)據(jù)集的大小變化的情況:


可能第一件讓你吃驚的是神經(jīng)網(wǎng)絡(luò)在每個(gè)訓(xùn)練規(guī)模下性能都超過了 SVM。這很好,盡管你對(duì)細(xì)節(jié)和原理可能不太了解,因?yàn)槲覀冎皇侵苯訌?scikit-learn 中直接調(diào)用了這個(gè)方法,而對(duì)神經(jīng)網(wǎng)絡(luò)已經(jīng)深入講解了很多。更加微妙和有趣的現(xiàn)象其實(shí)是如果我們訓(xùn)練 SVM 使用 $$50,000$$ 幅圖像,實(shí)際上 SVM 已經(jīng)能夠超過我們使用 $$5,000$$ 幅圖像的準(zhǔn)確度。換言之,更多的訓(xùn)練數(shù)據(jù)可以補(bǔ)償不同的機(jī)器學(xué)習(xí)算法的差距。

還有更加有趣的現(xiàn)象也出現(xiàn)了。假設(shè)我們?cè)囍脙煞N機(jī)器學(xué)習(xí)算法去解決問題,算法 $$A$$ 和算法 $$B$$。有時(shí)候出現(xiàn),算法 $$A$$ 在一個(gè)訓(xùn)練集合上超過 算法 $$B$$,卻在另一個(gè)訓(xùn)練集上弱于算法 $$B$$。上面我們并沒有看到這個(gè)情況——因?yàn)檫@要求兩幅圖有交叉的點(diǎn)——這里并沒有。對(duì)“算法 A 是不是要比算法 $$B$$ 好?”正確的反應(yīng)應(yīng)該是“你在使用什么訓(xùn)練集合?”

在進(jìn)行開發(fā)時(shí)或者在讀研究論文時(shí),這都是需要記住的事情。很多論文聚焦在尋找新的技術(shù)來給出標(biāo)準(zhǔn)數(shù)據(jù)集上更好的性能。“我們的超贊的技術(shù)在標(biāo)準(zhǔn)測(cè)試集 $$Y$$ 上給出了百分之 $$X$$ 的性能提升。”這是通常的研究聲明。這樣的聲明通常比較有趣,不過也必須被理解為僅僅在特定的訓(xùn)練數(shù)據(jù)機(jī)上的應(yīng)用效果。那些給出基準(zhǔn)數(shù)據(jù)集的人們會(huì)擁有更大的研究經(jīng)費(fèi)支持,這樣能夠獲得更好的訓(xùn)練數(shù)據(jù)。所以,很可能他們由于超贊的技術(shù)的性能提升其實(shí)在更大的數(shù)據(jù)集合上就喪失了。換言之,人們標(biāo)榜的提升可能就是歷史的偶然。所以需要記住的特別是在實(shí)際應(yīng)用中,我們想要的是更好的算法和更好的訓(xùn)練數(shù)據(jù)。尋找更好的算法很重,不過需要確保你在此過程中,沒有放棄對(duì)更多更好的數(shù)據(jù)的追求。

問題

  • 研究問題:我們的機(jī)器學(xué)習(xí)算法在非常大的數(shù)據(jù)集上如何進(jìn)行?對(duì)任何給定的算法,其實(shí)去定義一個(gè)隨著訓(xùn)練數(shù)據(jù)規(guī)模變化的漸近的性能是一種很自然的嘗試。一種簡單粗暴的方法就是簡單地進(jìn)行上面圖中的趨勢(shì)分析,然后將圖像推進(jìn)到無窮大。而對(duì)此想法的反駁是曲線本身會(huì)給出不同的漸近性能。你能夠找到擬合某些特定類別曲線的理論上的驗(yàn)證方法嗎?如果可以,比較不同的機(jī)器學(xué)習(xí)算法的漸近性能。

總結(jié):我們現(xiàn)在已經(jīng)介紹完了過匹配和規(guī)范化。當(dāng)然,我們重回這個(gè)問題。正如我們前面講過的那樣,尤其是計(jì)算機(jī)越來越強(qiáng)大,我們有訓(xùn)練更大的網(wǎng)絡(luò)的能力時(shí)。過匹配是神經(jīng)網(wǎng)絡(luò)中一個(gè)主要的問題。我們有迫切的愿望來開發(fā)出強(qiáng)大的規(guī)范化技術(shù)來減輕過匹配,所以,這也是當(dāng)前極其熱門的研究方向之一。



文/Not_GOD(簡書作者)
原文鏈接:http://www.jianshu.com/p/6cf8c7181d19
著作權(quán)歸作者所有,轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),并標(biāo)注“簡書作者”Not_GOD

總結(jié)

以上是生活随笔為你收集整理的第三章 改进神经网络的学习方式(上中)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。