谷歌大腦提出新型激活函數Swish惹爭議:可直接替換並優於ReLU?(附機器之心測試)

選自arXiv

機器之心編譯

參與:路雪、蔣思源

近日,谷歌大腦團隊提出了新型激活函數 Swish,團隊實驗表明使用 Swish 直接替換 ReLU 激活函數總體上可令 DNN 的測試準確度提升。此外,該激活函數的形式十分簡單,且提供了平滑、非單調等特性從而提升了整個神經網路的性能。

在該論文中,谷歌大腦團隊所提出了 Swish 激活函數:f(x) = x · sigmoid(x),並通過基線實驗表明其在絕大多數環境中可以替代當前比較流行的 ReLU 函數。不過在 Reddit 論壇上,該激活函數的性能與優點還是有些爭議的,有的開發者發現該激活函數很多情況下可以比標準的 ReLU 獲得更高的性能,而有些開發者則認為 Swish 激活函數並沒有什麼新意,我們應該關注於更加基礎的研究。

Jean-Porte:我發現該論文要比 ELU 論文更加有意思。他們在激活函數空間上使用搜索技術,然後分析並執行一些試驗。激活函數是十分重要的,自從 ReLU 函數流行以來,我們就很少在上面有比較大的進展,所以現在確實需要一批研究激活函數的論文以提升神經網路性能。

Turick:我們為什麼不將該論文的創意結合早先提出的 SELU(縮放指數型線性單元),從而使 Swish 能實現自歸一化而不需要使用使用批量歸一化技術。如果我的推導沒錯的話,那麼激活函數的形式就應該是 1.67653251702 * x * sigmoid(x)。

jbmlres:在《Sigmoid-Weighted Linear Units for Neural Network Function Approximation in Reinforcement Learning》這篇論文中,所使用的激活函數難道不是類似的結構嗎?

inkognit:該激活函數和 Facebook 提出的門控線性單元(Gated Linear Unit/GLU)有點類似?

通過觀察 Reddit 上熱烈的討論,我們發現開發者對該激活函數的性能有很大的爭議。有研究者使用 TensorFlow 或 Keras 實現了 Swish,並且常規情況下平均測試準確度大約有 0.5% 的提升,而有的開發者更是質疑該研究是不是灌了水,如上 jbmlres 所說的論文確實和該論文使用的激活函數十分相似。對此該論文的第一作者 Prajit Ramachandran 在 Reddit 上的回應如下:

大家好,我是該論文的第一作者,下面我會總結回應一些評論:

  1. 正如上面所指出的,我們確實沒有在文獻綜述中提及該篇提出了相同激活函數的論文。該誤差在於我們沒有徹底搜索相關的文獻,我們真誠地致歉並很快會修改該論文。
  2. 如論文中所述,我們搜索了許多形式的激活函數,x*CDF(x) 確實也在我們的搜索空間中,當我們發現它的性能並沒有 x*sigmoid(x) 那麼出色。
  3. 我們也計劃在使用推薦的初始化設置下實現 SELU 實驗。
  4. 激活函數的研究非常重要,因為它是深度學習的核心單元,即使激活函數只有少量的提升,但它也會因為大量的使用而獲得極大的收益。ReLU 不僅在研究中十分常見,同時它在行業中也得到廣泛的使用。因此替代 ReLU 對研究和產業都有實際的意義。

我們希望該研究工作能為大家提供一組令人信服的實驗結果,並鼓勵使用 ReLU 的研究者和開發者至少可以嘗試使用 Swish,如果大家的實驗確實存在一些性能提升,那麼我們就可以用它替換 ReLU。最重要的是,使用 Swish 替換 ReLU 是十分便捷的,我們不需要為該激活函數修改神經網路架構和初始化等。

