softmax中的smooth程度控制

轉載鏈接如下:

Softmax理解之Smooth程度控制 - 王峯的文章 - 知乎 https://zhuanlan.zhihu.com/p/49939159

 

本文主要銜接前面 從最優化角度理解softmax 的文章,指出了集中sommoth化後函數存在的問題(以softmax和LogSumMax爲例)。具體內容如下:

 

在第一篇文章中我們利用最優化裏常見的 smooth 操作,將一個難以優化的分類目標函數經過兩步 smooth 化後轉變爲常見的 Softmax交叉熵損失函數。文章發出來以後, 

 跟我說優化目標可以改得更簡潔一些:

 

通過網絡輸出 [公式] 個分數,使得目標分數最大。

換成數學語言,就是要讓:

[公式]

這樣,其對應的損失函數形式就非常簡單了:

[公式]

這個損失函數起到的作用是:當 [公式] 恰好是 [公式] 中最大的元素時,損失函數爲0;當某非目標分數 [公式] 大於目標分數 [公式] 時,就產生了一個正的損失。同樣的,通過使用 LogSumExp 函數就可以將這個損失函數轉化爲 Softmax 交叉熵損失。感興趣的讀者可以自行推導一下作爲練習。

經過這樣的修改我們將所有的 [公式] 一視同仁,其實是不利於我後面引入 margin 項的。不過對於本篇文章關於 smooth 的理解倒是非常有利,所以這篇文章將會基於這個組目標-損失函數來進行分析。

結合第一篇文章和本文所描述的 smooth 方法,我們知道 Softmax 交叉熵損失可以理解爲在使用 LogSumExp 函數對 max 函數進行替代,那麼這樣替代除了使得優化更容易進行下去有什麼副作用呢?本文將從 smooth 程度控制的角度來講一下 Softmax 交叉熵損失的缺點。

爲了讓讀者更容易看明白,這裏再把 Softmax 和 LogSumExp 兩個函數的定義寫一下:

 

有了這兩個公式,我們來看一組例子:

x = [1 2 3 4]
softmax(x) = [0.0321 0.0871 0.2369 0.6439]
LSE(x) = 4.4402

從這個例子來看,本來1和4只差4倍,通過指數函數的放大作用,Softmax後的結果相差大約20倍。這樣看,Softmax起到了近似 one-hot max 的作用,但 0.6439 其實也不算靠近1,近似效果不佳。

下面我們將 x 放大10倍:

x = [10 20 30 40]
softmax(x) = [9.36e-14 2.06e-9 4.54e-5 1.00]
LSE(x) = 40.00

可以看到,放大10倍之後,不管是 Softmax 還是 LogSumExp 都起到了理想的作用。

那縮小10倍呢?

x = [0.1 0.2 0.3 0.4]
softmax(x) = [0.2138 0.2363 0.2612 0.2887]
LSE(x) = 1.6425

可以看到在這種情況下,Softmax 和 LogSumExp 都不再能夠很好地近似了,Softmax 的最大值和最小值差距不到一倍,而 LogSumExp 竟然比 max(x) 大了4倍多。

也就是說 Softmax 交叉熵損失在輸入的分數較小的情況下,並不能很好地近似我們的目標函數。在使用 [公式] 對 [公式] 進行替換時, [公式] 將會遠大於 [公式] ,不論 [公式] 是不是最大的,都會產生巨大的損失。我們在第一篇文章中分析過,稍高的 [公式] 可以在類間引入一定的間隔,從而提升模型的泛化能力。但過大的間隔同樣是不利於分類模型的,這樣訓練出來的模型必然結果不理想。

總結一下, [公式] 的幅度既不能過大、也不能過小,過小會導致近對目標函數近似效果不佳的問題;過大則會使類間的間隔趨近於0,影響泛化性能。

那麼如何去控制 [公式] 的幅度呢?在增強學習、知識蒸餾等領域,使用的 Softmax 交叉熵損失通常是帶有溫度項 [公式] 的:

[公式]

溫度項控制着 Softmax 的 smooth 程度, [公式] 越小,則 Softmax 越接近one-hot max, [公式] 越大,則近似效果越差。那麼只要我們引入這一項,並將 [公式] 設置得足夠小,是不是就能解決問題了呢?

其實沒那麼容易,注意到這個 [公式] 是施加在所有的分數 [公式] 上的,所以這是對分數的一個線性變換,由於 [公式] 本身就是通過一個內積層(全連接層)得到的,線性-線性還是線性,所以這個 [公式]在優化過程中會被融合進前邊的內積層,只要進行充分的訓練,是不會產生什麼實際的影響的。

爲了解決這一問題也有好幾種方案,首先最好想到的就是根據當前分數 [公式] 的大小動態地設置 [公式],就像煉丹一樣,隨時把控火爐的溫度,很符合我們煉丹師的風格2333...

但這樣做太麻煩了,去年有一篇文章提出了一種叫 Feature Incay 的方法,加一個約束項讓特徵的幅度拉大,這樣就可以緩解小幅度的 [公式] 的問題(注意特徵跟 [公式] 並不是同一回事,中間還有個內積層,所以這是個間接的影響)。而且這篇文章也提到了不能使特徵幅度過長,所以使用的約束項是特徵幅度的倒數,這樣較小幅度的特徵獲得的拉長效果要比較大幅度的特徵獲得的要多很多。這篇文章最終被ICLR workshop收錄,值得一看。

Feature Incay 的缺點在於:一是提升特徵幅度跟提升 [公式] 的幅度之間總歸是差一層,二是通過約束項來拉昇特徵幅度也不能保證就沒有小幅度的特徵存在,總之就是不那麼直接。不過這些都可以通過調參來調節嘛,我們煉丹師最擅長了。

另一種方案是將特徵和權重全部歸一化,這樣 [公式] 就從特徵與權重的內積變成了特徵與權重的餘弦,由於餘弦值的範圍是 [公式] ,所以 [公式] 的幅度就大致被定下來了,然後我們再乘上一個尺度因子 [公式] 來拉長 [公式] 的幅度,來保證輸入到 Softmax 裏的分數能在一個合適的範圍:

[公式]

這裏的 [公式] 表示是由歸一化後的特徵與權重的內積(即餘弦)得到的分數。這個方法的優點在於我們是可以估計出 Softmax 大概需要的 [公式] 的幅度是多少的,所以在設置這個 [公式] 的時候相對於約束項前邊的 [公式] 更加有理論可循。至於是什麼理論呢?公式太多我懶得在博客裏打了,歡迎閱讀我的NormFace 論文 (Proposition 2),或者是我的博士論文(定理3.1)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章