【云音乐】从手游APP到云音乐视频标签分类,时隔3个月再次面对多标签任务,终于摸索出了一些小经验。附自定义评估函数代码
【云音樂】從手游APP到云音樂視頻標簽分類,時隔3個月再次面對多標簽任務,終于摸索出了一些小經驗。
- 前言
- 一個好用的評估函數
- 常用的多標簽任務評估函數
- 我選擇平均準確率
- 合理的特征處理和模型
- 特征處理
- 合理的模型
- 如何面對熱門標簽對冷門標簽的壓制
- 總結
前言
之前在個推實習的時候,接到了對手游app的多標簽分類任務,當初應該是10+個一級標簽,20+個二級標簽,兩者之間是層次關系,當初還是懵懵懂懂只知道把所有爬下來的特征(文本、icon、包大小等)提取特征之后一股腦的拼接在一起然后隨便疊幾個dense層就sigmoid輸出了。效果也一直不理想,對于結果的觀察除了用tf自帶的acc評估函數,就是人工加規則,做的非常苦惱。
最近在網易云實習,由于運維給mlog的打標并不標準,為了給mlog和user進行打散,所以需要做一個mlog多標簽分類模型,對80w個mlog進行預測,共有666個標簽。雖有都有現成的特征,但這次吸取了上次的經驗,整個流程下來明顯順暢了很多,因此在這里想把自己的經驗分享給大家。(代碼和數據恕不能公開)
一個好用的評估函數
一個準確好用的多標簽分類評估函數,直接決定了你優化模型的方向,也是你的指路明燈,之前一直用的acc,這明顯沒有考慮到標簽不平衡的問題,這次任務中最多的標簽覆蓋率達到萬,最少卻只有幾百。因此存在正負樣本不平衡的情況。
解決方法:
常用的多標簽任務評估函數
關于評估函數的詳細介紹和更多其他評估指標可參考B站視頻:多標簽分類的評價指標(一)
我選擇平均準確率
選擇平均準確率這一評估指標的理由:
1. 該評估指標同時關注了正樣本和負樣本,考慮到了全局標簽的可能性。
2. 相比于排序損失,其實現邏輯更加簡明,自己實現起來比較友好。
3. 相比于漢明損失,由于閾值不好界定,人工選擇閾值對評估函數有較大影響。
實現代碼:
@tf.function def average_acc(y_true,y_pred):sum_ = tf.reduce_sum(y_true,-1) + 1e-8index = tf.argsort(-y_pred)rank = tf.argsort(index) +1c = tf.where(y_true==1,y_pred,0)index2 = tf.argsort(-c)rank2 = tf.argsort(index2) +1ax = tf.cast(tf.reduce_sum(tf.where(y_true==1,rank2/rank,0),-1),tf.float32)return tf.reduce_mean(ax/sum_)合理的特征處理和模型
特征處理
合理的模型
分域學習特征再concat!!!這樣做比直接concat后接dense會有不錯的提升!我們希望模型能對各個域的特征單獨進行抽象和學習充分后再將這些特征拼接在一起。這符合模型學習的邏輯。最簡單的具體做法:將來自同一個域的維度特征單獨接dense層進行抽象,之后將所有域的dense層結果憑借,再接dense層進行特征的交叉學習。這一方法可以根據自己的特征進行多樣的變化,如何抽象同一個域的特征有很多方法。
模型1:
使用特征:—
特征處理:特征直接concat
模型分數:0.7371
模型2:
使用特征:—
特征處理:特征分別抽象后concat
模型分數:0.7583
請使用focal loss 或 冪次懲罰,這能給多標簽任務帶來不錯的提升。具體實現可以參考我之前的博客。
如何面對熱門標簽對冷門標簽的壓制
(也嘗試過直接在模型訓練過程中乘上該權重,讓模型適應該權重,也有不錯的效果。)
總結
最后可以根據業務需求對標簽做一些剔除與合并。
我們通過最后得到的mlog多標簽結果,去計算用戶的標簽偏好,將這兩者的新特征加入到雙塔模型中進行嘗試,模型效果有不錯的提升。
總結
以上是生活随笔為你收集整理的【云音乐】从手游APP到云音乐视频标签分类,时隔3个月再次面对多标签任务,终于摸索出了一些小经验。附自定义评估函数代码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信息抽取(二)花了一个星期走了无数条弯路
- 下一篇: 信息抽取(三)三元关系抽取——改良后的层