学习范式

多任务学习(multi-task learning)

/ MUL-tee-task LER-ning /

一名同时修解剖学、生理学和药理学的医学生,往往对每一门都理解得更透,胜过把它们孤立地死记硬背,因为这些科目彼此印证、相互加固。多任务学习把这个想法搬给了机器:你不必为每件活儿各训一个模型,而是训练同一个模型一口气干几件相关的活儿,让它们共享所学。

具体说,模型有一个公共内核——共享的层,用来对输入建立通用的理解——其上再分出若干个「头」,每个任务一个。训练时它同时从所有任务里学,于是那个共享内核会被每项任务的数据同时塑造。从一张共享的图像表示里同时预测一张脸的年龄、性别和情绪,就是教科书式的例子。共享的那部分像是一种自带的正则化:在多项任务上都有用的特征,往往才是真正有意义的,这能减轻过拟合,把有限数据的价值榨得更足。

当任务彼此相关、而任一单项的带标签数据又稀缺时,它最为出彩——这些任务实际上在互相借例子。但它并非没有代价。如果任务们各拉各的方向,它们就会相互干扰,结果谁都受损(即「负迁移」);而怎样在合并的损失里平衡各任务的权重,也颇为琐碎难调。一堆互不相关的任务,通常还是拆成各自独立的模型更好。

一套自动驾驶系统用一个共享的视觉主干,同时喂给三个头:检测其他车辆、找出车道线、估计距离。因为这三件事都依赖于读懂路面场景,把它们放在一起学,会让那个共享主干比任何单一任务训出来的都更敏锐,运行起来也比三个独立网络更快。

一个共享内核,几个任务头——相关的活儿彼此加固。

只有当任务真正共享结构时,多任务学习才有帮助。硬把不相关的任务凑一起,它们就会为争夺共享权重而内耗——结果每个都比单独训练更差。

又称
MTLjoint learning多任务学习多任務學習