2019上半年跌跌撞撞地搞了很多乱七八糟的东西但都没work,尤其让我酸的是我上半年没做work的一个VQA的idea居然在同年ICCV看到一篇极其相似的文章,虽然对方取巧用了BERT硬是提了一点才中的,但真的没产出的时候看着别人发paper太酸了。话虽如此,取巧用idea以外的trick发paper还是不值得学习的。同年下半年,受含老师的影响(要求),我去看了很久的《The Book of Why》来寻找灵感,最后到了临近CVPR deadline,还是回归了自己的老本行场景图生成,投稿了一篇《Unbiased Scene Graph Generation from Biased Training》,并幸运的以(SA,SA,WA)的分数中了今年的CVPR 2020。结合我之前对SGG领域的了解,我认为目前SGG领域内关于不同message passing模型设计带来的提升已经趋于饱和,且这个研究方向目前来看已经愈发没有意义,因为由于自然存在以及数据标注中的bias和长尾效应(long-tail effect), 所谓的模型优化已经渐渐变成了更好的拟合数据集的bias,而非提取真正有意义的relationships。 在此基础上,我在该工作中主要做了如下两件事:1)延续我去年在VCTree(CVPR 2019)中提出的mean Recall@K,设计了一个unbias的inference算法(注意不是training方法哦~),并希望让更多的人关注真正有意义的SGG,而不是去拟合数据集刷指标;2)由于之前通用的SGG框架neural-motifs已经落后于时代,我设计了个新的代码框架(已于Github开源)。不仅结合了最新的maskrnn-benchmark用于底层物体检测,同时集成了目前最全的metrics包括Recall,Mean Recall,No Graph Constraint Recall, Zero Shot Recall等,同时代码中为各种指标的evaluation统一了接口,希望后续有更多的研究者们可以设计出更有价值的metrics,从而使SGG领域不至于再只关注一个biased指标Recall而沦为灌水圣地。
No Graph Constraint Recall@K (ngR@K):这个指标最早由Pixel2Graph使用,由Neural-MOTIFS命名。这个指标的目的在于,传统的Recall计算里,一对物体只能有一个relation参与最终的排序,但ngR@K允许一对物体的所有relation都能参与排序。这也非常有道理,比如 human(0.9) - riding (0.6) - horse (0.9):total score=0.9x0.6x0.9,可能这对物体还有另一个relation:human(0.9) - on (0.3) - horse (0.9):total score=0.9x0.3x0.9。后者虽然分数比riding低,但也是一种可能的情况。ngR@K的结果往往大大高于单纯的R@K。
Mean Recall@K (mR@K):这个指标由我的VCTree和另外一个同学的KERN在2019年的CVPR中同时提出,不过我并没有作为VCTree的主要贡献,只在补充材料中完整展示了结果表。由于VisualGenome数据集的长尾效应,传统Recall往往只要学会几个主要的relation类比如on,near等,即便完全忽视大部分类别也可以取得很好的结果。这当然不是我们想看到的,所以mean Recall做了一件很简单的事,把所有谓语类别的Recall单独计算,然后求均值,这样所有类别就一样重要了。模型的驱动也从学会尽可能多个relation(有大量简单relation的重复)变成学会尽可能多种类的relation。
Zero Shot Recall@K (zR@K):在早期的视觉关系识别中,人们也使用了Zero Shot Recall指标,但在SGG中又渐渐被人忽视了,我们在这又重新增加了这个指标,因为它可以很好的展示SGG的拓展能力。Zero Shot Recall指的并不是从来没见过的relation,而只是在training中没见过的主语-谓语-宾语的三元组组合,所有单独的object和relation类别还是都见过的,不然就没法学了。
其实在我接触SGG以来最大的困惑不是SGG做的不好,而是现在的SGG如果单看Recall明明已经非常好了,但为什么仍没有得到广泛的应用。换句话说,SGG画的饼这么香为什么没人吃,虽然也有一些下游任务中有人利用SGG发了paper,但都没有成为主流。我的想法是relationship是一个非常主观且很依赖语境的标签,这不同于简单的物体分类和识别,在后者中对就是对错就是错。而我的理解里单纯的deep learning的本质是memorize所有数据集,并做一些简单的归纳汇总(一定程度的generalize),这是一个非常passive的过程,所以在简单的分类识别等passive的任务上效果最为显著。 比作人类的话,这可以看作人下意识情况下做的一些工作(我们从来不知道自己是怎么识别出苹果的,识别的时候纯粹是下意识反应,也不会去思考为什么是苹果)。最新的NLP中的研究也发现,进入Transformer时代后,很多简单的问答,机器已经可以做的非常拟人了。但如果稍微在问题中加入一个简单的1+1之类的需要思考的过程,模型瞬间给出很多滑稽的结果。所以现在的deep learning学出来的模型,更像一个被动的只靠直觉驱使的人。而SGG和任何需要Reasoning的任务比如VQA,都更加主动和主观。比如SGG中到底是(human, on, horse)还是(human, riding, horse),取决于语境是关注“what's on horse?(空间关系)”还是“what is the man doing?(具体动作)”,不能简单地说谁对谁做(如果直接归为多类别问题的话,又会因为同义词太多而无法得到足够好的标注)。我不认为现在的大部分推理(Reasoning)的文章,真正做到了推理(虽然我们组就是做这个的),加了很多attention也只是更好的拟合了数据集而已。因为给定同一份输入,一个确定的网络(假设不包含随机sample等操作)永远只会得到一个结果,是一个passive的反馈。 而我们最新的CVPR 2020的文章“Unbiased Scene Graph Generation from Biased Training”就尝试通过对因果图的干预,使同一份输入,同一个网络,得到不同的输出,用于不同的目的。类似于人对于同一个问题,可以在脑海里思考各种可能选择,做出权衡。我觉得这可能是未来真正解决Reasoning的一个可能方向,用一个deep model拟合对世界的认知(知识),但真正的推理在于对这些知识的应用和分析,即对模型中各个节点进行不同的干预后的观察。当然这种干预用什么去驱使,RL?Sample?还有待考虑(这怕不是要靠意识本身)。 扯远了,回到SGG中。虽然我们还是无法解决用什么标准去评价一个更主观更有意义的SGG,但肯定不是目前最主流的Recall@K,在这种指标下即便模型只学出了on/near/wear/has等少数几种relationship,模型的Recall@K依然非常高,这种场景图对下游reasoning任务的帮助非常有限,简单的来说没有引入足够多的信息量,那么一个最简单的办法,就是让relationship尽可能地diverse,学到尽可能多种类的relationship就有更多信息量了。所以去年CVPR 2019,我在VCTree这篇文章里提了个mean Recall的指标用于评价一个无偏见的场景图,上文也作了介绍。