[譯] 第三章 改進(jìn)神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)方式(下)

Neil Zhu,簡書ID Not_GOD,University AI 創(chuàng)始人 & Chief Scientist,致力于推進(jìn)世界人工智能化進(jìn)程。制定并實(shí)施 UAI 中長期增長戰(zhàn)略和目標(biāo),帶領(lǐng)團(tuán)隊快速成長為人工智能領(lǐng)域最專業(yè)的力量。
作為行業(yè)領(lǐng)導(dǎo)者,他和UAI一起在2014年創(chuàng)建了TASA(中國最早的人工智能社團(tuán)), DL Center(深度學(xué)習(xí)知識中心全球價值網(wǎng)絡(luò)),AI growth(行業(yè)智庫培訓(xùn))等,為中國的人工智能人才建設(shè)輸送了大量的血液和養(yǎng)分。此外,他還參與或者舉辦過各類國際性的人工智能峰會和活動,產(chǎn)生了巨大的影響力,書寫了60萬字的人工智能精品技術(shù)內(nèi)容,生產(chǎn)翻譯了全球第一本深度學(xué)習(xí)入門書《神經(jīng)網(wǎng)絡(luò)與深度學(xué)習(xí)》,生產(chǎn)的內(nèi)容被大量的專業(yè)垂直公眾號和媒體轉(zhuǎn)載與連載。曾經(jīng)受邀為國內(nèi)頂尖大學(xué)制定人工智能學(xué)習(xí)規(guī)劃和教授人工智能前沿課程,均受學(xué)生和老師好評。

如何選擇神經(jīng)網(wǎng)絡(luò)的超參數(shù)


直到現(xiàn)在,我們還沒有解釋對諸如學(xué)習(xí)率 $$\eta$$,規(guī)范化參數(shù) $$\lambda$$ 等等超參數(shù)選擇的方法。我只是給出那些效果很好的值而已。實(shí)踐中,當(dāng)你使用神經(jīng)網(wǎng)絡(luò)解決問題時,尋找好的超參數(shù)其實(shí)是很困難的一件事。例如,我們要解決 MNIST 問題,開始時對于選擇什么樣的超參數(shù)一無所知。假設(shè),剛開始的實(shí)驗(yàn)中選擇前面章節(jié)的參數(shù)都是運(yùn)氣較好。但在使用學(xué)習(xí)率 $$\eta=10.0$$ 而規(guī)范化參數(shù) $$\lambda=1000.0$$。下面是我們的一個嘗試:

>>> import mnist_loader
>>> training_data, validation_data, test_data = \
... mnist_loader.load_data_wrapper()
>>> import network2
>>> net = network2.Network([784, 30, 10])
>>> net.SGD(training_data, 30, 10, 10.0, lmbda = 1000.0,
... evaluation_data=validation_data, monitor_evaluation_accuracy=True)
Epoch 0 training complete
Accuracy on evaluation data: 1030 / 10000

Epoch 1 training complete
Accuracy on evaluation data: 990 / 10000

Epoch 2 training complete
Accuracy on evaluation data: 1009 / 10000

...

Epoch 27 training complete
Accuracy on evaluation data: 1009 / 10000

Epoch 28 training complete
Accuracy on evaluation data: 983 / 10000

Epoch 29 training complete
Accuracy on evaluation data: 967 / 10000

我們分類準(zhǔn)確度并不比隨機(jī)選擇更好。網(wǎng)絡(luò)就像隨機(jī)噪聲產(chǎn)生器一樣。

你可能會說,“這好辦,降低學(xué)習(xí)率和規(guī)范化參數(shù)就好了。”不幸的是,你并不先驗(yàn)地知道這些就是需要調(diào)整的超參數(shù)。可能真正的問題出在 $$30$$ 個隱藏元中,本身就不能很有效,不管我們?nèi)绾握{(diào)整其他的超參數(shù)都沒有作用的?可能我們真的需要至少 $$100$$ 個隱藏神經(jīng)元?或者是 $$300$$ 個隱藏神經(jīng)元?或者更多層的網(wǎng)絡(luò)?或者不同輸出編碼方式?可能我們的網(wǎng)絡(luò)一直在學(xué)習(xí),只是學(xué)習(xí)的回合還不夠?可能 minibatch 的太小了?可能我們需要切換成二次代價函數(shù)?可能我們需要嘗試不同的權(quán)重初始化方法?等等。很容易就在超參數(shù)的選擇中迷失了方向。如果你的網(wǎng)絡(luò)規(guī)模很大,或者使用了很多的訓(xùn)練數(shù)據(jù),這種情況就很令人失望了,因?yàn)橐淮斡?xùn)練可能就要幾個小時甚至幾天乃至幾周,最終什么都沒有獲得。如果這種情況一直發(fā)生,就會打擊你的自信心。可能你會懷疑神經(jīng)網(wǎng)絡(luò)是不是適合你所遇到的問題?可能就應(yīng)該放棄這種嘗試了?

本節(jié),我會給出一些用于設(shè)定超參數(shù)的啟發(fā)式想法。目的是幫你發(fā)展出一套工作流來確保很好地設(shè)置超參數(shù)。當(dāng)然,我不會覆蓋超參數(shù)優(yōu)化的每個方法。那是太繁重的問題,而且也不會是一個能夠完全解決的問題,也不存在一種通用的關(guān)于正確策略的共同認(rèn)知。總是會有一些新的技巧可以幫助你提高一點(diǎn)性能。但是本節(jié)的啟發(fā)式想法能幫你開個好頭。

寬的策略:在使用神經(jīng)網(wǎng)絡(luò)來解決新的問題時,一個挑戰(zhàn)就是獲得任何一種非尋常的學(xué)習(xí),也就是說,達(dá)到比隨機(jī)的情況更好的結(jié)果。這個實(shí)際上會很困難,尤其是遇到一種新類型的問題時。讓我們看看有哪些策略可以在面臨這類困難時候嘗試。

假設(shè),我們第一次遇到 MNIST 分類問題。剛開始,你很有激情,但是當(dāng)?shù)谝粋€神經(jīng)網(wǎng)絡(luò)完全失效時,你會就得有些沮喪。此時就可以將問題簡化。丟開訓(xùn)練和驗(yàn)證集合中的那些除了 $$0$$ 和 $$1$$ 的那些圖像。然后試著訓(xùn)練一個網(wǎng)絡(luò)來區(qū)分 $$0$$ 和 $$1$$。不僅僅問題比 $$10$$ 個分類的情況簡化了,同樣也會減少 80% 的訓(xùn)練數(shù)據(jù),這樣就給出了 $$5$$ 倍的加速。這樣可以保證更快的實(shí)驗(yàn),也能給予你關(guān)于如何構(gòu)建好的網(wǎng)絡(luò)更快的洞察。

你通過簡化網(wǎng)絡(luò)來加速實(shí)驗(yàn)進(jìn)行更有意義的學(xué)習(xí)。如果你相信 $$[784, 10]$$ 的網(wǎng)絡(luò)更可能比隨機(jī)更加好的分類效果,那么就從這個網(wǎng)絡(luò)開始實(shí)驗(yàn)。這會比訓(xùn)練一個 $$[784, 30 ,10]$$ 的網(wǎng)絡(luò)更快,你可以進(jìn)一步嘗試后一個。

你可以通過提高監(jiān)控的頻率來在試驗(yàn)中獲得另一個加速了。在 network2.py 中,我們在每個訓(xùn)練的回合的最后進(jìn)行監(jiān)控。每回合 $$50,000$$,在接受到網(wǎng)絡(luò)學(xué)習(xí)狀況的反饋前需要等上一會兒——在我的筆記本上訓(xùn)練 $$[784, 30, 10]$$ 網(wǎng)絡(luò)基本上每回合 $$10$$ 秒。當(dāng)然,$$10$$ 秒并不太長,不過你希望嘗試幾十種超參數(shù)就很麻煩了,如果你想再嘗試更多地選擇,那就相當(dāng)棘手了。我們可以通過更加頻繁地監(jiān)控驗(yàn)證準(zhǔn)確度來獲得反饋,比如說在每 $$1,000$$ 次訓(xùn)練圖像后。而且,與其使用整個 $$10,000$$ 幅圖像的驗(yàn)證集來監(jiān)控性能,我們可以使用 $$100$$ 幅圖像來進(jìn)行驗(yàn)證。真正重要的是網(wǎng)絡(luò)看到足夠多的圖像來做真正的學(xué)習(xí),獲得足夠優(yōu)秀的估計性能。當(dāng)然,我們的程序 network2.py 并沒有做這樣的監(jiān)控。但是作為一個湊合的能夠獲得類似效果的方案,我們將訓(xùn)練數(shù)據(jù)減少到前 $$1,000$$ 幅 MNIST 訓(xùn)練圖像。讓我們嘗試一下,看看結(jié)果。(為了讓代碼更加簡單,我并沒有取僅僅是 0 和 1 的圖像。當(dāng)然,那樣也是很容易就可以實(shí)現(xiàn))。

