自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

深度學(xué)習(xí)中批歸一化的陷阱

人工智能 深度學(xué)習(xí)
本文使用兩種不同方法實(shí)現(xiàn)了一種神經(jīng)網(wǎng)絡(luò)。每一步都輸入相同的數(shù)據(jù)。網(wǎng)絡(luò)具有完全相同的損失函數(shù)、完全相同的超參數(shù)和完全相同的優(yōu)化器。然后在完全相同數(shù)量的 GPU 上進(jìn)行訓(xùn)練。結(jié)果是其中一個(gè)版本的分類準(zhǔn)確度比另一種低2%,并且這種性能的下降表現(xiàn)地很穩(wěn)定。

[[191744]]

批歸一化技術(shù)(Batch Normalization)是深度學(xué)習(xí)中最近出現(xiàn)的一個(gè)有效的技術(shù),已經(jīng)被廣泛證明其有效性,并很快應(yīng)用于研究和應(yīng)用中去。這篇文章假設(shè)讀者知道什么是批歸一化,并對批歸一化有一定程度的了解,知道它是如何工作的。如果你是剛剛接觸這個(gè)概念,或者需要復(fù)習(xí)一下,您可以在后面的鏈接地址找到批歸一化的簡要概述(http://blog.csdn.net/malefactor/article/details/51476961)。

本文使用兩種不同方法實(shí)現(xiàn)了一種神經(jīng)網(wǎng)絡(luò)。每一步都輸入相同的數(shù)據(jù)。網(wǎng)絡(luò)具有完全相同的損失函數(shù)、完全相同的超參數(shù)和完全相同的優(yōu)化器。然后在完全相同數(shù)量的 GPU 上進(jìn)行訓(xùn)練。結(jié)果是其中一個(gè)版本的分類準(zhǔn)確度比另一種低2%,并且這種性能的下降表現(xiàn)地很穩(wěn)定。

我們拿一個(gè)簡單的 MNIST 和 SVHN 的分類問題為例。

在***種實(shí)現(xiàn)中,抽取一批 MNIST 數(shù)據(jù)和一批 SVHN 數(shù)據(jù),將它們合并到一起,然后將其輸入網(wǎng)絡(luò)。

 

在第二種實(shí)現(xiàn)中,創(chuàng)建兩個(gè)副本的網(wǎng)絡(luò),并共享權(quán)重。一個(gè)副本輸入 MNIST 數(shù)據(jù),另一個(gè)副本輸入 SVHN 數(shù)據(jù)。

 

請注意,在這兩種實(shí)現(xiàn)里,一半的數(shù)據(jù)是 MNIST,另一半是 SVHN。另外由于第二種實(shí)現(xiàn)共享權(quán)重,使得兩個(gè)模型的參數(shù)數(shù)量相同,且其更新方式也相同。

簡單地想一下,這兩個(gè)模型的訓(xùn)練過程中梯度應(yīng)該是相同的。事實(shí)也是如此。但是在加入批歸一化之后情況就不同了。在***種實(shí)現(xiàn)中,同一批數(shù)據(jù)中同時(shí)包含 MNIST 數(shù)據(jù)和 SVHN 數(shù)據(jù)。而在第二種方法中,該模型分兩批進(jìn)行訓(xùn)練,一批只訓(xùn)練 MNIST 數(shù)據(jù),另一批只訓(xùn)練 SVHN 數(shù)據(jù)。

導(dǎo)致這個(gè)問題的原因就是:在訓(xùn)練的時(shí)候,在兩個(gè)網(wǎng)絡(luò)共享參數(shù)的同時(shí),其數(shù)據(jù)集均值和方差的移動(dòng)平均也是被共享的。這個(gè)參數(shù)的更新也是應(yīng)用在兩套數(shù)據(jù)集上的。在第二種方法中,圖中上方的網(wǎng)絡(luò)用來自 MNIST 數(shù)據(jù)的平均值和方差的估計(jì)值進(jìn)行訓(xùn)練,而下方的網(wǎng)絡(luò)用 SVHN 數(shù)據(jù)平均值和方差的估計(jì)值進(jìn)行訓(xùn)練。但是由于移動(dòng)平均在兩個(gè)網(wǎng)絡(luò)之間共享,所以移動(dòng)平均收斂到 MNIST 和 SVHN 數(shù)據(jù)的平均值。

因此,在測試時(shí),測試集使用的批歸一化的縮放和平移(某一種數(shù)據(jù)集的平均值)與模型預(yù)期的(兩種數(shù)據(jù)集的平均值)是不同的。當(dāng)測試的歸一化與訓(xùn)練的歸一化不同時(shí),模型會(huì)得到如下結(jié)果。

 

該圖是在另一個(gè)相似數(shù)據(jù)集上(不是例子中的 MNIST 或 SVHN)用五個(gè)隨機(jī)種子的得到的***、中間和最差的模型的性能。當(dāng)使用兩個(gè)共享權(quán)重的網(wǎng)絡(luò)時(shí),不僅性能下降明顯,而且輸出結(jié)果的方差也增加。

每當(dāng)單個(gè)小批次(minibatch)的數(shù)據(jù)不能代表整個(gè)數(shù)據(jù)的分布時(shí),都會(huì)遇到這樣的問題。這就意味著忘記將輸入隨機(jī)打亂順序的情況下使用批歸一化是很危險(xiǎn)的。這在最近流行的生成對抗網(wǎng)絡(luò)(GAN)里也是非常重要的。GAN中的判別器通常是對假數(shù)據(jù)和真實(shí)數(shù)據(jù)的混合進(jìn)行訓(xùn)練。如果在判別器中使用了批歸一化,在純假數(shù)據(jù)的批次或純真實(shí)數(shù)據(jù)批次之間進(jìn)行交替是不正確的。每個(gè)小批次需要是兩者的均勻混合(各 50%)。

值得一提的是,在實(shí)踐中,使用分離批歸一化變量而共享其他變量的網(wǎng)絡(luò)結(jié)構(gòu)得到了***的結(jié)果。雖然這樣實(shí)現(xiàn)起來比較復(fù)雜,但的確是比其他方法有效的(見下圖)。

 

批歸一化:萬惡之源 

縱觀上述問題,作者得出了能不用就不用批歸一化的結(jié)論。

這個(gè)結(jié)論是從工程的角度來分析的。

大體來講,當(dāng)代碼出問題的時(shí)候,原因往往不外乎下面兩個(gè):

  1. 很明顯的錯(cuò)誤。比如變量名輸錯(cuò)了,或忘記調(diào)用某個(gè)函數(shù)。
  2. 代碼對與其交互的其他代碼的行為有沒有寫明的依賴條件,并且的確有些條件沒有滿足。這些錯(cuò)誤往往更加有害,因?yàn)橐话阈枰ê荛L時(shí)間來弄清楚代碼依賴什么樣的條件。

