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

Neil Zhu驻右,簡書ID Not_GOD外盯,University AI 創(chuàng)始人 & Chief Scientist遭笋,致力于推進(jìn)世界人工智能化進(jìn)程咬腕。制定并實施 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ù)選擇的方法便斥。我只是給出那些效果很好的值而已。實踐中威始,當(dāng)你使用神經(jīng)網(wǎng)絡(luò)解決問題時枢纠,尋找好的超參數(shù)其實是很困難的一件事。例如黎棠,我們要解決 MNIST 問題晋渺,開始時對于選擇什么樣的超參數(shù)一無所知镰绎。假設(shè),剛開始的實驗中選擇前面章節(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ù)就好了叼丑」佤幔”不幸的是,你并不先驗地知道這些就是需要調(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ù),這種情況就很令人失望了念恍,因為一次訓(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è),我們第一次遇到 MNIST 分類問題双仍。剛開始枢希,你很有激情,但是當(dāng)?shù)谝粋€神經(jīng)網(wǎng)絡(luò)完全失效時殊校,你會就得有些沮喪晴玖。此時就可以將問題簡化。丟開訓(xùn)練和驗證集合中的那些除了 $$0$$ 和 $$1$$ 的那些圖像为流。然后試著訓(xùn)練一個網(wǎng)絡(luò)來區(qū)分 $$0$$ 和 $$1$$呕屎。不僅僅問題比 $$10$$ 個分類的情況簡化了,同樣也會減少 80% 的訓(xùn)練數(shù)據(jù)敬察,這樣就給出了 $$5$$ 倍的加速秀睛。這樣可以保證更快的實驗,也能給予你關(guān)于如何構(gòu)建好的網(wǎng)絡(luò)更快的洞察莲祸。

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

你可以通過提高監(jiā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)控驗證準(zhǔn)確度來獲得反饋艺配,比如說在每 $$1,000$$ 次訓(xùn)練圖像后察郁。而且,與其使用整個 $$10,000$$ 幅圖像的驗證集來監(jiān)控性能妒挎,我們可以使用 $$100$$ 幅圖像來進(jì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)然茂蚓,那樣也是很容易就可以實現(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ù),或者甚至近同步地進(jìn)行不同參數(shù)的組合的評比牍白。

在上面的例子中脊凰,我設(shè)置 $$\lambda=1000.0$$,跟我們之前一樣茂腥。但是因為這里改變了訓(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è)是一個有 $$10$$ 個隱藏元的網(wǎng)絡(luò)。然后繼續(xù)調(diào)整 $$\eta$$ 和 $$\lambda$$榆苞。接著調(diào)整成 $$20$$ 個隱藏元稳衬。然后將其他的超參數(shù)調(diào)整再調(diào)整。如此進(jìn)行坐漏,在每一步使用我們 hold out 驗證數(shù)據(jù)集來評價性能薄疚,使用這些度量來找到越來越好的超參數(shù)。當(dāng)我們這么做的時候赊琳,一般都需要花費(fèi)更多時間來發(fā)現(xiàn)由于超參數(shù)改變帶來的影響街夭,這樣就可以一步步減少監(jiān)控的頻率。

所有這些作為一種寬泛的策略看起來很有前途慨畸。然而莱坎,我想要回到尋找超參數(shù)的原點(diǎn)。實際上寸士,即使是上面的討論也傳達(dá)出過于樂觀的觀點(diǎn)檐什。實際上,很容易會遇到神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)不到任何知識的情況弱卡。你可能要花費(fèi)若干天在調(diào)整參數(shù)上乃正,仍然沒有進(jìn)展。所以我想要再重申一下在前期你應(yīng)該從實驗中盡可能早的獲得快速反饋婶博。直覺上看瓮具,這看起來簡化問題和架構(gòu)僅僅會降低你的效率。實際上,這樣能夠?qū)⑦M(jì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ò)。我們會像前面介紹的實驗?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ī)梯度下降其實是期望我們能夠逐漸地抵達(dá)代價函數(shù)的谷底的望艺,