>>> net = network2.Network([784, 10])
>>> net.SGD(training_data[:1000], 30, 10, 10.0, lmbda = 1000.0, \
... evaluation_data=validation_data[:100], \
... monitor_evaluation_accuracy=True)
Epoch 0 training complete
Accuracy on evaluation data: 10 / 100

Epoch 1 training complete
Accuracy on evaluation data: 10 / 100

Epoch 2 training complete
Accuracy on evaluation data: 10 / 100
...

我們?nèi)匀猾@得完全的噪聲!但是有一個進(jìn)步:現(xiàn)在我們每一秒鐘可以得到反饋,而不是之前每 10 秒鐘才可以。這意味著你可以更加快速地實(shí)驗(yàn)其他的超參數(shù),或者甚至近同步地進(jìn)行不同參數(shù)的組合的評比。

在上面的例子中,我設(shè)置 $$\lambda=1000.0$$,跟我們之前一樣。但是因?yàn)檫@里改變了訓(xùn)練樣本的個數(shù),我們必須對 $$\lambda$$ 進(jìn)行調(diào)整以保證權(quán)重下降的同步性。這意味著改變 $$\lambda = 20.0$$。如果我們這樣設(shè)置,則有:

>>> net = network2.Network([784, 10])
>>> net.SGD(training_data[:1000], 30, 10, 10.0, lmbda = 20.0, \
... evaluation_data=validation_data[:100], \
... monitor_evaluation_accuracy=True)
Epoch 0 training complete
Accuracy on evaluation data: 12 / 100

Epoch 1 training complete
Accuracy on evaluation data: 14 / 100

Epoch 2 training complete
Accuracy on evaluation data: 25 / 100

Epoch 3 training complete
Accuracy on evaluation data: 18 / 100
...

哦也!現(xiàn)在有了信號了。不是非常糟糕的信號,卻真是一個信號。我們可以基于這點(diǎn),來改變超參數(shù)從而獲得更多的提升。可能我們猜測學(xué)習(xí)率需要增加(你可以能會發(fā)現(xiàn),這只是一個不大好的猜測,原因后面會講,但是相信我)所以為了測試我們的猜測就將 $$\eta$$ 調(diào)整至 $$100.0$$:

>>> net = network2.Network([784, 10])
>>> net.SGD(training_data[:1000], 30, 10, 100.0, lmbda = 20.0, \
... evaluation_data=validation_data[:100], \
... monitor_evaluation_accuracy=True)
Epoch 0 training complete
Accuracy on evaluation data: 10 / 100

Epoch 1 training complete
Accuracy on evaluation data: 10 / 100

Epoch 2 training complete
Accuracy on evaluation data: 10 / 100

Epoch 3 training complete
Accuracy on evaluation data: 10 / 100

...

這并不好!告訴我們之前的猜測是錯誤的,問題并不是學(xué)習(xí)率太低了。所以,我們試著將 $$\eta$$ 將至 $$\eta=1.0$$:

>>> net = network2.Network([784, 10])
>>> net.SGD(training_data[:1000], 30, 10, 1.0, lmbda = 20.0, \
... evaluation_data=validation_data[:100], \
... monitor_evaluation_accuracy=True)
Epoch 0 training complete
Accuracy on evaluation data: 62 / 100

Epoch 1 training complete
Accuracy on evaluation data: 42 / 100

Epoch 2 training complete
Accuracy on evaluation data: 43 / 100

Epoch 3 training complete
Accuracy on evaluation data: 61 / 100

...

這樣好點(diǎn)了!所以我們可以繼續(xù),逐個調(diào)整每個超參數(shù),慢慢提升性能。一旦我們找到一種提升性能的 $$\eta$$ 值,我們就可以嘗試尋找好的值。然后按照一個更加復(fù)雜的網(wǎng)絡(luò)架構(gòu)進(jìn)行實(shí)驗(yàn),假設(shè)是一個有 $$10$$ 個隱藏元的網(wǎng)絡(luò)。然后繼續(xù)調(diào)整 $$\eta$$ 和 $$\lambda$$。接著調(diào)整成 $$20$$ 個隱藏元。然后將其他的超參數(shù)調(diào)整再調(diào)整。如此進(jìn)行,在每一步使用我們 hold out 驗(yàn)證數(shù)據(jù)集來評價性能,使用這些度量來找到越來越好的超參數(shù)。當(dāng)我們這么做的時候,一般都需要花費(fèi)更多時間來發(fā)現(xiàn)由于超參數(shù)改變帶來的影響,這樣就可以一步步減少監(jiān)控的頻率。

所有這些作為一種寬泛的策略看起來很有前途。然而,我想要回到尋找超參數(shù)的原點(diǎn)。實(shí)際上,即使是上面的討論也傳達(dá)出過于樂觀的觀點(diǎn)。實(shí)際上,很容易會遇到神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)不到任何知識的情況。你可能要花費(fèi)若干天在調(diào)整參數(shù)上,仍然沒有進(jìn)展。所以我想要再重申一下在前期你應(yīng)該從實(shí)驗(yàn)中盡可能早的獲得快速反饋。直覺上看,這看起來簡化問題和架構(gòu)僅僅會降低你的效率。實(shí)際上,這樣能夠?qū)⑦M(jìn)度加快,因?yàn)槟隳軌蚋斓卣业絺鬟_(dá)出有意義的信號的網(wǎng)絡(luò)。一旦你獲得這些信號,你可以嘗嘗通過微調(diào)超參數(shù)獲得快速的性能提升。這和人生中很多情況一樣——萬事開頭難。

好了,上面就是寬泛的策略。現(xiàn)在我們看看一些具體的設(shè)置超參數(shù)的推薦。我會聚焦在學(xué)習(xí)率 $$\eta$$,L2 規(guī)范化參數(shù) $$\lambda$$,和 minibatch 大小。然而,很多的觀點(diǎn)同樣可以應(yīng)用在其他的超參數(shù)的選擇上,包括一些關(guān)于網(wǎng)絡(luò)架構(gòu)的、其他類型的規(guī)范化和一些本書后面遇到的如 momentum co-efficient 這樣的超參數(shù)。

學(xué)習(xí)率:假設(shè)我們運(yùn)行了三個不同學(xué)習(xí)率($$\eta=0.025$$、$$\eta=0.25$$、$$\eta=2.5$$)的 MNIST 網(wǎng)絡(luò)。我們會像前面介紹的實(shí)驗(yàn)?zāi)菢釉O(shè)置其他的超參數(shù),進(jìn)行 $$30$$ 回合,minibatch 大小為 $$10$$,然后 $$\lambda = 5.0$$。我們同樣會使用整個 $$50,000$$ 幅訓(xùn)練圖像。下面是一副展示了訓(xùn)練代價的變化情況的圖:

使用 $$\eta=0.025$$,代價函數(shù)平滑下降到最后的回合。使用 $$\eta=0.25$$,代價剛開始下降,在大約 $$20$$ 回合后接近飽和狀態(tài),后面就是微小的震蕩和隨機(jī)抖動。最終使用 $$\eta=2.5$$ 代價從始至終都震蕩得非常明顯。為了理解震蕩的原因,回想一下隨機(jī)梯度下降其實(shí)是期望我們能夠逐漸地抵達(dá)代價函數(shù)的谷底的,