這兩個(gè)錯(cuò)誤都是不可避免的。第二類錯(cuò)誤可以依靠使用更簡單的方法和重用已有代碼來減少。

批歸一化的方法有兩個(gè)基本的性質(zhì):

  1. 在訓(xùn)練時(shí),單個(gè)輸入 xi 的輸出受制于小批次中的其他 xj 。
  2. 在測試時(shí),模型的計(jì)算路徑發(fā)生了變化。因?yàn)楝F(xiàn)在它使用移動(dòng)平均值而不是小批次平均值來進(jìn)行歸一化。

幾乎沒有其他優(yōu)化方法有這些性質(zhì)。這樣的話,對于實(shí)現(xiàn)批歸一化代碼的人,很容易假設(shè)以下的前提:輸入的小批次內(nèi)是不相關(guān)的,或者訓(xùn)練時(shí)與測試時(shí)做的事情是一樣的。沒有人會(huì)質(zhì)疑這種做法。

當(dāng)然,你可以將批歸一化看作***歸一化黑盒,而且還挺好用的。但是在實(shí)踐中,抽象泄漏總是存在的,批歸一化也不例外,而且其特性使它更容易泄漏。

為什么大家還不放棄批歸一化? 

計(jì)算機(jī)學(xué)界有一封著名的文章: Dijkstra 的“ GoTo 語句是有害的”。在其中,Dijkstra 認(rèn)為應(yīng)該避免使用 goto 語句,因?yàn)樗沟么a更難閱讀,任何使用 goto 的程序都可以換種不用 goto 語句的方法重寫。

作者想要聲明“批歸一化是有害的”的觀點(diǎn),但無奈找不到太好的理由,畢竟批歸一化實(shí)在太有用了。

沒錯(cuò),批歸一化的確存在問題。但當(dāng)你做的一切都正確時(shí),模型的確訓(xùn)練地快的多。批歸一化的論文有超過 1400 次的引用不是白來的。