然而,如果 $$\eta$$ 太大的話肌访,步長也會變大可能會使得算法在接近最小值時候又越過了谷底找默。這在 $$\eta=2.5$$ 時非常可能發(fā)生吼驶。當(dāng)我們選擇 $$\eta=0.25$$ 時惩激,初始幾步將我們帶到了谷底附近店煞,但一旦到達(dá)了谷底,又很容易跨越過去风钻。而在我們選擇 $$\eta=0.025$$ 時顷蟀,在前 $$30$$ 回合的訓(xùn)練中不再受到這個情況的影響。當(dāng)然骡技,選擇太小的學(xué)習(xí)率衩椒,也會帶來另一個問題——隨機(jī)梯度下降算法變慢了。一種更加好的策略其實是哮兰,在開始時使用 $$\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$$ 實際值不應(yīng)該比閾值大。實際上荠医,如果 $$\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$$废封。實際上州泊,我發(fā)現(xiàn)使用 $$\eta=0.5$$ 在 $$30$$ 回合內(nèi)表現(xiàn)是很好的,所以選擇更低的學(xué)習(xí)率漂洋,也沒有什么問題遥皂。

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

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

我們需要再明確一下什么叫做分類準(zhǔn)確度不再提升溯职,這樣方可實現(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ù)來獲得相當(dāng)好的結(jié)果柠偶。類似地,對不同于 MNIST 的問題睬关,$$10$$ 回合不提升就終止的規(guī)則會太多激進(jìn)或者太多保守诱担,這都取決于問題的本身特質(zhì)。然而电爹,進(jìn)行一些小的實驗蔫仙,發(fā)現(xiàn)好的提前終止的策略還是非常簡單的。

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

問題

  • 修改 network2.py 來實現(xiàn)提前終止施籍,并讓 $$n$$ 回合不提升終止策略中的 $$n$$ 稱為可以設(shè)置的參數(shù)。
  • 你能夠想出不同于 $$n$$ 回合不提升終止策略的其他提前終止策略么概漱?理想中丑慎,規(guī)則應(yīng)該能夠獲得更高的驗證準(zhǔn)確度而不需要訓(xùn)練太久。將你的想法實現(xiàn)在 network2.py 中瓤摧,運(yùn)行這些實驗和 $$10$$ 回合不提升終止策略比較對應(yīng)的驗證準(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í)率呢?其實有很多方法塞俱。一種自然的觀點(diǎn)是使用提前終止的想法姐帚。就是保持學(xué)習(xí)率為一個常量知道驗證準(zhǔn)確度開始變差。然后按照某個量下降學(xué)習(xí)率障涯,比如說按照 $$10$$ 或者 $$2$$罐旗。我們重復(fù)此過程若干次膳汪,知道學(xué)習(xí)率是初始值的 $$1/1024$$(或者$$1/1000$$)。那時就終止九秀。