然而,如果 $$\eta$$ 太大的話,步長也會變大可能會使得算法在接近最小值時候又越過了谷底。這在 $$\eta=2.5$$ 時非常可能發(fā)生。當(dāng)我們選擇 $$\eta=0.25$$ 時,初始幾步將我們帶到了谷底附近,但一旦到達(dá)了谷底,又很容易跨越過去。而在我們選擇 $$\eta=0.025$$ 時,在前 $$30$$ 回合的訓(xùn)練中不再受到這個情況的影響。當(dāng)然,選擇太小的學(xué)習(xí)率,也會帶來另一個問題——隨機(jī)梯度下降算法變慢了。一種更加好的策略其實(shí)是,在開始時使用 $$\eta=0.25$$,隨著越來越接近谷底,就換成 $$\eta=0.025$$。這種可變學(xué)習(xí)率的方法我們后面會介紹。現(xiàn)在,我們就聚焦在找出一個單獨(dú)的好的學(xué)習(xí)率的選擇,$$\eta$$。

所以,有了這樣的想法,我們可以如下設(shè)置 $$\eta$$。首先,我們選擇在訓(xùn)練數(shù)據(jù)上的代價立即開始下降而非震蕩或者增加時作為 $$\eta$$ 的閾值的估計。這個估計并不需要太過精確。你可以估計這個值的量級,比如說從 $$\eta=0.01$$ 開始。如果代價在訓(xùn)練的前面若干回合開始下降,你就可以逐步地嘗試 $$\eta=0.1, 1.0,...$$,直到你找到一個 $$\eta$$ 的值使得在開始若干回合代價就開始震蕩或者增加。相反,如果代價在 $$\eta=0.01$$ 時就開始震蕩或者增加,那就嘗試 $$\eta=0.001, 0.0001,...$$ 直到你找到代價在開始回合就下降的設(shè)定。按照這樣的方法,我們可以掌握學(xué)習(xí)率的閾值的量級的估計。你可以選擇性地優(yōu)化估計,選擇那些最大的 $$\eta$$,比方說 $$\eta=0.5$$ 或者 $$\eta=0.2$$(這里也不需要過于精確)。

顯然,$$\eta$$ 實(shí)際值不應(yīng)該比閾值大。實(shí)際上,如果 $$\eta$$ 的值重復(fù)使用很多回合的話,你更應(yīng)該使用稍微小一點(diǎn)的值,例如,閾值的一半這樣的選擇。這樣的選擇能夠允許你訓(xùn)練更多的回合,不會減慢學(xué)習(xí)的速度。

在 MNIST 數(shù)據(jù)中,使用這樣的策略會給出一個關(guān)于學(xué)習(xí)率 $$\eta$$ 的一個量級的估計,大概是 $$0.1$$。在一些改良后,我們得到了閾值 $$\eta=0.5$$。所以,我們按照剛剛的取一半的策略就確定了學(xué)習(xí)率為 $$\eta=0.25$$。實(shí)際上,我發(fā)現(xiàn)使用 $$\eta=0.5$$ 在 $$30$$ 回合內(nèi)表現(xiàn)是很好的,所以選擇更低的學(xué)習(xí)率,也沒有什么問題。

這看起來相當(dāng)直接。然而,使用訓(xùn)練代價函數(shù)來選擇 $$\eta$$ 看起來和我們之前提到的通過驗(yàn)證集來確定超參數(shù)的觀點(diǎn)有點(diǎn)矛盾。實(shí)際上,我們會使用驗(yàn)證準(zhǔn)確度來選擇規(guī)范化超參數(shù),minibatch 大小,和層數(shù)及隱藏元個數(shù)這些網(wǎng)絡(luò)參數(shù),等等。為何對學(xué)習(xí)率要用不同的方法呢?坦白地說,這些選擇其實(shí)是我個人美學(xué)偏好,個人習(xí)慣罷了。原因就是其他的超參數(shù)傾向于提升最終的測試集上的分類準(zhǔn)確度,所以將他們通過驗(yàn)證準(zhǔn)確度來選擇更合理一些。然而,學(xué)習(xí)率僅僅是偶然地影響最終的分類準(zhǔn)確度的。學(xué)習(xí)率主要的目的是控制梯度下降的步長,監(jiān)控訓(xùn)練代價是最好的檢測步長過大的方法。所以,這其實(shí)就是個人的偏好。在學(xué)習(xí)的前期,如果驗(yàn)證準(zhǔn)確度提升,訓(xùn)練代價通常都在下降。所以在實(shí)踐中使用那種衡量方式并不會對判斷的影響太大。

使用 Early stopping 來確定訓(xùn)練的回合數(shù):正如我們在本章前面討論的那樣,Early stopping 表示在每個回合的最后,我們都要計算驗(yàn)證集上的分類準(zhǔn)確度。當(dāng)準(zhǔn)確度不再提升,就終止它。這讓選擇回合數(shù)變得很簡單。特別地,也意味著我們不再需要擔(dān)心顯式地掌握回合數(shù)和其他超參數(shù)的關(guān)聯(lián)。而且,這個過程還是自動的。另外,Early stopping 也能夠幫助我們避免過匹配。盡管在實(shí)驗(yàn)前期不采用 Early stopping,這樣可以看到任何過匹配的信號,使用這些來選擇規(guī)范化方法,但 early stopping 仍然是一件很棒的事。

我們需要再明確一下什么叫做分類準(zhǔn)確度不再提升,這樣方可實(shí)現(xiàn) Early stopping。正如我們已經(jīng)看到的,分類準(zhǔn)確度在整體趨勢下降的時候仍舊會抖動或者震蕩。如果我們在準(zhǔn)確度剛開始下降的時候就停止,那么肯定會錯過更好的選擇。一種不錯的解決方案是如果分類準(zhǔn)確度在一段時間內(nèi)不再提升的時候終止。例如,我們要解決 MNIST 問題。如果分類準(zhǔn)確度在近 $$10$$ 個回合都沒有提升的時候,我們將其終止。這樣不僅可以確保我們不會終止得過快,也能夠使我們不要一直干等直到出現(xiàn)提升。

這種 $$10$$ 回合不提升就終止的規(guī)則很適合 MNIST 問題的一開始的探索。然而,網(wǎng)絡(luò)有時候會在很長時間內(nèi)于一個特定的分類準(zhǔn)確度附近形成平緩的局面,然后才會有提升。如果你嘗試獲得相當(dāng)好的性能,這個規(guī)則可能就會太過激進(jìn)了——停止得太草率。所以,我建議在你更加深入地理解網(wǎng)絡(luò)訓(xùn)練的方式時,僅僅在初始階段使用 $$10$$ 回合不提升規(guī)則,然后逐步地選擇?更久的回合,比如說:$$20$$ 回合不提升就終止,$$20$$ 回合不提升就終止,以此類推。當(dāng)然,這就引入了一種新的需要優(yōu)化的超參數(shù)!實(shí)踐中,其實(shí)比較容易設(shè)置這個超參數(shù)來獲得相當(dāng)好的結(jié)果。類似地,對不同于 MNIST 的問題,$$10$$ 回合不提升就終止的規(guī)則會太多激進(jìn)或者太多保守,這都取決于問題的本身特質(zhì)。然而,進(jìn)行一些小的實(shí)驗(yàn),發(fā)現(xiàn)好的提前終止的策略還是非常簡單的。

我們還沒有使用提前終止在我們的 MNIST 實(shí)驗(yàn)中。原因是我們已經(jīng)比較了不同的學(xué)習(xí)觀點(diǎn)。這樣的比較其實(shí)比較適合使用同樣的訓(xùn)練回合。但是,在 network2.py 中實(shí)現(xiàn)提前終止還是很有價值的:

問題

  • 修改 network2.py 來實(shí)現(xiàn)提前終止,并讓 $$n$$ 回合不提升終止策略中的 $$n$$ 稱為可以設(shè)置的參數(shù)。
  • 你能夠想出不同于 $$n$$ 回合不提升終止策略的其他提前終止策略么?理想中,規(guī)則應(yīng)該能夠獲得更高的驗(yàn)證準(zhǔn)確度而不需要訓(xùn)練太久。將你的想法實(shí)現(xiàn)在 network2.py 中,運(yùn)行這些實(shí)驗(yàn)和 $$10$$ 回合不提升終止策略比較對應(yīng)的驗(yàn)證準(zhǔn)確度和訓(xùn)練的回合數(shù)。