對此,機器之心也嘗試使用全連接神經網路測試該激活函數。我們測試的數據集是 MNIST,但因為一般情況下 3 層全連接網路就能獲得 98.53% 的測試準確度,而這樣的網路實在是太簡單了,所以我們將其擴展到包含 10 個全連接隱藏層的神經網路。通過構建更複雜的網路,我們希望能增加優化和推斷的困難,因此更能體現兩個激活函數的區別。雖然增加模型複雜度很可能會產生過擬合現象,但我們只需要對比 ReLU 和 Swish 在複雜網路下的測試準確度就行了。

以下是擴展後的神經網路層級數與每一層的神經元數,通過這些參數,我們可以了解擴展後的神經網路架構:

以下是定義推斷過程的代碼,在這裡我們首先使用的是 ReLU 激活函數:

隨後我們將定義推斷過程所涉及的 ReLU 激活函數轉換為 Swish 激活函數。因為 Swish 的表達式為 f(x) = x · sigmoid(x),而 TensorFlow 自帶 Sigmoid 函數,所以我們可以藉助 tf.nn.sigmoid() 函數構建 Swish 激活函數:

如上所示,我們先計算每一層的傳播結果,如 ac_3 計算的是第二層神經網路的輸出結果,即第三層神經網路的輸入值。然後再計算當前層的激活值,如 layer3 使用 ac_3*tf.nn.sigmoid(ac_3) 構建激活函數並計算激活值。此外,我們構建的列表 W 包含了所有層級間的權重,列表 B 包含了每一層的偏置向量,而 avg_class.average() 是模型中定義的滑動平均操作。

首先我們使用的是標準的三層全連接網路(784;500;10),這種情況下測試準確度為 0.9829。而後我們將其擴展到 10 個隱藏層以測試 Swish 的效果。以下展示使用 ReLU 激活函數的全連接網路測試準確度:

如上所示,增加到 12 層後測試準確度有所降低,這可能是超參數沒有達到最優,且整個模型更難以迭代更新權重。我們一共迭代更新了 10000 步,且每次更新所採用的批量大小為 100 個樣本,這兩個超參數的選擇是根據標準三層全連接神經網路而設定的。此外,我們發現當層級擴展到 12 層時,原有的學習率很容易使模型發散,所以測試這兩個激活函數所採用的學習率降低了 100 倍(learning_rate=0.008)。其它的超參數如正則化率、學習衰減率、移動平均衰減率都保持不變。以下是轉化為 Swish 激活函數後的訓練結果:

我們可以看到使用 Swish 激活函數的測試準確度比使用 ReLU 的高一點,但這個結果可能並不具有普遍意義。但至少我們可以說 Swish 在全連接神經網路中可以獲得與 ReLU 相匹配的性能。原論文指出當全連接網路在 40 層以內時,Swish 只稍微優於 ReLU 激活函數,但當層級增加到 40 至 50 層時,使用 Swish 函數的測試準確度要遠遠高於使用 ReLU 的測試準確度。

該全連接網路也很容易擴展到超越 40 層的情況,但這麼深的層級對於計算力要求較高,所以讀者也可以在機器之心 GitHub 下載該測試代碼並進一步完成測評。

測試代碼地址:github.com/jiqizhixin/M

添加全連接網路層級主要只需修改三個部分:第一是權重與偏置項,如定義新的 weights12 和 biases12,並將它們添加到列表 W 和 B 中;第二是定義 inference 函數中繼續傳播的過程,如 layer12 = tf.nn.relu(tf.matmul(layer11, avg_class.average(W[11])) + avg_class.average(B[11]));最後是添加權重的正則項,如 regularazation=regularaztion + regularizer(W[11])。

除了全連接網路以外,原論文還詳細對比了各種深度網路如 Inception-v4、MobileNet、Mobile NASNet-A 等,原論文表示新的激活函數總體上要優於傳統的 ReLU 函數。下面我們簡單介紹了谷歌大腦提出的新論文——Swish:一種自門控激活函數。

論文鏈接:arxiv.org/abs/1710.0594