批歸一化有很多的替代方法,但它們也有自己的不足。層歸一化(Layer Normalization)與 RNN 合用才更有效,而且用于卷積層有時(shí)會(huì)有問題。權(quán)重歸一化(Weight Normalization)和余弦歸一化(Cosine Normalization)都是比較新型的歸一化方法。權(quán)重歸一化文章中表示,權(quán)重歸一化能夠適用于一些批歸一化不起作用的問題上。但是這些方法迄今為止并沒有太多應(yīng)用,或許這只是個(gè)時(shí)間問題。層歸一化,權(quán)重歸一化和余弦歸一化都解決了上述批歸一化的問題。如果你在做一個(gè)新問題而且想冒點(diǎn)險(xiǎn)的話,推薦試一下這些歸一化方法。畢竟不論用哪一種方法,都需要做超參數(shù)調(diào)整。調(diào)整好后,各種方法之間的區(qū)別應(yīng)該是不大的。

(如果你足夠勇敢的話,甚至可以嘗試批重歸一化(Batch Renormalization),不過它仍然只在測試時(shí)使用移動(dòng)平均值。 )

使用批歸一化可以看作是深度學(xué)習(xí)中的“魔鬼的契約”。換來的是高效的訓(xùn)練,失去的是可能的不正常的結(jié)果(insanity)。每個(gè)人都在簽著這個(gè)契約。

譯者注

作者關(guān)于”批歸一化是有害的“,以及“盡可能不使用批歸一化”的觀點(diǎn)不免有些偏激。但文中提到的批歸一化的陷阱的確是不得不防的。因?yàn)榕鷼w一化的有效性,很多深度學(xué)習(xí)的研究者的確將其當(dāng)作是“魔法黑箱”,將其應(yīng)用到每一個(gè)可以用的地方。因?yàn)檫@種簡單粗暴的方法對于訓(xùn)練速度的提高是很有效的。但大家很難將準(zhǔn)確率的降低歸咎于批歸一化,畢竟從沒有見人提到過批歸一化會(huì)降低訓(xùn)練準(zhǔn)確率。

但這種訓(xùn)練測試時(shí)數(shù)據(jù)集不一致的情況的確是很常見的。譯者做的人工模擬訓(xùn)練數(shù)據(jù)集的方法中就會(huì)遇到這種問題。建議大家在使用批歸一化之前仔細(xì)考慮這樣幾個(gè)問題:

  1. 我的訓(xùn)練數(shù)據(jù)集的每批樣本是否平均?
  2. 我的訓(xùn)練數(shù)據(jù)集的每批均值是否和測試時(shí)的移動(dòng)平均一致?

否則的話,就有必要使用下面中的一種或幾種方法來避免文中的問題:

  1. 隨機(jī)采樣訓(xùn)練數(shù)據(jù)集來確保批次平均;
  2. 像文中的例子一樣修改模型來避免上述問題;
  3. 使用層歸一化,權(quán)重歸一化或者余弦歸一化來替代批歸一化;
  4. 不使用歸一化方法。 
責(zé)任編輯:龐桂玉 來源: 九次方大數(shù)據(jù)
相關(guān)推薦

2022-04-27 22:47:31

深度學(xué)習(xí)歸一化技術(shù)

2020-05-18 08:42:13

機(jī)器學(xué)習(xí)技術(shù)深度學(xué)習(xí)

2021-02-20 21:09:12

深度學(xué)習(xí)編程人工智能

2018-07-03 09:12:23

深度學(xué)習(xí)正則化Python

2022-07-06 10:23:13

深度學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)

2017-11-20 05:08:16

深度學(xué)習(xí)激活函數(shù)神經(jīng)網(wǎng)絡(luò)

2021-05-06 09:05:11

深度學(xué)習(xí)

2022-12-05 11:57:10

2022-08-26 05:12:29

IT運(yùn)營工具蔓延

2016-12-26 15:14:48

2018-03-26 20:04:16

深度學(xué)習(xí)

2025-04-27 09:59:38

深度學(xué)習(xí)AI人工智能

2018-05-06 15:51:22

2023-08-22 15:37:45

深度學(xué)習(xí)人工智能

2024-08-06 16:33:10

2010-04-14 09:12:46

虛擬化Linux虛擬化

2018-12-17 17:14:06

AI數(shù)據(jù)科技

2009-06-08 16:48:59

虛擬化服務(wù)器虛擬化IT

2012-01-05 10:19:43

JavaScript

2017-09-06 14:56:09

深度學(xué)習(xí)CTR應(yīng)用
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)