學(xué)習(xí)率調(diào)整:我們一直都將學(xué)習(xí)率設(shè)置為常量。但是,通常采用可變的學(xué)習(xí)率更加有效。在學(xué)習(xí)的前期,權(quán)重可能非常糟糕。所以最好是使用一個較大的學(xué)習(xí)率讓權(quán)重變化得更快。越往后,我們可以降低學(xué)習(xí)率,這樣可以作出更加精良的調(diào)整。

我們要如何設(shè)置學(xué)習(xí)率呢?其實(shí)有很多方法。一種自然的觀點(diǎn)是使用提前終止的想法。就是保持學(xué)習(xí)率為一個常量知道驗(yàn)證準(zhǔn)確度開始變差。然后按照某個量下降學(xué)習(xí)率,比如說按照 $$10$$ 或者 $$2$$。我們重復(fù)此過程若干次,知道學(xué)習(xí)率是初始值的 $$1/1024$$(或者$$1/1000$$)。那時就終止。

可變學(xué)習(xí)率可以提升性能,但是也會產(chǎn)生大量可能的選擇。這些選擇會讓人頭疼——你可能需要花費(fèi)很多精力才能優(yōu)化學(xué)習(xí)規(guī)則。對剛開始實(shí)驗(yàn),我建議使用單一的常量作為學(xué)習(xí)率的選擇。這會給你一個比較好的近似。后面,如果你想獲得更好的性能,值得按照某種規(guī)則進(jìn)行實(shí)驗(yàn),根據(jù)我已經(jīng)給出的資料。

A readable recent paper which demonstrates the benefits of variable learning rates in attacking MNIST is Deep, Big, Simple Neural Nets Excel on Handwritten Digit Recognition, by Dan Claudiu Cire?an, Ueli Meier, Luca Maria Gambardella, and Jürgen Schmidhuber (2010).

練習(xí)

  • 更改 network2.py 實(shí)現(xiàn)學(xué)習(xí)規(guī)則:每次驗(yàn)證準(zhǔn)確度滿足滿足$$10$$ 回合不提升終止策略時改變學(xué)習(xí)率;當(dāng)學(xué)習(xí)率降到初始值的 $$1/128$$ 時終止。

規(guī)范化參數(shù):我建議,開始時不包含規(guī)范化($$\lambdas=0.0$$),確定 $$\eta$$ 的值。使用確定出來的 $$\eta$$,我們可以使用驗(yàn)證數(shù)據(jù)來選擇好的 $$\lambda$$。從嘗試 $$\lambda=1.0$$ 開始,然后根據(jù)驗(yàn)證集上的性能按照因子 $$10$$增加或減少其值。一旦我已經(jīng)找到一個好的量級,你可以改進(jìn) $$\lambda$$ 的值。這里搞定后,你就可以返回再重新優(yōu)化 $$\eta$$。

練習(xí)

  • 使用梯度下降來嘗試學(xué)習(xí)好的超參數(shù)的值其實(shí)很受期待。你可以想像關(guān)于使用梯度下降來確定 $$\lambda$$ 的障礙么?你能夠想象關(guān)于使用梯度下降來確定 $$\eta$$ 的障礙么?

在本書前面,我是如何選擇超參數(shù)的:如果你使用本節(jié)給出的推薦策略,你會發(fā)現(xiàn)你自己找到的 $$\eta$$ 和 $$\lambda$$ 不總是和我給出的一致。原因自傲與,本書有一些限制,有時候會使得優(yōu)化超參數(shù)變得不現(xiàn)實(shí)。想想我們已經(jīng)做過的使用不同觀點(diǎn)學(xué)習(xí)的對比,比如說,比較二次代價函數(shù)和交叉熵代價函數(shù),比較權(quán)重初始化的新舊方法,使不使用規(guī)范化,等等。為了使這些比較有意義,我通常會將參數(shù)在這些方法上保持不變(或者進(jìn)行合適的尺度調(diào)整)。當(dāng)然,同樣超參數(shù)對不同的學(xué)習(xí)觀點(diǎn)都是最優(yōu)的也沒有理論保證,所以我用的那些超參數(shù)常常是折衷的選擇。

相較于這樣的折衷,其實(shí)我本可以嘗試優(yōu)化每個單一的觀點(diǎn)的超參數(shù)選擇。理論上,這可能是更好更公平的方式,因?yàn)槟菢拥脑捨覀兛梢钥吹矫總€觀點(diǎn)的最優(yōu)性能。但是,我們現(xiàn)在依照目前的規(guī)范進(jìn)行了眾多的比較,實(shí)踐上,我覺得要做到需要過多的計算資源了。這也是我使用折衷方式來采用盡可能好(卻不一定最優(yōu))的超參數(shù)選擇。

minibatch 大小:我們應(yīng)該如何設(shè)置 minibatch 的大小?為了回答這個問題,讓我們先假設(shè)正在進(jìn)行在線學(xué)習(xí),也就是說使用大小為 $$1$$ 的minibatch。

一個關(guān)于在線學(xué)習(xí)的擔(dān)憂是使用只有一個樣本的 minibatch 會帶來關(guān)于梯度的錯誤估計。實(shí)際上,誤差并不會真的產(chǎn)生這個問題。原因在于單一的梯度估計不需要絕對精確。我們需要的是確保代價函數(shù)保持下降的足夠精確的估計。就像你現(xiàn)在要去北極點(diǎn),但是只有一個不大精確的(差個 $$10-20$$ 度)指南針。如果你不再頻繁地檢查指南針,指南針會在平均狀況下給出正確的方向,所以最后你也能抵達(dá)北極點(diǎn)。

基于這個觀點(diǎn),這看起來好像我們需要使用在線學(xué)習(xí)。實(shí)際上,情況會變得更加復(fù)雜。在上一章的問題中 我指出我們可以使用矩陣技術(shù)來對所有在 minibatch 中的樣本同時計算梯度更新,而不是進(jìn)行循環(huán)。所以,取決于硬件和線性代數(shù)庫的實(shí)現(xiàn)細(xì)節(jié),這會比循環(huán)方式進(jìn)行梯度更新快好多。也許是 $$50$$ 和 $$100$$ 倍的差別。

現(xiàn)在,看起來這對我們幫助不大。我們使用 $$100$$ 的minibatch 的學(xué)習(xí)規(guī)則如下;

這里是對 minibatch 中所有訓(xùn)練樣本求和。而在線學(xué)習(xí)是

即使它僅僅是 $$50$$ 倍的時間,結(jié)果仍然比直接在線學(xué)習(xí)更好,因?yàn)槲覀冊诰€學(xué)習(xí)更新得太過頻繁了。假設(shè),在 minibatch 下,我們將學(xué)習(xí)率擴(kuò)大了 $$100$$ 倍,更新規(guī)則就是

這看起來項做了 $$100$$ 次獨(dú)立的在線學(xué)習(xí)。但是僅僅比在線學(xué)習(xí)花費(fèi)了 $$50$$ 倍的時間。當(dāng)然,其實(shí)不是同樣的 100 次在線學(xué)習(xí),因?yàn)?minibatch 中 $$\nabla C_x$$ 是都對同樣的權(quán)重進(jìn)行衡量的,而在線學(xué)習(xí)中是累加的學(xué)習(xí)。使用更大的 minibatch 看起來還是顯著地能夠進(jìn)行訓(xùn)練加速的。

所以,選擇最好的 minibatch 大小也是一種折衷。太小了,你不會用上很好的矩陣庫的快速計算。太大,你是不能夠足夠頻繁地更新權(quán)重的。你所需要的是選擇一個折衷的值,可以最大化學(xué)習(xí)的速度。幸運(yùn)的是,minibatch 大小的選擇其實(shí)是相對獨(dú)立的一個超參數(shù)(網(wǎng)絡(luò)整體架構(gòu)外的參數(shù)),所以你不需要優(yōu)化那些參數(shù)來尋找好的 minibatch 大小。因此,可以選擇的方式就是使用某些可以接受的值(不需要是最優(yōu)的)作為其他參數(shù)的選擇,然后進(jìn)行不同 minibatch 大小的嘗試,像上面那樣調(diào)整 $$\eta$$。畫出驗(yàn)證準(zhǔn)確度的值隨時間(非回合)變化的圖,選擇哪個得到最快性能的提升的 minibatch 大小。得到了 minibatch 大小,也就可以對其他的超參數(shù)進(jìn)行優(yōu)化了。