可變學(xué)習(xí)率可以提升性能遗嗽,但是也會產(chǎn)生大量可能的選擇。這些選擇會讓人頭疼——你可能需要花費(fèi)很多精力才能優(yōu)化學(xué)習(xí)規(guī)則鼓蜒。對剛開始實驗痹换,我建議使用單一的常量作為學(xué)習(xí)率的選擇。這會給你一個比較好的近似都弹。后面娇豫,如果你想獲得更好的性能,值得按照某種規(guī)則進(jì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 實現(xiàn)學(xué)習(xí)規(guī)則:每次驗證準(zhǔn)確度滿足滿足$$10$$ 回合不提升終止策略時改變學(xué)習(xí)率;當(dāng)學(xué)習(xí)率降到初始值的 $$1/128$$ 時終止框杜。

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

練習(xí)

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

在本書前面弦聂,我是如何選擇超參數(shù)的:如果你使用本節(jié)給出的推薦策略,你會發(fā)現(xiàn)你自己找到的 $$\eta$$ 和 $$\lambda$$ 不總是和我給出的一致氛什。原因自傲與莺葫,本書有一些限制,有時候會使得優(yōu)化超參數(shù)變得不現(xiàn)實枪眉。想想我們已經(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ù)常常是折衷的選擇碗旅。

相較于這樣的折衷,其實我本可以嘗試優(yōu)化每個單一的觀點(diǎn)的超參數(shù)選擇悴灵。理論上扛芽,這可能是更好更公平的方式,因為那樣的話我們可以看到每個觀點(diǎn)的最優(yōu)性能积瞒。但是川尖,我們現(xiàn)在依照目前的規(guī)范進(jìn)行了眾多的比較,實踐上茫孔,我覺得要做到需要過多的計算資源了叮喳。這也是我使用折衷方式來采用盡可能好(卻不一定最優(yōu))的超參數(shù)選擇。

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

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

基于這個觀點(diǎn)鲁纠,這看起來好像我們需要使用在線學(xué)習(xí)总棵。實際上,情況會變得更加復(fù)雜改含。在上一章的問題中 我指出我們可以使用矩陣技術(shù)來對所有在 minibatch 中的樣本同時計算梯度更新彻舰,而不是進(jìn)行循環(huán)。所以,取決于硬件和線性代數(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í)更好唯卖,因為我們在線學(xué)習(xí)更新得太過頻繁了。假設(shè)躬柬,在 minibatch 下拜轨,我們將學(xué)習(xí)率擴(kuò)大了 $$100$$ 倍,更新規(guī)則就是

這看起來項做了 $$100$$ 次獨(dú)立的在線學(xué)習(xí)允青。但是僅僅比在線學(xué)習(xí)花費(fèi)了 $$50$$ 倍的時間橄碾。當(dāng)然,其實不是同樣的 100 次在線學(xué)習(xí)颠锉,因為 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 大小的選擇其實是相對獨(dú)立的一個超參數(shù)(網(wǎng)絡(luò)整體架構(gòu)外的參數(shù)),所以你不需要優(yōu)化那些參數(shù)來尋找好的 minibatch 大小恐疲。因此腊满,可以選擇的方式就是使用某些可以接受的值(不需要是最優(yōu)的)作為其他參數(shù)的選擇,然后進(jìn)行不同 minibatch 大小的嘗試培己,像上面那樣調(diào)整 $$\eta$$碳蛋。畫出驗證準(zhǔn)確度的值隨時間(非回合)變化的圖,選擇哪個得到最快性能的提升的 minibatch 大小省咨。得到了 minibatch 大小肃弟,也就可以對其他的超參數(shù)進(jìn)行優(yōu)化了。

當(dāng)然,你也發(fā)現(xiàn)了笤受,我這里并沒有做到這么多穷缤。實際上,我們的實現(xiàn)并沒有使用到 minibatch 更新快速方法箩兽。就是簡單使用了 minibatch 大小為 $$10$$津肛。所以,我們其實可以通過降低 minibatch 大小來進(jìn)行提速汗贫。我也沒有這樣做身坐,因為我希望展示 minibatch 大于 $$1$$ 的使用,也因為我實踐經(jīng)驗表示提升效果其實不明顯落包。在實踐中部蛇,我們大多數(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)實是,很多工作已經(jīng)使用自動化過程進(jìn)行笔呀。通常的技術(shù)就是網(wǎng)格搜索(grid search)幢踏,可以系統(tǒng)化地對超參數(shù)的參數(shù)空間的網(wǎng)格進(jìn)行搜索。網(wǎng)格搜索的成就和限制(易于實現(xiàn)的變體)在 James Bergstra 和 Yoshua Bengio $$2012$$ 年的論文中已經(jīng)給出了綜述许师。很多更加精細(xì)的方法也被大家提出來了房蝉。我這里不會給出介紹,但是想指出 2012 年使用貝葉斯觀點(diǎn)自動優(yōu)化超參數(shù)的論文微渠。代碼可以獲得搭幻,也已經(jīng)被其他的研究人員使用了。

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

選擇超參數(shù)的難度由于如何選擇超參數(shù)的方法太繁多(分布在太多的研究論文卦尊,軟件程序和僅僅在一些研究人員的大腦中)變得更加困難叛拷。很多很多的論文給出了(有時候矛盾的)建議。然而岂却,還有一些特別有用的論文對這些繁雜的技術(shù)進(jìn)行了梳理和總結(jié)忿薇。Yoshua Bengio 在 $$2012$$ 年的論文中給出了一些實踐上關(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)容其實已經(jīng)被作者共享在網(wǎng)絡(luò)上了,也許在搜搜引擎上能夠找到一些姑曙。

在你讀這些文章時襟交,特別是進(jì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)然滞乙,從一個實踐者角度奏纪,肯定是應(yīng)用更加容易的技術(shù)。這在你剛開始處理某個問題時尤其如此斩启,因為那時候序调,你都不確定一個機(jī)器學(xué)習(xí)算法能夠解決那個問題。但是兔簇,如果獲得最優(yōu)的性能是最重要的目標(biāo)的話发绢,你就可能需要嘗試更加復(fù)雜精妙的知識的方法了。如果機(jī)器學(xué)習(xí)總是簡單的話那是太好不過了垄琐,但也沒有一個應(yīng)當(dāng)?shù)睦碛烧f機(jī)器學(xué)習(xí)非得這么簡單边酒。

