领域知识在数据分析和建模中的作用

这半年做了几个不同的项目:对抗攻击,图片检索,医疗事件预测,碰了一头包。在复盘的时候发现,尽管是完全不同的问题,不同算法,不同的难度,但主要问题都在不了解领域知识,对整体没有概念,导致从目标到方法都不对,结果再努力也没用。

在一开始做的时候,一般都会找一些解决类似问题的教程、论文、相应的代码,代入数据做个简单版本出来,它的效果往往不是太好;然后开始在此基础上微调;当微调也无法大幅提高准确率时,再找论文尝试其它方法。这么做看似没什么问题。

换个角度看,这完全是程序员调库的思维,不是模型与领域结合的思维。合作的领域专家提供专业知识,产品经理负责产品设计,数据工程师负责数据范围,模型工程师负责建模调优,这对着呢!?要是每人只管自己那一小块,谁对整体负责?可能整个方案就是不可能实现的。 做产品,无论是两个人合作,还是很多人合作,总得有人主导。尤其是处于摸索阶段,其中某个人拥有的知识越多,就越有话语权。不由想起《肖申克的救赎》。

做服务,比如协助专家做论文研究的数据分析和处理,很多工程师,不愿意去了解业务,觉得那不是他的工作内容,结果就是指哪儿你打哪儿,工作只针对细枝末节,做到最好也不过就是满足别人的需求,更多时候也弄不懂到底应该是啥样,改来改去,越改越烦;不了解原理,也很难提出自己的见解。合作的领域专家能力强,思路清晰还好,如果他也没有太多经验,到后面大家都越做越难受。

当然,领域经验也不是那么容易获得的,比如医学、金融,那些领域的知识都需要大学的专业学习,再加多年工作积累才能得到,短时间不一定能学会。但是建模一般也针对具体问题,很少一开始就建立一个大而全,能解决该领域所有问题的模型。而建立小范围的领域知识并不像想象中那么困难。

都说“数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限”。我觉得知识结构也很重要,它让你能够定义问题,选择和判断哪些问题是当前数据和技术可以解决的。这需要既熟悉模型算法又熟悉领域。看论文,与专家沟通,上网查资料得到的往往是知识碎片,虽好过完全不懂,但是管中窥豹,难以透彻理解,遇到问题很容易被“卡”住。

再来细数这半年我踩过的坑,在做对抗攻击时,前期并没查太多资料,除了简单的需求描述和示例,不太知清楚在这个问题中成功的攻击包含哪些方法;也没仔细研究别人推荐的所有方法,想当然使用最流行的BERT系、GTP系算法,尝试强化学习、GAN……然后就走偏了。后来复盘别人的方法觉得技术性并不太强,可效果就是好,比如在简单的自然语言分类问题中,FastText比复杂模型快百倍,使用训练好的中文词向量可以很大程度上简化工具。我的失误看似偶然:我只是没往那儿想,实则必然——一开始并没花太多心意做预研。并不是武器越先进,效果就越好,还得看具体问题。

到了做图片搜索的时候就长了记性,尽量收集相关的资料,看了很多论文,也在做的过程中尝试了很多方法:YOLO系列,RNN系列。面对没有类似解决方案的复杂问题,多模型结合时总差那么一点:架子能搭起来,但是遇到细节问题就经常被卡住。这可能就是调包侠与根据论文编码的数据工程师的差异,在原理和代码之外,还需要它们背后的知识结构和经验。复盘的时候,觉得自己对深度学习算法还是一知半解,不够熟悉,后来完整地看完了吴恩达老师深度学习的所有教程,做完了习题,在不调库手动实现了很多底层功能之后,发现之前确实“三脚猫”。论文很前沿,但终归只是一些点,还是需要一层一层把基础知识构建起来,后面再把这些点加进来,连起来。

再后来做医疗事件预测,就开始读医学书籍,从科普到某一个专门领域的。逐渐对眼前做的事情从整体看处于什么位置,以及能做什么有了点感觉,从一个点出现往周围看和从整体的角度看这个点,还是有很大不同。在算法方面,开始看一些综述性长论文。深度学习这两年发展迅速,很多新方法在书里确实找不到。综述性的长论文是很好的选择,常常发表在会刊上。一般的论文正文十页左右,综述性论文一般四五十页,参考文献上百篇。作者通常先介绍前因后果,然后分门别类地细数该领域最精典和流行的方法,各个方法针对的不同问题,方法之间的对比和联系,并提供相关论文的链接、有的还提供示例代码和数据。可样可以先建立框架,然后针对重点地发散出去。

总之,对算法和对领域的深耕一个也不能少,找对方法可能比努力本身更重要。