當(dāng)然,你也發(fā)現(xiàn)了,我這里并沒有做到這么多。實(shí)際上,我們的實(shí)現(xiàn)并沒有使用到 minibatch 更新快速方法。就是簡單使用了 minibatch 大小為 $$10$$。所以,我們其實(shí)可以通過降低 minibatch 大小來進(jìn)行提速。我也沒有這樣做,因?yàn)槲蚁M故?minibatch 大于 $$1$$ 的使用,也因?yàn)槲覍?shí)踐經(jīng)驗(yàn)表示提升效果其實(shí)不明顯。在實(shí)踐中,我們大多數(shù)情況肯定是要實(shí)現(xiàn)更快的 minibatch 更新策略,然后花費(fèi)時間精力來優(yōu)化 minibatch 大小,來達(dá)到總體的速度提升。

自動技術(shù):我已經(jīng)給出很多在手動進(jìn)行超參數(shù)優(yōu)化時的啟發(fā)式規(guī)則。手動選擇當(dāng)然是種理解網(wǎng)絡(luò)行為的方法。不過,現(xiàn)實(shí)是,很多工作已經(jīng)使用自動化過程進(jìn)行。通常的技術(shù)就是網(wǎng)格搜索(grid search),可以系統(tǒng)化地對超參數(shù)的參數(shù)空間的網(wǎng)格進(jìn)行搜索。網(wǎng)格搜索的成就和限制(易于實(shí)現(xiàn)的變體)在 James Bergstra 和 Yoshua Bengio $$2012$$ 年的論文中已經(jīng)給出了綜述。很多更加精細(xì)的方法也被大家提出來了。我這里不會給出介紹,但是想指出 2012 年使用貝葉斯觀點(diǎn)自動優(yōu)化超參數(shù)的論文。代碼可以獲得,也已經(jīng)被其他的研究人員使用了。

總結(jié):跟隨上面的經(jīng)驗(yàn)并不能幫助你的網(wǎng)絡(luò)給出絕對最優(yōu)的結(jié)果。但是很可能給你一個好的開始和一個改進(jìn)的基礎(chǔ)。特別地,我已經(jīng)非常獨(dú)立地討論了超參數(shù)的選擇。實(shí)踐中,超參數(shù)之間存在著很多關(guān)系。你可能使用 $$\eta$$ 進(jìn)行試驗(yàn),發(fā)現(xiàn)效果不錯,然后去優(yōu)化 $$\lambda$$,發(fā)現(xiàn)這里又對 $$\eta$$ 混在一起了。在實(shí)踐中,一般是來回往復(fù)進(jìn)行的,最終逐步地選擇到好的值。總之,啟發(fā)式規(guī)則其實(shí)都是經(jīng)驗(yàn),不是金規(guī)玉律。你應(yīng)該注意那些沒有效果的嘗試的信號,然后樂于嘗試更多試驗(yàn)。特別地,這意味著需要更加細(xì)致地監(jiān)控神經(jīng)網(wǎng)絡(luò)行為,特別是驗(yàn)證集上的準(zhǔn)確度。

選擇超參數(shù)的難度由于如何選擇超參數(shù)的方法太繁多(分布在太多的研究論文,軟件程序和僅僅在一些研究人員的大腦中)變得更加困難。很多很多的論文給出了(有時候矛盾的)建議。然而,還有一些特別有用的論文對這些繁雜的技術(shù)進(jìn)行了梳理和總結(jié)。Yoshua Bengio 在 $$2012$$ 年的論文中給出了一些實(shí)踐上關(guān)于訓(xùn)練神經(jīng)網(wǎng)絡(luò)用到的反向傳播和梯度下降的技術(shù)的推薦策略。Bengio 對很多問題的討論比我這里更加細(xì)致,其中還包含如何進(jìn)行系統(tǒng)化的超參數(shù)搜索。另一篇文章是 $$1998$$ 年的 Yann LeCun、Léon Bottou、Genevieve Orr 和 Klaus-Robert Müller 的。這些論文搜集在 2012年的一本書中,這本書介紹了很多訓(xùn)練神經(jīng)網(wǎng)絡(luò)的常用技巧。這本書挺貴的,但很多的內(nèi)容其實(shí)已經(jīng)被作者共享在網(wǎng)絡(luò)上了,也許在搜搜引擎上能夠找到一些。

在你讀這些文章時,特別是進(jìn)行試驗(yàn)時,會更加清楚的是超參數(shù)優(yōu)化就不是一個已經(jīng)被完全解決的問題。總有一些技巧能夠嘗試著來提升性能。有句關(guān)于作家的諺語是:“書從來不會完結(jié),只會被丟棄。”這點(diǎn)在神經(jīng)網(wǎng)絡(luò)優(yōu)化上也是一樣的:超參數(shù)的空間太大了,所以人們無法真的完成優(yōu)化,只能將問題丟給后人。所以你的目標(biāo)應(yīng)是發(fā)展出一個工作流來確保自己快速地進(jìn)行參數(shù)優(yōu)化,這樣可以留有足夠的靈活性空間來嘗試對重要的參數(shù)進(jìn)行更加細(xì)節(jié)的優(yōu)化。

設(shè)定超參數(shù)的挑戰(zhàn)讓一些人抱怨神經(jīng)網(wǎng)絡(luò)相比較其他的機(jī)器學(xué)習(xí)算法需要大量的工作進(jìn)行參數(shù)選擇。我也聽到很多不同的版本:“的確,參數(shù)完美的神經(jīng)網(wǎng)絡(luò)可能會在這問題上獲得最優(yōu)的性能。但是,我可以嘗試一下隨機(jī)森林(或者 SVM 或者……這里腦補(bǔ)自己偏愛的技術(shù))也能夠工作的。我沒有時間搞清楚那個最好的神經(jīng)網(wǎng)絡(luò)。” 當(dāng)然,從一個實(shí)踐者角度,肯定是應(yīng)用更加容易的技術(shù)。這在你剛開始處理某個問題時尤其如此,因?yàn)槟菚r候,你都不確定一個機(jī)器學(xué)習(xí)算法能夠解決那個問題。但是,如果獲得最優(yōu)的性能是最重要的目標(biāo)的話,你就可能需要嘗試更加復(fù)雜精妙的知識的方法了。如果機(jī)器學(xué)習(xí)總是簡單的話那是太好不過了,但也沒有一個應(yīng)當(dāng)?shù)睦碛烧f機(jī)器學(xué)習(xí)非得這么簡單。

其他技術(shù)


本章中講述的每個技術(shù)都是很值得學(xué)習(xí)的,但是不僅僅是由于那些我提到的愿意。更重要的其實(shí)是讓你自己熟悉在神經(jīng)網(wǎng)絡(luò)中出現(xiàn)的問題以及解決這些問題所進(jìn)行分析的方式。所以,我們現(xiàn)在已經(jīng)學(xué)習(xí)了如何思考神經(jīng)網(wǎng)絡(luò)。本章后面部分,我會簡要地介紹一系列其他技術(shù)。這些介紹相比之前會更加粗淺,不過也會傳達(dá)出關(guān)于神經(jīng)網(wǎng)絡(luò)中多樣化的技術(shù)的精神。

隨機(jī)梯度下降的變種

通過反向傳播進(jìn)行的隨機(jī)梯度下降已經(jīng)在 MNIST 數(shù)字分類問題上有了很好的表現(xiàn)。然而,還有很多其他的觀點(diǎn)來優(yōu)化代價函數(shù),有時候,這些方法能夠帶來比 minibatch 隨機(jī)梯度下降更好的效果。本節(jié),我會介紹兩種觀點(diǎn),Hessian 和 momentum 技術(shù)。

Hessian 技術(shù):為了更好地討論這個技術(shù),我們先把神經(jīng)網(wǎng)絡(luò)放在一邊。相反,我直接思考最小化代價函數(shù) $$C$$ 的抽象問題,其中 $$C$$ 是多個參數(shù)的函數(shù),$$w=w_1,w_2,...$$,所以 $$C=C(w)$$。借助于泰勒展開式,代價函數(shù)可以在點(diǎn) $$w$$ 處被近似為:

我們可以將其壓縮為:

其中 $$\nabla C$$ 是通常的梯度向量,$$H$$ 就是矩陣形式的 Hessian 矩陣,其中 $$jk$$-th 項就是 $$\partial^2 C/\partial w_j\partial w_k$$。假設(shè)我們通過丟棄更高階的項來近似 $$C$$,

使用微積分,我們可證明右式表達(dá)式可以進(jìn)行最小化,選擇:

Paste_Image.png

根據(jù)(105)是代價函數(shù)的比較好的近似表達(dá)式,我們期望從點(diǎn) $$w$$ 移動到 $$w+\Delta w = w - H^{-1}\nabla C$$ 可以顯著地降低代價函數(shù)的值。這就給出了一種優(yōu)化代價函數(shù)的可能的算法:

  • 選擇開始點(diǎn),$$w$$
  • 更新 $$w$$ 到新點(diǎn) $$w' = w - H_{-1}\nabla C$$,其中 Hessian $$H$$ 和 $$\nabla C$$ 在 $$w$$ 處計算出來的
  • 更新 $$w'$$ 到新點(diǎn) $$w'' = w' - H'^{-1}\nabla' C$$,其中 Hessian $$H'$$ 和 $$\nabla' C$$ 在 $$w'$$ 處計算出來的
  • ...

實(shí)際應(yīng)用中,(105)是唯一的近似,并且選擇更小的 step 會更好。我們通過重復(fù)地使用改變量 $$\Delta w = -\etaH^{-1} \nabla C$$ 來 改變 $$w$$,其中 $$\eta$$ 就是學(xué)習(xí)率。

這個最小化代價函數(shù)的方法常常被稱為 Hessian 技術(shù) 或者 Hessian 優(yōu)化。在理論上和實(shí)踐中的結(jié)果都表明 Hessian 方法比標(biāo)準(zhǔn)的梯度下降方法收斂速度更快。特別地,通過引入代價函數(shù)的二階變化信息,可以讓 Hessian 方法避免在梯度下降中常碰到的多路徑(pathologies)問題。而且,反向傳播算法的有些版本也可以用于計算 Hessian。

如果 Hessian 優(yōu)化這么厲害,為何我們這里不使用它呢?不幸的是,盡管 Hessian 優(yōu)化有很多可取的特性,它其實(shí)還有一個不好的地方:在實(shí)踐中很難應(yīng)用。這個問題的部分原因在于 Hessian 矩陣的太大了。假設(shè)你有一個 $$10^7$$ 個權(quán)重和偏差的網(wǎng)絡(luò)。那么對應(yīng)的 Hessian 矩陣會有 $$10^7 \times 107=1014$$ 個元素。這真的是太大了!所以在實(shí)踐中,計算 $$H^{-1}\nabla C$$ 就極其困難。不過,這并不表示學(xué)習(xí)理解它沒有用了。實(shí)際上,有很多受到 Hessian 優(yōu)化啟發(fā)的梯度下降的變種,能避免產(chǎn)生太大矩陣的問題。讓我們看看其中一個稱為基于 momentum 梯度下降的方法。

基于 momentum 的梯度下降:直覺上看,Hessian 優(yōu)化的優(yōu)點(diǎn)是它不僅僅考慮了梯度,而且還包含梯度如何變化的信息。基于 momentum 的梯度下降就基于這個直覺,但是避免了二階導(dǎo)數(shù)的矩陣的出現(xiàn)。為了理解 momentum 技術(shù),想想我們關(guān)于梯度下降的原始圖片,其中我們研究了一個球滾向山谷的場景。那時候,我們發(fā)現(xiàn)梯度下降,除了這個名字外,就類似于球滾向山谷的底部。momentum 技術(shù)修改了梯度下降的兩處使之類似于這個物理場景。首先,為我們想要優(yōu)化的參數(shù)引入了一個稱為速度(velocity)的概念。梯度的作用就是改變速度,而不是直接的改變位置,就如同物理學(xué)中的力改變速度,只會間接地影響位置。第二,momentum 方法引入了一種?摩擦力的項,用來逐步地減少速度。

讓我們給出更加準(zhǔn)確的數(shù)學(xué)描述。我們引入對每個權(quán)重 $$w_j$$ 設(shè)置相應(yīng)的速度變量 $$v=v_1,v_2,...$$。注意,這里的權(quán)重也可以籠統(tǒng)地包含偏差。然后我們將梯度下降更新規(guī)則 $$w\rightarrow w'=w-\eta\nabla C$$ 改成

在這些方程中,$$\mu$$ 是用來控制阻礙或者摩擦力的量的超參數(shù)。為了理解這個公式,可以考慮一下當(dāng) $$\mu=1$$ 的時候,對應(yīng)于沒有任何摩擦力。所以,此時你可以看到力 $$\nabla C$$ 改變了速度,$$v$$,速度隨后再控制 $$w$$ 變化率。直覺上看,我們通過重復(fù)地增加梯度項來構(gòu)造速度。這表示,如果梯度在某些學(xué)習(xí)的過程中幾乎在同樣的方向,我們可以得到在那個方向上比較大的移動量。想想看,如果我們直接按坡度下降,會發(fā)生什么:

每一步速度都不斷增大,所以我們會越來越快地達(dá)到谷底。這樣就能夠確保 momentum 技術(shù)比標(biāo)準(zhǔn)的梯度下降運(yùn)行得更快。當(dāng)然,這里也會有問題,一旦達(dá)到谷底,我們就會跨越過去。或者,如果梯度本該快速改變而沒有改變,那么我們會發(fā)現(xiàn)自己在錯誤的方向上移動太多了。這就是在(107)式中使用 $$\mu$$ 這個超參數(shù)的原因了。前面提到,$$\mu$$ 可以控制系統(tǒng)中的摩擦力大小;更加準(zhǔn)確地說,你應(yīng)該將 $$1-\mu$$ 看成是摩擦力的量。當(dāng) $$\mu=1$$ 時,沒有摩擦,速度完全由梯度 $$\nabla C$$ 決定。相反,若是 $$\mu=0$$,就存在很大的摩擦,速度無法疊加,公式(107)(108)就變成了通常的梯度下降,$$w\righarrow w'=w-\eta \nabla C$$。在實(shí)踐中,使用 $$0$$ 和 $$1$$ 之間的 $$\mu$$ 值可以給我們避免過量而又能夠疊加速度的好處。我們可以使用 hold out 驗(yàn)證數(shù)據(jù)集來選擇合適的 $$\mu$$ 值,就像我們之前選擇 $$\eta$$ 和 $$\lambda$$ 那樣。

我到現(xiàn)在也沒有把 $$\mu$$ 看成是超參數(shù)。原因在于 $$\mu$$ 的標(biāo)準(zhǔn)命名不大好:它叫做 moment co-efficient。這其實(shí)很讓人困惑,因?yàn)?$$\mu$$ 并不是物理學(xué)那個叫做動量(momentum)的東西。并且,它更像摩擦力的概念。然而,現(xiàn)在這個術(shù)語已經(jīng)被大家廣泛使用了,所以我們繼續(xù)使用它。

關(guān)于 momentum 技術(shù)的一個很好的特點(diǎn)是它基本上不需要改變太多梯度下降的代碼就可以實(shí)現(xiàn)。我們可以繼續(xù)使用反向傳播來計算梯度,就和前面那樣,使用隨機(jī)選擇的 minibatch 的方法。這樣的話,我們還是能夠從 Hessian 技術(shù)中學(xué)到的優(yōu)點(diǎn)的——使用梯度如何改變的信息。也僅僅需要進(jìn)行微小的調(diào)整。實(shí)踐中,momentum 技術(shù)很常見,也能夠帶來學(xué)習(xí)速度的提升。

練習(xí)

  • 如果我們使用 $$\mu>1$$ 會有什么問題?
  • 如果我們使用 $$\mu<0$$ 會有什么問題?

問題

  • 增加基于 momentum 的隨機(jī)梯度下降到 network2.py 中。