其他技術(shù)


本章中講述的每個技術(shù)都是很值得學(xué)習(xí)的,但是不僅僅是由于那些我提到的愿意狸窘。更重要的其實是讓你自己熟悉在神經(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'$$ 處計算出來的
  • ...

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

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

如果 Hessian 優(yōu)化這么厲害得哆,為何我們這里不使用它呢?不幸的是哟旗,盡管 Hessian 優(yōu)化有很多可取的特性贩据,它其實還有一個不好的地方:在實踐中很難應(yīng)用。這個問題的部分原因在于 Hessian 矩陣的太大了闸餐。假設(shè)你有一個 $$10^7$$ 個權(quán)重和偏差的網(wǎng)絡(luò)饱亮。那么對應(yīng)的 Hessian 矩陣會有 $$10^7 \times 107=1014$$ 個元素。這真的是太大了舍沙!所以在實踐中近上,計算 $$H^{-1}\nabla C$$ 就極其困難。不過拂铡,這并不表示學(xué)習(xí)理解它沒有用了壹无。實際上歼跟,有很多受到 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)中的摩擦力大胁t空。桓訙?zhǔn)確地說疗我,你應(yīng)該將 $$1-\mu$$ 看成是摩擦力的量咆畏。當(dāng) $$\mu=1$$ 時,沒有摩擦吴裤,速度完全由梯度 $$\nabla C$$ 決定旧找。相反,若是 $$\mu=0$$麦牺,就存在很大的摩擦钮蛛,速度無法疊加,公式(107)(108)就變成了通常的梯度下降剖膳,$$w\righarrow w'=w-\eta \nabla C$$魏颓。在實踐中,使用 $$0$$ 和 $$1$$ 之間的 $$\mu$$ 值可以給我們避免過量而又能夠疊加速度的好處吱晒。我們可以使用 hold out 驗證數(shù)據(jù)集來選擇合適的 $$\mu$$ 值甸饱,就像我們之前選擇 $$\eta$$ 和 $$\lambda$$ 那樣。

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

