宝塔服务器面板,一键全能部署及管理,送你10850元礼包,点我领取

【云音乐】从手游APP到云音乐视频标签分类,时隔3个月再次面对多标签任务,终于摸索出了一些小经验。

  • 前言
  • 一个好用的评估函数
    • 常用的多标签任务评估函数
    • 我选择平均准确率
  • 合理的特征处理和模型
    • 特征处理
    • 合理的模型
  • 如何面对热门标签对冷门标签的压制
  • 总结

前言

之前在个推实习的时候,接到了对手游app的多标签分类任务,当初应该是10+个一级标签,20+个二级标签,两者之间是层次关系,当初还是懵懵懂懂只知道把所有爬下来的特征(文本、icon、包大小等)提取特征之后一股脑的拼接在一起然后随便叠几个dense层就sigmoid输出了。效果也一直不理想,对于结果的观察除了用tf自带的acc评估函数,就是人工加规则,做的非常苦恼。

最近在网易云实习,由于运维给mlog的打标并不标准,为了给mlog和user进行打散,所以需要做一个mlog多标签分类模型,对80w个mlog进行预测,共有666个标签。虽有都有现成的特征,但这次吸取了上次的经验,整个流程下来明显顺畅了很多,因此在这里想把自己的经验分享给大家。(代码和数据恕不能公开)


一个好用的评估函数

一个准确好用的多标签分类评估函数,直接决定了你优化模型的方向,也是你的指路明灯,之前一直用的acc,这明显没有考虑到标签不平衡的问题,这次任务中最多的标签覆盖率达到万,最少却只有几百。因此存在正负样本不平衡的情况。

解决方法:

  1. 单独观察每一个标签的召回、精准、F1值,方便了解模型对哪些标签表现较差,方便人工调整。
  2. 自定义评估函数,对于标签种类繁多,显然第一种方法不太现实,我们需要一个明确的指标来代表模型的优良性

常用的多标签任务评估函数

【云音乐】从手游APP到云音乐视频标签分类,时隔3个月再次面对多标签任务,终于摸索出了一些小经验。附自定义评估函数代码-风君子博客
【云音乐】从手游APP到云音乐视频标签分类,时隔3个月再次面对多标签任务,终于摸索出了一些小经验。附自定义评估函数代码-风君子博客
【云音乐】从手游APP到云音乐视频标签分类,时隔3个月再次面对多标签任务,终于摸索出了一些小经验。附自定义评估函数代码-风君子博客

关于评估函数的详细介绍和更多其他评估指标可参考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_)

合理的特征处理和模型

特征处理

  1. 直觉的思考来说,如果我们手上有embedding特征,并且有几个离散的特征,直接将离散特征与embedding concat后丢给模型,这是不合理的,特别是当这几个离散特征很重要的时候,因为特征不来自同一分布或意义,直接concat相当于将这一信息抹去了。
  2. 参考解决方法,将类别特征和离散特征都人工转为类别特征,之后都各自建立embedding,embedding维度不用太高,之后再作拼接会更合理,将强特征embedding后,可以让他表达更多的信息。

合理的模型

  1. 分域学习特征再concat!!!这样做比直接concat后接dense会有不错的提升!我们希望模型能对各个域的特征单独进行抽象和学习充分后再将这些特征拼接在一起。这符合模型学习的逻辑。最简单的具体做法:将来自同一个域的维度特征单独接dense层进行抽象,之后将所有域的dense层结果凭借,再接dense层进行特征的交叉学习。这一方法可以根据自己的特征进行多样的变化,如何抽象同一个域的特征有很多方法。
    【云音乐】从手游APP到云音乐视频标签分类,时隔3个月再次面对多标签任务,终于摸索出了一些小经验。附自定义评估函数代码-风君子博客
    模型1:
    使用特征:—
    特征处理:特征直接concat
    模型分数:0.7371
    模型2:
    使用特征:—
    特征处理:特征分别抽象后concat
    模型分数:0.7583

  2. 请使用focal loss 或 幂次惩罚,这能给多标签任务带来不错的提升。具体实现可以参考我之前的博客。


如何面对热门标签对冷门标签的压制

  1. 尽管使用了一些解决类别不平衡的方法,但模型最后的推理让趋向于给那些出现频次较高的标签更大的概率值,这导致最后我们得到的mlog之前的区分度较低,这显然不利于打散。
  2. 最后我们通过计算各个标签的IDF值,在模型最后输出的各个标签的结果上乘上对应的IDF值。得到了较为满意的结果,通过人工抽样分析,发现一些比较冷门的标签的位次有所上浮,这一定程度上保证了mlog之前的区分度以及标签的多样性。

(也尝试过直接在模型训练过程中乘上该权重,让模型适应该权重,也有不错的效果。)


总结

最后可以根据业务需求对标签做一些剔除与合并。
我们通过最后得到的mlog多标签结果,去计算用户的标签偏好,将这两者的新特征加入到双塔模型中进行尝试,模型效果有不错的提升。