其他優(yōu)化代價函數(shù)的方法:很多其他的優(yōu)化代價函數(shù)的方法也被提出來了,并沒有關(guān)于哪種最好的統(tǒng)一意見。當(dāng)你越來越深入了解神經(jīng)網(wǎng)絡(luò)時,值得去嘗試其他的優(yōu)化技術(shù),理解他們工作的原理,優(yōu)勢劣勢,以及在實(shí)踐中如何應(yīng)用。前面我提到的一篇論文,介紹并對比了這些技術(shù),包含共軛梯度下降和 BFGS 方法(也可以看看 limited memory BFGS,L-BFGS)。另一種近期效果很不錯技術(shù)是 Nesterov 的加速梯度技術(shù),這個技術(shù)對 momentum 技術(shù)進(jìn)行了改進(jìn)。然而,對很多問題,標(biāo)準(zhǔn)的隨機(jī)梯度下降算法,特別當(dāng) momentum 用起來后就可以工作得很好了,所以我們會繼續(xù)在本書后面使用隨機(jī)梯度下算法。

人工神經(jīng)元的其他模型

到現(xiàn)在,我們使用的神經(jīng)元都是 sigmoid 神經(jīng)元。理論上講,從這樣類型的神經(jīng)元構(gòu)建起來的神經(jīng)網(wǎng)絡(luò)可以計算任何函數(shù)。實(shí)踐中,使用其他模型的神經(jīng)元有時候會超過 sigmoid 網(wǎng)絡(luò)。取決于不同的應(yīng)用,基于其他類型的神經(jīng)元的網(wǎng)絡(luò)可能會學(xué)習(xí)得更快,更好地泛化到測試集上,或者可能兩者都有。讓我們給出一些其他的模型選擇,便于了解常用的模型上的變化。

可能最簡單的變種就是 $$\tanh$$(發(fā)音為 tanch)神經(jīng)元,使用雙曲正切(hyperbolic tangent)函數(shù)替換了 sigmoid 函數(shù)。輸入為 $$x$$,權(quán)重向量為 $$w$$,偏差為 $$b$$ 的 $$\tanh$$ 神經(jīng)元的輸出是

這其實(shí)和 sigmoid 神經(jīng)元關(guān)系相當(dāng)密切。回想一下 $$\tanh$$ 函數(shù)的定義:

進(jìn)行簡單的代數(shù)運(yùn)算,我們可以得到

也就是說,$$\tanh$$ 僅僅是 sigmoid 函數(shù)的按比例變化版本。我們同樣也能用圖像看看 $$\tanh$$ 的形狀:

這兩個函數(shù)之間的一個差異就是 $$\tanh$$ 神經(jīng)元的輸出的值域是 $$(-1, 1)$$ 而非 $$(0, 1)$$。這意味著如果你構(gòu)建基于 $$\tanh$$ 神經(jīng)元,你可能需要正規(guī)化最終的輸出(取決于應(yīng)用的細(xì)節(jié),還有你的輸入),跟 sigmoid 網(wǎng)絡(luò)略微不同。

類似于 sigmoid 神經(jīng)元,基于 $$\tanh$$ 的網(wǎng)絡(luò)可以在理論上,計算任何將輸入映射到 $$(-1, 1)$$ 的函數(shù)。而且,諸如反向傳播和隨機(jī)梯度下降這樣的想法也能夠輕松地用在 $$\tanh$$ 神經(jīng)元構(gòu)成的網(wǎng)絡(luò)上的。

練習(xí)

  • 證明公式(111)

那么你應(yīng)該在網(wǎng)絡(luò)中使用什么類型的神經(jīng)元呢,$$\tanh$$ 還是 sigmoid?實(shí)話講,確實(shí)并沒有先驗(yàn)的答案!然而,存在一些理論論點(diǎn)和實(shí)踐證據(jù)表明 $$\tanh$$ 有時候表現(xiàn)更好。

例如 Efficient BackProp, by Yann LeCun, Léon Bottou, Genevieve Orr and Klaus-Robert Müller (1998), and Understanding the difficulty of training deep feedforward networks, by Xavier Glorot and Yoshua Bengio (2010).

讓我簡要介紹一下其中關(guān)于 $$\tanh$$ 的一個理論觀點(diǎn)。假設(shè)我們使用 sigmoid 神經(jīng)元,所有激活值都是正數(shù)。讓我們考慮一下權(quán)重 $$w_{jk}^{l+1}$$ 輸入到第 $$l+1$$ 層的第 $$j$$ 個神經(jīng)元上。反向傳播的規(guī)則告訴我們相關(guān)的梯度是 $$a_kl\delta_j{l+1}$$。因?yàn)樗械募せ钪刀际钦龜?shù),所以梯度的符號就和 $$\delta_j^{l+1}$$ 一致。這意味著如果 $$\delta_j^{l+1}$$ 為正,那么所有的權(quán)重 $$w_{jk}^{l+1}$$ 都會在梯度下降時減少,而如果 $$\delta_j^{l+1}$$ 為?負(fù),那么所有的權(quán)重 $$w_{jk}^{l+1}$$ 都會在梯度下降時增加。換言之,針對同一的神經(jīng)元的所有權(quán)重都會或者一起增加或者一起減少。這就有問題了,因?yàn)槟承?quán)重可能需要有相反的變化。這樣的話,只能是某些輸入激活值有相反的符號才可能出現(xiàn)。所以,我們用 $$\tanh$$ 替換就能夠達(dá)到這個目的。因此,因?yàn)?$$\tanh$$ 是關(guān)于 $$0$$ 對稱的,$$tanh(-z)=-tanh(z)$$,我們甚至期望,大概地,隱藏層的激活值能夠在正負(fù)間保持平衡。這樣其實(shí)可以保證對權(quán)重更新沒有系統(tǒng)化的單方面的偏差。

我們應(yīng)當(dāng)如何看待這個論點(diǎn)?盡管論點(diǎn)是建設(shè)性的,但它還只是一個啟發(fā)式的規(guī)則,而非嚴(yán)格證明說 $$\tanh$$ 就一定超過 sigmoid 函數(shù)。可能 sigmoid 神經(jīng)元還有其他的特性能夠補(bǔ)償這個問題?實(shí)際上,對很多任務(wù),$$\tanh$$ 在實(shí)踐中給出了微小的甚至沒有性能提升。不幸的是,我們還沒有快速準(zhǔn)確的規(guī)則說哪種類型的神經(jīng)元對某種特定的應(yīng)用學(xué)習(xí)得更快,或者泛化能力最強(qiáng)。

另一個變體就是 Rectified Linear 神經(jīng)元或者 Rectified Linear Unit,簡記為 RLU。輸入為 $$x$$,權(quán)重向量為 $$w$$,偏差為 $$b$$ 的 RLU 神經(jīng)元的輸出是:

圖像上看,函數(shù) $$\max(0,z)$$ 是這樣的:

顯然,這樣的神經(jīng)元和 sigmoid 和 $$\tanh$$ 都不一樣。然而,RLU 也是能夠用來計算任何函數(shù)的,也可以使用反向傳播算法和隨機(jī)梯度下降進(jìn)行訓(xùn)練。

什么時候應(yīng)該使用 RLU 而非其他神經(jīng)元呢?一些近期的圖像識別上的研究工作找到了使用 RLU 所帶來的好處。然而,就像 $$\tanh$$ 神經(jīng)元那樣,我們還沒有一個關(guān)于什么時候 什么原因 RLU 表現(xiàn)更好的深度的理解。為了讓你感受一下這個問題,回想起 sigmoid 神經(jīng)元在飽和時停止學(xué)習(xí)的問題,也就是輸出接近 $$0$$ 或者 $$1$$ 的時候。在這章我們也反復(fù)看到了問題就是 $$\sigma'$$ 降低了梯度,減緩了學(xué)習(xí)。$$\tanh$$ 神經(jīng)元也有類似的問題。對比一下,提高 RLU 的帶權(quán)輸入并不會導(dǎo)致其飽和,所以就不存在前面那樣的學(xué)習(xí)速度下降。另外,當(dāng)帶權(quán)輸入是負(fù)數(shù)的時候,梯度就消失了,所以神經(jīng)元就完全停止了學(xué)習(xí)。這就是很多有關(guān)理解 RLU 何時何故更優(yōu)的問題中的兩個。