摘要:深度網路中激活函數的選擇對訓練過程和任務性能有很大影響。目前,最成功、使用最廣泛的激活函數是修正線性單元(Rectified Linear Unit,ReLU)。儘管出現了很多修正 ReLU 的激活函數,但是無一可以真正替代它。本論文中,我們提出了一種新型激活函數 Swish:f(x) = x · sigmoid(x)。我們在多個難度較高的數據集上進行實驗,證明 Swish 在深層模型上的效果優於 ReLU。例如,僅僅使用 Swish 單元替換 ReLU 就能把 Mobile NASNetA 在 ImageNet 上的 top-1 分類準確率提高 0.9%,Inception-ResNet-v 的分類準確率提高 0.6%。Swish 的簡潔性及其與 ReLU 的相似性使從業者可以在神經網路中使用 Swish 單元替換 ReLU。

2 Swish

我們提出一個新的激活函數 Swish:

其中σ(x) = 1/(1 + exp(?x)) 是 Sigmoid 函數。圖 1 展示的是 Swish 函數的圖像:

圖 1:Swish 激活函數

和 ReLU 一樣,Swish 無上界有下界。與 ReLU 不同的是,Swish 是平滑且非單調的函數。事實上,Swish 的非單調特性把它與大多數常見的激活函數區別開來。Swish 的導數是

Swish 的一階導和二階導如圖 2 所示。輸入低於 1.25 時,導數小於 1。Swish 的成功說明 ReLU 的梯度不變性(即 x > 0 時導數為 1)在現代架構中或許不再是獨有的優勢。事實上,實驗證明在使用批量歸一化(Ioffe & Szegedy, 2015)的情況下,我們能夠訓練出比 ReLU 網路更深層的 Swish 網路。

圖 2:Swish 的一階導數與二階導數。

如果 Swish 按照下列方式進行重新參數化,則我們可以看到它與 ReLU 函數的聯繫。

如果 β = 0,則 Swish 變成線性函數 f(x) = x。當 β → ∞,Sigmoid 更接近 0-1 函數(指示函數),則 Swish 更像 ReLU 函數。這說明 Swish 可以寬泛地被視為平滑的函數,非線性地內插在線性函數和 ReLU 函數之間。當β被設置為可訓練參數時,內插程度可以由模型控制。我們稱該變數(不包括 x 前面的係數 2)為 Swish-β。

Swish 的設計受到 LSTM 和 highway network 中使用 sigmoid 函數進行門控的啟發。我們使用同樣的值進行門控來簡化門控機制,稱為自門控(self-gating)。自門控的優勢是它僅需要一個簡單的標量輸入,而正常的門控需要多個標量輸入。該特性令使用自門控的激活函數如 Swish 能夠輕鬆替換以單個標量作為輸入的激活函數(如 ReLU),無需改變參數的隱藏容量或數量。

事實上,在 TensorFlow 等大多數深度學習庫中只需更改一行代碼即可實現 Swish 函數(Abadi et al., 2016)。需要注意的是,如果使用 BatchNorm(Ioffe & Szegedy, 2015),則應設置縮放參數(scale parameter)。由於 ReLU 函數是分段線性函數,一些高級別的庫默認關閉縮放參數,但是該設置不適用於 Swish。在訓練 Swish 網路時,我們發現稍微降低用於訓練 ReLU 網路的學習率效果很好。

2.1 Swish 的特性

我們的實驗證明 Swish 在多個深度模型上的性能持續優於或與 ReLU 函數相匹配。由於訓練會受多種因素的影響,我們很難證明為什麼一個激活函數會優於另一個。但是我們認為 Swish 無上界有下界、非單調且平滑的特性都是優勢。我們在圖 3 中繪出了其他常見激活函數,這有利於討論的進行。

圖 3:常見的基線激活函數。

3 實驗

本論文在不同的任務、數據集上使用不同的模型來測試主流的激活函數性能。如下表 1 展示了 Swish 與基線激活函數之間的對比,該表總結了 Swish 激活函數和各種主流激活函數在基線性能上的差別,這些對比結果是通過不同模型(Inception 、MobileNet 等)在不同數據集(MNIST、CIFAR 或 ImageNet 等)上使用不同激活函數而實現的。

