将“softmax+交叉熵”推广到多标签分类问题
?PaperWeekly 原創 ·?作者|蘇劍林
單位|追一科技
研究方向|NLP、神經網絡
一般來說,在處理常規的多分類問題時,我們會在模型的最后用一個全連接層輸出每個類的分數,然后用 softmax 激活并用交叉熵作為損失函數。在這篇文章里,我們嘗試將 “softmax+交叉熵”方案推廣到多標簽分類場景,希望能得到用于多標簽分類任務的、不需要特別調整類權重和閾值的 loss。
▲ 類別不平衡
單標簽到多標簽
一般來說,多分類問題指的就是單標簽分類問題,即從 n 個候選類別中選 1 個目標類別。假設各個類的得分分別為 ,目標類為 ,那么所用的 loss 為:
這個 loss 的優化方向是讓目標類的得分 變為 中的最大值。關于 softmax 的相關內容,還可以參考《尋求一個光滑的最大值函數》[1] 、《函數光滑化雜談:不可導函數的可導逼近》[2] 等文章。
現在我們轉到多標簽分類問題,即從 n 個候選類別中選 k 個目標類別。這種情況下我們一種樸素的做法是用 sigmoid 激活,然后變成 n 個二分類問題,用二分類的交叉熵之和作為 loss。
顯然,當 時,這種做法會面臨著嚴重的類別不均衡問題,這時候需要一些平衡策略,比如手動調整正負樣本的權重、focal loss [3] 等。訓練完成之后,還需要根據驗證集來進一步確定最優的閾值。
這時候,一個很自然的困惑就是:為什么“n選k”要比“n選1”多做那么多工作?
筆者認為這是很不科學的事情,畢竟直覺上 n 選 k 應該只是 n 選 1 自然延伸,所以不應該要比 n 要多做那么多事情,就算 n 選 k 要復雜一些,難度也應該是慢慢過渡的,但如果變成多個二分類的話,n 選 1 反而是最難的,因為這時候類別最不均衡。
而從形式上來看,單標簽分類比多標簽分類要容易,就是因為單標簽有 “softmax + 交叉熵”可以用,它不會存在類別不平衡的問題,而多標簽分類中的 “sigmoid + 交叉熵”就存在不平衡的問題。
所以,理想的解決辦法應該就是將 “softmax + 交叉熵”推廣到多標簽分類上去。
眾里尋她千百度
為了考慮這個推廣,筆者進行了多次嘗試,也否定了很多結果,最后確定了一個相對來說比較優雅的方案:構建組合形式的 softmax 來作為單標簽 softmax 的推廣。
在這部分內容中,我們會先假設 k 是一個固定的常數,然后再討論一般情況下 k 的自動確定方案,最后確實能得到一種有效的推廣形式。
2.1 組合softmax
首先,我們考慮 k 是一個固定常數的情景,這意味著預測的時候,我們直接輸出得分最高的 k 個類別即可。那訓練的時候呢?作為 softmax 的自然推廣,我們可以考慮用下式作為 loss:
其中 是 k 個目標標簽, 是配分函數。
很顯然,上式是以任何 k 個類別總得分 為基本單位所構造的 softmax,所以它算是單標簽 softmax 的合理推廣。又或者理解為還是一個單標簽分類問題,只不過這是 選 1 問題。
在這個方案之中,比較困難的地方是 的計算,它是 項總得分的指數和。不過,我們可以利用牛頓恒等式 [4] 來幫助我們遞歸計算。設 ,那么:
所以為了計算 ,我們只需要遞歸計算 k 步,這可以在合理的時間內計算出來。預測階段,則直接輸出分數最高的 k 個類就行。
2.2 自動確定閾值
上述討論的是輸出數目固定的多標簽分類問題,但一般的多標簽分類的目標標簽數是不確定的。為此,我們確定一個最大目標標簽數 ,并添加一個 0 標簽作為填充標簽,此時 loss 變為:
而:
看上去很復雜,其實很簡單,還是以 K 個類別總得分為基本單位,但是允許且僅允許 0 類重復出現。預測的時候,仍然是輸出分數最大的 K 個類,但允許重復輸出 0 類,等價的效果是以 為閾值,只輸出得分大于 的類。最后的式子顯示 也可以通過遞歸來計算,所以實現上是沒有困難的。
暮然回首闌珊處
看上去“眾里尋她千百度”終究是有了結果:理論有了,實現也不困難,接下來似乎就應該做實驗看效果了吧?效果好的話,甚至可以考慮發 paper 了吧?看似一片光明前景呢!然而~
幸運或者不幸,在驗證了它的有效性的同時,筆者請教了一些前輩大神,在他們的提示下翻看了之前沒細看的 Circle Loss [5] ,看到了它里邊統一的 loss 形式(原論文的公式 (1)),然后意識到了這個統一形式蘊含了一個更簡明的推廣方案。
所以,不幸的地方在于,已經有這么一個現成的更簡明的方案了,所以不管如何“眾里尋她千百度”,都已經沒有太大意義了;而幸運的地方在于,還好找到了這個更好的方案,要不然屁顛屁顛地把前述方案寫成文章發出來,還不如現成的方案簡單有效,那時候丟人就丟大發了。
3.1 統一的loss形式
讓我們換一種形式看單標簽分類的交叉熵 (1):
為什么這個 loss 會有效呢?在文章《尋求一個光滑的最大值函數》[1] 、《函數光滑化雜談:不可導函數的可導逼近》[2] 中我們都可以知道, 實際上就是 的光滑近似,所以我們有:
這個 loss 的特點是,所有的非目標類得分 跟目標類得分 兩兩作差比較,它們的差的最大值都要盡可能小于零,所以實現了“目標類得分都大于每個非目標類的得分”的效果。
所以,假如是有多個目標類的多標簽分類場景,我們也希望“每個目標類得分都不小于每個非目標類的得分”,所以下述形式的 loss 就呼之欲出了:
其中 分別是正負樣本的類別集合。這個 loss 的形式很容易理解,就是我們希望 ,就往 里邊加入 這么一項。如果補上縮放因子 和間隔 m,就得到了 Circle Loss 論文里邊的統一形式:
說個題外話,上式就是 Circle Loss 論文的公式 (1),但原論文的公式 (1) 不叫 Circle Loss,原論文的公式 (4) 才叫 Circle Loss,所以不能把上式叫做 Circle Loss。但筆者認為,整篇論文之中最有意思的部分還數公式 (1)。
3.2?用于多標簽分類
和 m 一般都是度量學習中才會考慮的,所以這里我們還是只關心式?(8)。如果 n 選 k 的多標簽分類中 k 是固定的話,那么直接用式?(8)?作為 loss 就行了,然后預測時候直接輸出得分最大的 k 個類別。
對于 k 不固定的多標簽分類來說,我們就需要一個閾值來確定輸出哪些類。為此,我們同樣引入一個額外的 0 類,希望目標類的分數都大于 ,非目標類的分數都小于 ,而前面已經已經提到過,“希望 就往 里邊加入 ”,所以現在式?(8)?變成:
如果指定閾值為 0,那么就簡化為:
這便是我們最終得到的 Loss 形式了——“softmax + 交叉熵”在多標簽分類任務中的自然、簡明的推廣,它沒有類別不均衡現象,因為它不是將多標簽分類變成多個二分類問題,而是變成目標類別得分與非目標類別得分的兩兩比較,并且借助于 的良好性質,自動平衡了每一項的權重。
這里給出 Keras 下的參考實現:
def?multilabel_categorical_crossentropy(y_true,?y_pred):"""多標簽分類的交叉熵說明:y_true和y_pred的shape一致,y_true的元素非0即1,1表示對應的類為目標類,0表示對應的類為非目標類。"""y_pred?=?(1?-?2?*?y_true)?*?y_predy_pred_neg?=?y_pred?-?y_true?*?1e12y_pred_pos?=?y_pred?-?(1?-?y_true)?*?1e12zeros?=?K.zeros_like(y_pred[...,?:1])y_pred_neg?=?K.concatenate([y_pred_neg,?zeros],?axis=-1)y_pred_pos?=?K.concatenate([y_pred_pos,?zeros],?axis=-1)neg_loss?=?K.logsumexp(y_pred_neg,?axis=-1)pos_loss?=?K.logsumexp(y_pred_pos,?axis=-1)return?neg_loss?+?pos_loss所以,結論就是
所以,最終結論就是式 (11),它就是本文要尋求的多標簽分類問題的統一 loss,歡迎大家測試并報告效果。筆者也實驗過幾個多標簽分類任務,均能媲美精調權重下的二分類方案。
要提示的是,除了標準的多標簽分類問題外,還有一些常見的任務形式也可以認為是多標簽分類,比如基于 0/1 標注的序列標注,典型的例子是筆者的“半指針-半標注”標注設計。
因此,從這個角度看,能被視為多標簽分類來測試式?(11)?的任務就有很多了,筆者也確實在之前的三元組抽取例子 task_relation_extraction.py?[6] 中嘗試了?(11),最終能取得跟這里 [7] 一致的效果。
當然,最后還是要說明一下,雖然理論上式?(11)?作為多標簽分類的損失函數能自動地解決很多問題,但終究是不存在絕對完美、保證有提升的方案。
所以當你用它替換掉你原來多標簽分類方案時,也不能保證一定會有提升,尤其是當你原來已經通過精調權重等方式處理好類別不平衡問題的情況下,式?(11)?的收益是非常有限的。畢竟式?(11)?的初衷,只是讓我們在不需要過多調參的的情況下達到大部分的效果。
參考鏈接
[1] https://kexue.fm/archives/3290
[2] https://kexue.fm/archives/6620
[3] https://kexue.fm/archives/4733
[4] https://en.wikipedia.org/wiki/Newton's_identities
[5] https://arxiv.org/abs/2002.10857
[6] https://github.com/bojone/bert4keras/blob/master/examples/task_relation_extraction.py
[7] https://kexue.fm/archives/7161#類別失衡
點擊以下標題查看更多往期內容:?
當深度學習遇上量化交易——因子挖掘篇
BERT在小米NLP業務中的實戰探索
Open Images冠軍方案:商湯TSD目標檢測算法解讀
如何理解用戶評論中的細粒度情感?
EAE:自編碼器 + BN + 最大熵 = 生成模型
最新綜述 | 強化學習中從仿真器到現實環境的遷移
#投 稿?通 道#
?讓你的論文被更多人看到?
如何才能讓更多的優質內容以更短路徑到達讀者群體,縮短讀者尋找優質內容的成本呢?答案就是:你不認識的人。
總有一些你不認識的人,知道你想知道的東西。PaperWeekly 或許可以成為一座橋梁,促使不同背景、不同方向的學者和學術靈感相互碰撞,迸發出更多的可能性。?
PaperWeekly 鼓勵高校實驗室或個人,在我們的平臺上分享各類優質內容,可以是最新論文解讀,也可以是學習心得或技術干貨。我們的目的只有一個,讓知識真正流動起來。
?????來稿標準:
? 稿件確系個人原創作品,來稿需注明作者個人信息(姓名+學校/工作單位+學歷/職位+研究方向)?
? 如果文章并非首發,請在投稿時提醒并附上所有已發布鏈接?
? PaperWeekly 默認每篇文章都是首發,均會添加“原創”標志
?????投稿郵箱:
? 投稿郵箱:hr@paperweekly.site?
? 所有文章配圖,請單獨在附件中發送?
? 請留下即時聯系方式(微信或手機),以便我們在編輯發布時和作者溝通
????
現在,在「知乎」也能找到我們了
進入知乎首頁搜索「PaperWeekly」
點擊「關注」訂閱我們的專欄吧
關于PaperWeekly
PaperWeekly 是一個推薦、解讀、討論、報道人工智能前沿論文成果的學術平臺。如果你研究或從事 AI 領域,歡迎在公眾號后臺點擊「交流群」,小助手將把你帶入 PaperWeekly 的交流群里。
總結
以上是生活随笔為你收集整理的将“softmax+交叉熵”推广到多标签分类问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我国中科大团队在量子网络领域取得重要进展
- 下一篇: 装帧纪念币是什么意思