来源:深度学习爱好者
本文约3300字,建议阅读10分钟 本文介绍了作者这些年遇到的一些机器学习里的bias的一些处理方法。
机器学习的bias对性能影响很大,常常会使一个线下优秀的模型线上落不了地,或者闹出新闻里的笑话。在机器学习竞赛或数据集里,很多时候对bias的处理在test上带来的提升可能比模型提升还要多。以下写写我这些年遇到的一些机器学习里的bias的一些处理方法。
Santander Product Recommendation
https://www.kaggle.com/c/santander-product-recommendation/
关键词:Less is More
这个数据集提供银行用户2015年1月到2016年5月的产品购买数据,要求预测用户2016年6月购买什么产品。按照通常的观点,训练数据都是多多益善的。但是BreakfastPirate 在 When Less is More 里提出,因为每年6月份是银行的结算日,此时的用户行为和平时不一样的。只使用2015年6月一个月的数据,效果要比使用17个月的数据效果要好。
这个例子说明当train 和test 存在bias的时候 ,只使用train里那部分和test相似的数据可能效果更好。
Freesound Audio Tagging 2019
https://www.kaggle.com/c/freesound-audio-tagging-2019
关键词:warm up
训练集是由4970个人工标注的curated音频片段和19815个机器标注的noisy音频片段组成,而test和人工标注的的训练集同源,但是如果只用4970个数据显然太少了,但深度学习的好处就是可以迁移学习,所以可以用noisy数据做warm up训练,最后再用curated数据在warm up后的预训练模型上继续训练。在lwlrap这个metric可以比只用curated训练提升一个百分点。
这个例子说明深度学习通过warm up,迁移学习可以一定程度利用那些和test存在bias的数据
树模型也有类似利用存在bias数据的技巧,见嫁接学习:
https://zhuanlan.zhihu.com/p/98728768
Toxic Comment Classification Challenge
https://www.kaggle.com/c/jigsaw-toxic-comment-classification-challenge
关键词:pseudo label
这个数据由于发生了test泄露,因此中途增加了后续标注的新test数据。由于数据的数据源和标注的人不一样,所以旧的train数据和新的test存在bias。一个解决方法就是用train训练的模型给新test打标签,然后把置信度高的test加入train里训练。AUC从0.9880 提升到了 0.9885。
无论数据是否有bias,一般pseudo label都能涨分,但在训练集和测试机分布不完全一致的时候,将test通pseudo label过加入训练,效果会更加显著。
Bengali.AI Handwritten Grapheme Classification
https://www.kaggle.com/c/bengaliai-cv19/
关键词:CycleGan
这个数据任务多任务分类,需要对每一个手写字符分别对grapheme root (共168类)、vowel diacritics (共11类)、consonant diacritics (共7类)进行分类, 但是数据制作者故意在分类的时候产生bias,本来label应该有168×11×7共12936种组合,但是训练集只提供其中的一部分label组合样本,这就导致训练的模型会认为剩下的组合不存在而预测不出来,而test里实际上是有的。在冠军solution Cyclegan Based Zero Shot Learning 里,使用CycleGan把12936种组合对应的样本全部生成了出来,将这些GAN生成的样本用于训练,就可以把原本train里unseen的数据给预测出来了。
Twitter RecSys Challenge 2020
https://recsys-twitter.com/
关键词:adversarial validation
这是一个关于推特推荐的比赛, 在官方的赛后总结 What Twitter learned from the Recsys 2020 Challenge 可以看到,由于train和test是按照time split的,存在一定的不同,第一名Nvidia 团队使用adversarial validation 选择更具通用性的特征来防止过度拟合。即通过将训练集和测试集分别打上不同的标签然后进行训练,通过输出的特征重要性筛选特征。
类似的技巧也可见于 LANL Earthquake Prediction ,这里1st place solution 使用KS统计筛选相似的特征提高泛化能力。
adversarial validation 不仅可用于筛选特征,也可以筛选样本。通过分类器得到和test最相近的样本用于训练和验证。当我们无法直接通过业务经验或者出题者的数据说明知道train里哪些样本和test分布相似,就可以用adversarial validation.
Sberbank Russian Housing Market
https://www.kaggle.com/c/sberbank-russian-housing-market
关键词: magic number
这个题用2011年8月到2015年6月的莫斯科房价数据来预测 2015年7月到2016年5月的房价,而由于众所周知的原因,货币卢布在那几年发生了通货膨胀,导致test的房价数据要高于train的数据,因此所有的方案都在模型结果后处理乘了一个放大系数,在test上可以带来显著的提升,大家称之为magic number。虽然这种人工后处理的方式很不机器学习。但这就是real world. 最后出题方 Sberbank 的 Data Science Lead 也在Question to admins about rules 认可了这种后处理方法。
事实上,后处理也在大量的由时间导致的bias类数据被使用。除了乘系数,还有在分类里调阈值等等。
后处理或人工规则遇到外行评审
关键词: outlier
因为机器学习不能完全解决bias,所以上一段提到乘系数,调阈值,或者人工规则在内行人里是被认可的,但如果遇到外行评审,他会认为你不是用机器学习,从而否定你的方案。这时候可能就要包装自己方案,比如直接乘一个放大系数不行,那我们就可以把train里面一些label偏低的样本作为outlier舍弃掉或降低weight,一样能起到放大模型输出的效果,这样就能忽悠评审了。其他规则方法也可以用类似调整train样本方法来把规则手法掩盖起来。
iMet Collection 2019 - FGVC6
https://www.kaggle.com/c/imet-2019-fgvc6
关键词: 把test放到train里训练
知乎经常看到有人说某些论文就是靠把test放到train里训练来达到SOTA的,这个也发生在kaggle竞赛里。在这个数据里是对博物馆的文物图片进行分类,由于比赛的形式是提交训练完的模型在线上做inference,所以出题者也没想到有人能作弊,但是俄罗斯x5公司的几个参赛者硬是通过爬虫爬取博物馆网站以及谷歌识图把部分test图片给标注了,然后把这些标注的test数据用于训练模型,把模型交上去用于欺骗组织者。由于这只是个CVPR的workshop,没人上心,只检查他们的model inference结果,居然就让他们骗了过去.
PetFinder.my Adoption Prediction
https://www.kaggle.com/c/petfinder-adoption-prediction
关键词: hashed ID
后来这帮人看没受到惩罚,变本加厉,在多模态数据竞赛PetFinder.my Adoption Prediction 里又一次去爬数据,可能由于这次是多模态数据而不是图像,含有宠物猫狗的表格信息,文字,图像,比较复杂,想把爬出的数据做成和train一样格式丢进去训练不方便.作弊者于是将这些数据和label进行编码,混淆hash到一个ID字段中,并该ID字段伪装成来自外部"cute-cats-and-dogs-from-pixabaycom" dataset,在处理数据时,对这些哈希ID进行解码,并匹配test的样本得到label.万万没想到,这个比赛的出题公司想把获胜方案部署上线,于是检查代码的时候发现了作弊情况.最后作弊者被永封,并丢掉了H20.ai的工作。
虽然最后这两个例子里的数据和bias无关,但是显然这个"技巧"显然可以解决bias,定向过拟合test。
小结
上面所有的归纳到一起就是,虽然机器模型变得越来越复杂,不能像过去那样对LR模型那样直接修改权重去拟合test的bias,但是对ai这个黑盒子,我们还是可以:
1.有选择的控制黑盒子的输入,根据test bias的分布,我们想得到什么,我们就输入什么,毕竟现在的模型记忆力很强。
2.有选择的修改黑盒子的输出,根据test bias的分布,我们想得到什么,我们就修改什么,然后封装起来好像就是模型输出的一样。
小结2
有人说,随着ai技术的成长,数据的增加,就可以逐步解决bias,我认为ai方法只要还是基于数据训练那一套,bias就永远不可能消除。
从上面举得例子我们可以看到,机器学习的bias方向完全是可以人为控制的,比方说:用虎扑步行街的语料训练出来的模型肯定和豆瓣小组训练出来的不一样;复杂的模型背后可能藏着无数条规则,当满足某种条件下就会输出人为指定的结果,就像前面提到作弊者直接hash id指定test label一样,不怀好意的人也可以把自己的目的藏在复杂的系统里。
我们平时遇到的搜索和推荐结果背后也充满了资本的力量带来的bias,商品搜索推荐给用户的不一定是最适合用户的,而是能给资本带来最大效益的,信息搜索推荐带来的也不一定是读者想看到的,而是资本想让读者看到的,想引导读者思考的。最典型的就是Google 真的在美国帮希拉里屏蔽不利信息吗? 这个例子了,什么信息茧房简直就是笑话,只有资本给你搭的茧房。
机器学习有bias不可怕,可怕的使用者心中有bias。
试想一下,有一天35岁勤勤恳恳工作的打工人被HR用AI模型裁掉了,而导致AI更容易预测大龄打工人创效低的原因是35岁以上当偷奸耍滑老白兔的统计学几率比刚毕业的小白兔大。而更可怕的是老板和HR故意在模型训练增加了35岁打工人的负面样本和权重来确保达到自己的目的.然后把这个结果全部推脱给AI,而打工人只能看到输出的结果却看不到模型的细节。
那有人说说不允许把年龄作为输入条件加入模型里不就行了吗?答:并没用。大数据时代,很多数据暗含用户年龄信息,比如手机上安装的app(参看2020 腾讯广告算法大赛)。
由于AI存在种种的bias会被滥用情况,所以我认为一方面AI的使用必须透明,另一方面应该限制被随意使用在人身上,及和人交互上。我们要警惕和反对亚马逊利用算法自动解雇无效率的仓库工人,上海某小学通过 AI 图像识别学生上课开小差并对学生进行评分这种AI落地。
代码语言:javascript复制—END—
编辑:王菁校对:林亦霖