表 1:該實驗中,Swish 要優於其他激活函數的模型數量。其中使用 Swish 的模型性能普遍要比使用其它激活函數的模型性能高。

圖 6:改變帶有不同激活函數的全連接層級數時,其在 MNIST 數據集上的性能變化。以上取三次運行的中位數。

在我們的實驗中,如果全連接網路的層級在 40 層以內,那麼不同激活函數所表現出的性能沒有顯著性區別。而從 40 層增加到 50 層中,Swish 要比 ReLU 表現得更加優秀,因為隨著層級的增加,優化將變得更加困難。在非常深的網路中,Swish 相對於 ReLU 能實現更高的測試準確度。雖然傳統來說 ReLU 因為其梯度不會縮減(梯度消失問題)而表現出高效的性能,但現在 Swish 儘管有梯度縮減(梯度不為常量)現象,但其更適合訓練深層神經網路。

圖 7:改變使用不同激活函數的 ResNet-32 模型批量大小時,其在 CIFAR-10 數據集上的測試準確度。

Swish 在每一個批量大小的性能都要比 ReLU 激活函數好,這意味著兩種激活函數的性能對比並不隨著批量大小的變化而變化。

此外,我們還重點比較了主流激活函數在 ImageNet 多個架構上的性能,這些架構包括:Inception-ResNet-v2、Inception-v4、Inception-v3(Szegedy et al., 2017)、MobileNet(Howard et al., 2017)和 Mobile NASNet-A(Zoph et al., 2017)。所有架構都是為 ReLU 而設計的,但我們可以用不同的激活函數替換 ReLU,然後給定所有模型相同的迭代次數並進行訓練,訓練步數由 ReLU 基線的收斂來決定。

表 4:ImageNet 上的 Mobile NASNet-A,針對 top-1 準確率進行了 3 次不同的運行。

表 5:ImageNet 上的 Inception-ResNet-v2 的 3 次不同運行結果。注意:ELU 有時在訓練開始時存在不穩定的問題,這是其在第一次訓練取得較低結果的原因。

表 6:MobileNet 使用不同激活函數在 ImageNet 上的訓練結果。

表 8:Inception-v4 使用不同激活函數在 ImageNet 上的訓練結果。

表 4-8 的結果表明 Swish 的強大性能。Swish 在移動端模型上的性能尤其地好,在 Mobile NASNet-A 上的性能比 ReLU 高 0.9%,在 MobileNet 上的性能比 ReLU 高 2.2%。此外,Swish 在大部分模型上的性能都匹配或優於最佳性能的基線(最佳性能基線隨著模型的改變而改變)。

5 結語

Swish 是一種新型激活函數,公式為: f(x) = x · sigmoid(x)。Swish 具備無上界有下界、平滑、非單調的特性,這些都在 Swish 和類似激活函數的性能中發揮有利影響。我們在實驗中使用了專為 ReLU 設計的模型和超參數,然後用 Swish 替換掉 ReLU 激活函數;僅僅是如此簡單、非最優的迭代步數仍使得 Swish 持續優於 ReLU 和其他激活函數。我們期待當模型和超參數都專為 Swish 設計的時候,Swish 還能取得進一步的提升。Swish 的簡潔性及其與 ReLU 的相似性意味著在任何網路中替代 ReLU 都只是改變一行代碼這麼簡單的事。

原文鏈接:reddit.com/r/MachineLea

本文為機器之心編譯,轉載請聯繫本公眾號獲得授權。

推薦閱讀:

我搭的神經網路不work該怎麼辦!看看這11條新手最容易犯的錯誤
學習筆記 | 吳恩達之神經網路和深度學習
Python · 神經網路(二*)· 層
深度壓縮之蒸餾模型
「深度學習」和「多層神經網路」的區別?

TAG:谷歌Google | 神经网络 | 人工智能 |