關(guān)于 momentum 技術(shù)的一個很好的特點(diǎn)是它基本上不需要改變太多梯度下降的代碼就可以實現(xiàn)复局。我們可以繼續(xù)使用反向傳播來計算梯度木缝,就和前面那樣傍念,使用隨機(jī)選擇的 minibatch 的方法歪架。這樣的話股冗,我們還是能夠從 Hessian 技術(shù)中學(xué)到的優(yōu)點(diǎn)的——使用梯度如何改變的信息。也僅僅需要進(jìn)行微小的調(diào)整和蚪。實踐中止状,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)勢劣勢速妖,以及在實踐中如何應(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ù)屁擅。實踐中偿凭,使用其他模型的神經(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)元的輸出是

這其實和 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?實話講毒返,確實并沒有先驗的答案租幕!然而,存在一些理論論點(diǎn)和實踐證據(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}$$歉眷。因為所有的激活值都是正數(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)重都會或者一起增加或者一起減少盗胀。這就有問題了艘蹋,因為某些權(quán)重可能需要有相反的變化。這樣的話票灰,只能是某些輸入激活值有相反的符號才可能出現(xiàn)女阀。所以,我們用 $$\tanh$$ 替換就能夠達(dá)到這個目的米间。因此强品,因為 $$\tanh$$ 是關(guān)于 $$0$$ 對稱的膘侮,$$tanh(-z)=-tanh(z)$$屈糊,我們甚至期望,大概地琼了,隱藏層的激活值能夠在正負(fù)間保持平衡逻锐。這樣其實可以保證對權(quán)重更新沒有系統(tǒng)化的單方面的偏差。

我們應(yīng)當(dāng)如何看待這個論點(diǎn)雕薪?盡管論點(diǎn)是建設(shè)性的,但它還只是一個啟發(fā)式的規(guī)則所袁,而非嚴(yán)格證明說 $$\tanh$$ 就一定超過 sigmoid 函數(shù)燥爷◎谀叮可能 sigmoid 神經(jīng)元還有其他的特性能夠補(bǔ)償這個問題前翎?實際上,對很多任務(wù)港华,$$\tanh$$ 在實踐中給出了微小的甚至沒有性能提升道川。不幸的是,我們還沒有快速準(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ù)既绩。實際上熬词,這個問題比我已經(jīng)講過的還要困難互拾,因為其實是有無窮多的可能的激活函數(shù)颜矿。所以對給定問題骑疆,什么激活函數(shù)最好箍铭?什么激活函數(shù)會導(dǎo)致學(xué)習(xí)最快诈火?哪個能夠給出最高的測試準(zhǔn)確度冷守?其實現(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)元作為首選涧黄,因為他們其實是強(qiáng)大的也給出了具體關(guān)于神經(jīng)網(wǎng)絡(luò)核心思想的示例笋妥。但是你需要記住的是挽鞠,這些同樣的想法也都可以用在其他類型的神經(jīng)元上信认,有時候的確會有一些性能的提升嫁赏。

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

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

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

曾經(jīng)我參加量子力學(xué)基礎(chǔ)的會議時雄卷,我注意到讓我最好奇的口頭表達(dá):在報告結(jié)束時丁鹉,聽眾的問題通常是以“我對你的觀點(diǎn)很贊同,但是...”開始漠酿。量子力學(xué)基礎(chǔ)不是我的擅長領(lǐng)域记靡,我注意到這種類型的質(zhì)疑摸吠,因為在其他的科學(xué)會議上寸痢,我很少(或者說,從未)聽到這種同情献烦。那時候巩那,我思考了這類問題存在的原因即横,實際上是因為這個領(lǐng)域中很少有重大的進(jìn)展东囚,人們都是停在原地页藻。后來份帐,我意識到弥鹦,這個觀念相當(dāng)?shù)募饪瘫蚧怠0l(fā)言人正在嘗試解決一些人們所遇到的一些最難的問題栓始。進(jìn)展當(dāng)然會非常緩慢!但是落恼,聽聽人們目前正在思考的方式也是非常有價值的佳谦,即使這些嘗試不一定會有無可置疑的新進(jìn)展钻蔑。