我已經(jīng)給出了一些不確定性的描述,指出我們現(xiàn)在還沒有一個堅實(shí)的理論來解釋如何選擇激活函數(shù)。實(shí)際上,這個問題比我已經(jīng)講過的還要困難,因?yàn)槠鋵?shí)是有無窮多的可能的激活函數(shù)。所以對給定問題,什么激活函數(shù)最好?什么激活函數(shù)會導(dǎo)致學(xué)習(xí)最快?哪個能夠給出最高的測試準(zhǔn)確度?其實(shí)現(xiàn)在并沒有太多真正深刻而系統(tǒng)的研究工作。理想中,我們會有一個理論告訴人們,準(zhǔn)確細(xì)致地,如何選擇我們的激活函數(shù)。另外,我們不應(yīng)該讓這種缺失阻礙我們學(xué)習(xí)和應(yīng)用神經(jīng)網(wǎng)絡(luò)!我們已經(jīng)有了一些強(qiáng)大的工作,可以使用它們完成很多的研究工作。本書剩下的部分中,我會繼續(xù)使用 sigmoid 神經(jīng)元作為首選,因?yàn)樗麄兤鋵?shí)是強(qiáng)大的也給出了具體關(guān)于神經(jīng)網(wǎng)絡(luò)核心思想的示例。但是你需要記住的是,這些同樣的想法也都可以用在其他類型的神經(jīng)元上,有時候的確會有一些性能的提升。

有關(guān)神經(jīng)網(wǎng)絡(luò)的故事

問題:你怎么看那些全部由實(shí)驗(yàn)效果支撐(而非數(shù)學(xué)保證)的使用和研究機(jī)器學(xué)習(xí)技術(shù)呢?同樣,在哪些場景中,你已經(jīng)注意到這些技術(shù)失效了?

答案:你需要認(rèn)識到,我們的理論工具的缺乏。有時候,我們有很好的關(guān)于某些特定的技術(shù)應(yīng)該可行的數(shù)學(xué)直覺。有時候我們的直覺最終發(fā)現(xiàn)是錯誤的。…… 這個問題其實(shí)是:我的方法在這個特定的問題的工作得多好,還有方法表現(xiàn)好的那些問題的范圍有多大。

曾經(jīng)我參加量子力學(xué)基礎(chǔ)的會議時,我注意到讓我最好奇的口頭表達(dá):在報告結(jié)束時,聽眾的問題通常是以“我對你的觀點(diǎn)很贊同,但是...”開始。量子力學(xué)基礎(chǔ)不是我的擅長領(lǐng)域,我注意到這種類型的質(zhì)疑,因?yàn)樵谄渌目茖W(xué)會議上,我很少(或者說,從未)聽到這種同情。那時候,我思考了這類問題存在的原因,實(shí)際上是因?yàn)檫@個領(lǐng)域中很少有重大的進(jìn)展,人們都是停在原地。后來,我意識到,這個觀念相當(dāng)?shù)募饪獭0l(fā)言人正在嘗試解決一些人們所遇到的一些最難的問題。進(jìn)展當(dāng)然會非常緩慢!但是,聽聽人們目前正在思考的方式也是非常有價值的,即使這些嘗試不一定會有無可置疑的新進(jìn)展。

你可能會注意到類似于“我對你的觀點(diǎn)很贊同,但是...”的話語。為了解釋我們已經(jīng)看到的情況,我通常會使用“啟發(fā)式地,...”或者“粗略地講,...”,然后接上解釋某個現(xiàn)象或者其他問題的故事。這些故事是可信的,但是實(shí)驗(yàn)性的證據(jù)常常是不夠充分的。如果你通讀研究文獻(xiàn),你會發(fā)現(xiàn)在神經(jīng)網(wǎng)絡(luò)研究中很多類似的表達(dá),基本上都是沒有太過充分的支撐證據(jù)的。所以我們應(yīng)該怎樣看待這樣的故事呢?

在科學(xué)的很多分支——尤其是那些解決相當(dāng)簡單現(xiàn)象的領(lǐng)域——很容易會得到一些關(guān)于很一般的假說的非常扎實(shí)非常可靠的證據(jù)。但是在神經(jīng)網(wǎng)絡(luò)中,存在大量的參數(shù)和超參數(shù)及其間極其復(fù)雜的交互。在這樣復(fù)雜系統(tǒng)中,構(gòu)建出可靠的一般的論斷就尤其困難。在完全一般性上理解神經(jīng)網(wǎng)絡(luò)實(shí)際上,和量子力學(xué)基礎(chǔ)一樣,都是對人類思維極限的挑戰(zhàn)。實(shí)際上,我們通常是和一些一般的理論的具體的實(shí)例在打交道——找到正面或者反面的證據(jù)。所以,這些理論在有新的證據(jù)出現(xiàn)時,也需要進(jìn)行調(diào)整甚至丟棄。

對這種情況的一種觀點(diǎn)是——任何啟發(fā)式的關(guān)于神經(jīng)網(wǎng)絡(luò)的論點(diǎn)會帶來一個挑戰(zhàn)。例如,考慮之前我引用的語句 ,解釋 dropout 工作的原因:“這個技術(shù)減少了復(fù)雜的神經(jīng)元之間的互適應(yīng),因?yàn)橐粋€神經(jīng)元不能夠依賴于特定其他神經(jīng)元的存在。因此,這個就強(qiáng)制性地讓我們學(xué)習(xí)更加健壯的在很多不同的神經(jīng)元的隨機(jī)子集的交集中起到作用的那些特征。”這是一個豐富而又爭議的假說,我們可以根據(jù)這個觀點(diǎn)發(fā)展出一系列的研究項目,搞清楚哪些部分真的,哪些是假的,那個需要變化和改良。實(shí)際上,有一小部分研究人員正在調(diào)查 dropout(和其他變體)試著理解其工作的機(jī)制,還有 dropout 的極限所在。所以,這些研究也跟隨著那些我們已經(jīng)討論過的啟發(fā)式想法。每個啟發(fā)式想法不僅僅是一個(潛在的)解釋,同樣也是一種更加細(xì)化地調(diào)查和理解的挑戰(zhàn)。

當(dāng)然,對某個單獨(dú)的人去研究所有這些啟發(fā)式想法其實(shí)在時間上是不允許的。需要神經(jīng)網(wǎng)絡(luò)的研究群體花費(fèi)數(shù)十年(或者更多)來發(fā)展出一個相當(dāng)強(qiáng)大,基于證據(jù)的關(guān)于神經(jīng)網(wǎng)絡(luò)工作的原理的理論。那么這是不是就意味著我們應(yīng)當(dāng)因?yàn)樗牟粐?yán)格和無法充分地證明而放棄啟發(fā)式規(guī)則么?不!實(shí)際上,我們需要這樣的啟發(fā)式想法來啟迪和指導(dǎo)我們的思考。這有點(diǎn)像大航海時代:早期的探險家在一種重要的指導(dǎo)方式都有錯誤的前提下有時候都進(jìn)行了探索(并作出了新的發(fā)現(xiàn))。后來,這些錯誤在我們對地理知識的清晰后而被糾正過來。當(dāng)你對某件事理解不深時——就像探險家對地理的理解和我們現(xiàn)在對神經(jīng)網(wǎng)絡(luò)的理解——忽略一些相對嚴(yán)格的糾正每一步思考而膽大地探索若干問題顯得更加重要。所以你應(yīng)該將這些故事看成是一種關(guān)于我們?nèi)绾嗡伎忌窠?jīng)網(wǎng)絡(luò)的有用的指導(dǎo),同時保留關(guān)于這些想法的能力極限的合理的關(guān)注,并細(xì)致地跟蹤對任何一個推理的證據(jù)的強(qiáng)弱。換言之,我們需要很好的故事來不斷地激勵和啟發(fā)自己去勇敢地探索,同時使用嚴(yán)格的深刻的調(diào)查來發(fā)現(xiàn)真理。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,565評論 6 539
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,115評論 3 423
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,577評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,514評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,234評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,621評論 1 326
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,641評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,822評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,380評論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,128評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,319評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,879評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,548評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,970評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,229評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,048評論 3 397
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,285評論 2 376

推薦閱讀更多精彩內(nèi)容