新智元推薦

  來源:知乎專欄

  作者:黃二二

  【新智元導讀】本文作者重新審視了ResNet之所以工作的原因,得出結論: ResNet 本質上就幹了一件事:降低數據中信息的冗餘度。

  最近在總結完成語義分割任務的輕量級神經網絡時,看到了 MobileNet V2 中對於 ReLU 層的思考,於是我也回過頭重新審視 ResNet 之所以 work 的本質原因。以下是一些個人的見解,如有錯誤,還望及時指正。

  在談及 ResNet 之前,我們先聊聊故事的背景。

  我們知道,在神經網絡中,非線性激活層可以爲模型引入了非線性,讓模型具有更強的擬合能力。如果只是單純的線性操作層的疊加,則完全可以等價爲一個線性層,這就浪費了深度神經網絡的一身好本領。

  所謂針無兩頭尖,那麼非線性激活層會帶來一些什麼問題呢?我們以ReLU爲例來進行說明,其他非線性激活層亦同理。

  首先,最直觀的,從實驗中我們可以注意到一個事實:ReLU 會造成的低維數據的坍塌(collapse)。顧名思義,即是說,低維度的 feature 在通過 ReLU 的時候,這個 feature 會像塌方了一樣,有一部分被毀掉了,或者說失去了。能恢復嗎?能,但是基本無法百分百還原了。

  具體表現出來就是:若是我們對一個 feature,先通過一個給定的變換規則 T,將它映射到它的 embedding space 中,再在該 embedding space 中,利用一個 ReLU 去處理該 feature,最後再把這個 feature 以同樣的變換規則(逆方向)給映射回原始空間,我們會發現,這時,這個 feature 已經變得連親媽都不認得了。如圖

  圖片來自《MobileNetV2: Inverted Residuals and Linear Bottlenecks》

  ReLU 這個東西,其實就是一個濾波器,只不過這個濾波器的作用域不是信號處理中的頻域,而是特徵域。那麼濾波器又有什麼作用呢?維度壓縮,俗話說就是降維啦:如果我們有 m 個 feature 被送入 ReLU 層,過濾剩下 n 個(n

  那麼,爲什麼低維數據流經非線性激活層會發生坍塌(信息丟失),而高維數據就不會呢?

  打個簡單但不嚴謹的比方:大家都有過年搶高鐵票的經驗吧?幾個人(維度低)幫你搶一張票,肯定沒有一羣人(維度高)幫你搶一張票,成功的概率高啊。幾個人裏面,大概率全軍覆沒,沒一個能幫上你忙的。而一羣人裏面,大概率總有那麼一個手速驚人的單身青年,幫你搶到你心心念唸的回家票。

  在數據上也是一個道理,維度低的 feature,分佈到 ReLU 的激活帶上的概率小,因此經過後信息丟失嚴重,甚至可能完全丟失。而維度高的 feature,分佈到 ReLU 的激活帶上的概率大,雖然可能也會有信息的部分丟失,但是無傷大雅,大部分的信息仍然得以保留。所謂留得青山在,不愁沒柴燒嘛。更何況被 ReLU 截殺的信息,可能只是一些無用遊民(冗餘信息)。

  那麼數據的坍塌,是個很嚴重的事嗎?

  那事兒可大了。如果把神經網絡比作一個人的話,你這就是給它的某個部位的血管裏,丟了個血栓。

  當信息無法流過 ReLU 時,該神經元的輸出就會變爲 0。而在反向傳播的過程中,ReLU 對 0 值的梯度爲 0,即發生了梯度消失,這將導致神經元的權重無法再通過梯度下降法進行更新,這種現象被稱爲特徵退化。所以這個神經元相當於死掉了,喪失了學習能力。我們說,一旦神經元的輸出陷入 0 值,就無法恢復了。

  那麼,我們應該怎麼去規避數據的坍塌呢?非線性激活層到底是個什麼樣的東西?

  其實,對於一個數據,利用非線性激活層對其進行激活,其實是從該數據的信息中提取出其潛在的稀疏性,但是這種提取的結果是否正確,就要分情況討論了。

  對於一個 M 維的數據,我們可以將其看成是在 M 維空間中的一個 M 維流形(manifold)。而其中的有用信息,就是在該 M 維空間中的一個子空間(子空間的維度記爲 N 維,N

  而維度低的數據其實就是這麼一種情況:其信息的冗餘度高的可能性本來就低,如果強行對其進行非線性激活(維度壓縮),則很有可能丟失掉有用信息,甚至丟失掉全部信息(輸出爲全 0)。

  與非線性激活層不同的是,線性激活層並不壓縮特徵空間的維度。於是,我們得到了一條使用激活層的原則

  對含有冗餘信息的數據使用非線性激活(如 ReLU),對不含冗餘信息的數據使用線性激活(如一些線性變換)。

  兩種類型的激活交替靈活使用,以同時兼顧非線性和信息的完整性。

  由於冗餘信息和非冗餘信息所攜帶的有用信息是一樣多的,因此在設計網絡時,對內存消耗大的結構最好是用在非冗餘信息上。

  根據以上的原則設計出來的結構,聰明的你想到了什麼?ResNet。不得不讚嘆 Kaiming He 的天才,ResNet 這東西,描述起來固然簡單,但是對它的理解每深一層,就會愈發發現它的精妙及優雅,從數學上解釋起來非常簡潔,非常令人信服,而且直切傳統痛點。

  ResNet 本質上就幹了一件事:降低數據中信息的冗餘度

  具體說來,就是對非冗餘信息採用了線性激活(通過 skip connection 獲得無冗餘的 identity 部分),然後對冗餘信息採用了非線性激活(通過 ReLU 對 identity 之外的其餘部分進行信息提取 / 過濾,提取出的有用信息即是殘差)。

  其中,提取 identity 這一步,就是 ResNet 思想的核心

  從本文的觀點來看,因爲從數據中拿掉了非冗餘信息的 identity 部分,會導致餘下部分的信息冗餘度變高。這就像從接近飽和的溶液中移走了一部分溶質,會使得剩下的溶液的飽和度降低,一個道理。

  在這裏也引用一下其他的一些觀點,方便大家可以從一個更全面的角度去看這個問題:

  從特徵複用的觀點來看,提取 identity 部分,可以讓網絡不用再去學習一個 identity mapping(雖然是一樣的東西,但是畢竟又要從頭學起,講真,換你來試試,這其實真的不容易學到),而是直接學習 residual。這就輕鬆愉快多了:站在巨人的肩膀上,做一點微小的工作什麼的...

  既然說了 ResNet 解決的痛點,也順便多說幾句它帶來的好處:

  由於 identity 之外的其餘部分的信息冗餘度較高,因此在對其使用 ReLU 進行非線性激活時,丟失的有用信息也會較少,ReLU 層輸出爲 0 的可能性也會較低。這就降低了在反向傳播時 ReLU 的梯度消失的概率,從而便於網絡的加深,以大大地發揮深度網絡的潛能。

  特徵複用能加快模型的學習速度,因爲參數的優化收斂得快(從 identity 的基礎上直接學習殘差,總比從頭學習全部來得快)。

  最後是兩個小 tips:

  如果一個信息可以完整地流過一個非線性激活層,則這個非線性激活層對於這個信息而言,相當於僅僅作了一個線性激活。

  解決由非線性激活導致的反向傳播梯度消失的竅門,就是要提高進行非線性激活的信息的冗餘度。

  如果您覺得本文對您有所幫助,請高擡貴手點個贊~

  接下來會填之前語義軟分割的坑和圖神經網絡的坑,還有一些雜七雜八的:如姿態估計網絡啦、deepSLAM 啦、視覺跟蹤網絡啦、VQA 啦... 最近光忙着看 paper 和寫筆記了,有空再整理後發上來。

  以上。

相關文章