你可能會注意到類似于“我對你的觀點(diǎn)很贊同咪笑,但是...”的話語窗怒。為了解釋我們已經(jīng)看到的情況,我通常會使用“啟發(fā)式地孔轴,...”或者“粗略地講路鹰,...”晋柱,然后接上解釋某個現(xià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)于很一般的假說的非常扎實非常可靠的證據(jù)灾挨。但是在神經(jīng)網(wǎng)絡(luò)中劳澄,存在大量的參數(shù)和超參數(shù)及其間極其復(fù)雜的交互飒硅。在這樣復(fù)雜系統(tǒng)中三娩,構(gòu)建出可靠的一般的論斷就尤其困難双吆。在完全一般性上理解神經(jīng)網(wǎng)絡(luò)實際上好乐,和量子力學(xué)基礎(chǔ)一樣曹宴,都是對人類思維極限的挑戰(zhàn)。實際上版扩,我們通常是和一些一般的理論的具體的實例在打交道——找到正面或者反面的證據(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),因為一個神經(jīng)元不能夠依賴于特定其他神經(jīng)元的存在葬馋。因此畴嘶,這個就強(qiáng)制性地讓我們學(xué)習(xí)更加健壯的在很多不同的神經(jīng)元的隨機(jī)子集的交集中起到作用的那些特征区匣】鞴常”這是一個豐富而又爭議的假說,我們可以根據(jù)這個觀點(diǎn)發(fā)展出一系列的研究項目栅哀,搞清楚哪些部分真的称龙,哪些是假的留拾,那個需要變化和改良。實際上鲫尊,有一小部分研究人員正在調(diào)查 dropout(和其他變體)試著理解其工作的機(jī)制痴柔,還有 dropout 的極限所在。所以马昨,這些研究也跟隨著那些我們已經(jīng)討論過的啟發(fā)式想法竞帽。每個啟發(fā)式想法不僅僅是一個(潛在的)解釋鸿捧,同樣也是一種更加細(xì)化地調(diào)查和理解的挑戰(zhàn)屹篓。

當(dāng)然,對某個單獨(dú)的人去研究所有這些啟發(fā)式想法其實在時間上是不允許的匙奴。需要神經(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)格和無法充分地證明而放棄啟發(fā)式規(guī)則么泼菌?不谍肤!實際上,我們需要這樣的啟發(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)系作者
  • 序言:七十年代末错忱,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子挂据,更是在濱河造成了極大的恐慌以清,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件棱貌,死亡現(xiàn)場離奇詭異玖媚,居然都是意外死亡箕肃,警方通過查閱死者的電腦和手機(jī)婚脱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來勺像,“玉大人障贸,你說我怎么就攤上這事∫骰拢” “怎么了篮洁?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長殃姓。 經(jīng)常有香客問我袁波,道長,這世上最難降的妖魔是什么蜗侈? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任篷牌,我火速辦了婚禮,結(jié)果婚禮上踏幻,老公的妹妹穿的比我還像新娘枷颊。我一直安慰自己,他們只是感情好该面,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布夭苗。 她就那樣靜靜地躺著,像睡著了一般隔缀。 火紅的嫁衣襯著肌膚如雪题造。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天猾瘸,我揣著相機(jī)與錄音界赔,去河邊找鬼桥嗤。 笑死,一個胖子當(dāng)著我的面吹牛仔蝌,可吹牛的內(nèi)容都是我干的泛领。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼敛惊,長吁一口氣:“原來是場噩夢啊……” “哼渊鞋!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起瞧挤,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤锡宋,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后特恬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體执俩,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年癌刽,在試婚紗的時候發(fā)現(xiàn)自己被綠了役首。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡显拜,死狀恐怖衡奥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情远荠,我是刑警寧澤矮固,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站譬淳,受9級特大地震影響档址,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜邻梆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一守伸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧确虱,春花似錦含友、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至宜咒,卻和暖如春惠赫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背故黑。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工儿咱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留庭砍,地道東北人。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓混埠,卻偏偏與公主長得像怠缸,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子钳宪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評論 2 354

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