美文网首页
我要打十个:多任务学习模型MMoE解读

我要打十个:多任务学习模型MMoE解读

作者: 金色暗影 | 来源:发表于2020-11-25 21:46 被阅读0次
    打遍镇内无敌手的传说不良少女

    今天要介绍的是一个多任务学习模型MMoE,如果第一次接触此类模型或是没有相关的研究背景的话,其实容易不太容易理解这种多任务学习的价值所在。
    一般来说,大部分人见过更多的都是单任务的模型,即一个模型完成一个任务。如果需要完成多个任务的话,则可以针对每个任务单独训练一个模型,像这样:

    单任务学习
    似乎完全没有要将多个任务混在一起训练的必要,因为这样极有可能导致参数相互干扰而差于单独训练的效果。

    确实,大多数的场景确实没有多任务学习的必要,但是如果你做过推荐系统,就会发现在想要达成某些目标的时候,非得多任务一起上不可。就拿给用户推荐视频为例,我们既希望提高用户的点击率,同时也希望提高视频的播放时长,视频点赞、转发等等... 这些目标的达成并非是简单的相辅相成,更多的可能是相互竞争的关系。要是我们只让模型学习点击率,那么经过训练的模型推荐结果很可能导致标题党和封面党大行其道,真正的好的视频却被雪藏了,这显然不是我们希望看到的。而如果一味的追求高点赞,也可能就忽略了一些相对冷门的或新的佳作。这种对立,对于某些互联网巨头的黄赌毒APP来说尤为严重,那种也许你看起来特别带劲的视频,因为都懂的原因很有可能并不适合转发...因此,我们无法追求某个单一目标的达成,而需要同时优化这些有利于产品良性循环的任务目标,让它们相互平衡,从而提升用户体验,带来和留住更多的用户。

    Shared Bottom

    说起多任务学习,最为常规的思路就是共享底部最抽象的表示层,然后在上层分化出不同的任务:


    Shared Bottom

    这实际跟迁移学习有点类似,在图像领域甚是常见,因为图像识别的底层特征往往代表一些像素纹理之类的抽象特征,而跟具体的任务不是特别相关,因此这种低冲突的表示层共享是比较容易出效果的,并且可以减少多任务的计算量。


    猫狗识别 猫狗识别共享底层

    比如说我们可以很轻松的合并一个识别猫的任务和一个识别狗的任务,因为这两个任务所需要学习的表示很相似,因此同时学好这两个任务是可能的。 但是对于差别比较大的任务来说,比如你用这种简单的共享底层表示的方式将一个识别车子的任务和一个识别狗的任务合到一起,模型瞬间就懵逼了...


    狗识别与车识别

    其实从直觉上,我们就能感觉识别车和识别狗的任务相对猫狗的识别任务差异打了很多,因此Shared Bottom 的方式就不那么work了。
    论文的作者针对这个任务的相似程度和效果做了个实验,得出的结论如图所示:(correlation代表相关程度,越接近1越相关)


    任务相关性shared bottom方式的训练效果
    他的实验正验证了我们的直觉,任务越相关,这种方式训练效果越好,若是不太相关的任务,效果就有些差强人意了。
    于是这对不那么相关任务的multi task学习提出了更高的挑战。

    MMoE

    为了进行不相关任务的多任务学习,很多人做了很多工作都见效甚微,然后后来就有了Google的这个相当新颖的模型MMoE。


    MMoE网络结构

    它的脑洞大开之处在于跳出了Shared Bottom那种将整个隐藏层一股脑的共享的思维定式,而是将共享层有意识的(按照数据领域之类的)划分成了多个Expert,并引入了gate机制,得以个性化组合使用共享层。

    观察一下上面Shared Bottom的模型结构图和MMoE的图,不难发现,MMoE实际上就是把Shared Bottom层替换成了一个双Gate的MoE层:


    Shared Bottom to MoE

    我们先来看一下原始的Shared Bottom的方式,假设input为x共享的底层网络为f(x), 然后将其输出喂到各任务独立输出层h^k(x),其中k 表示第k 个任务的独立输出单元,那么,第k个任务的输出y^k即可表示为:
    y^k = h^k(f(x))
    而MoE共享层将这个大的Shared Bottom网络拆分成了多个小的Expert网络(如图所示,拆成了三个,并且保持参数个数不变,显然分成多少个Expert、每个多少参数,都是可以根据实际情况自己设定的)。我们把第i个Expert网络的运算记为f_i(x),然后Gate操作记为g(x),他是一个n元的softmax值(n是Expert的个数,有几个Expert,就有几元),之后就是常见的每个Expert输出的加权求和,假设MoE的输出为y,那么可以表示为:
    y = \sum_{i=1}^n g(x)_if_i(x)
    如果只是这样的话,要完成多任务还得像Shared Bottom那样再外接不同的输出层,这样一搞似乎这个MoE层对多任务来说就没什么卵用了,因为它无法根据不同的任务来调整各个Expert的组合权重。所以论文的作者搞了多个Gate,每个任务使用自己独立的Gate,这样便从根源上,实现了网络参数会因为输入以及任务的不同都产生影响。
    于是,我们将上面MoE输出稍微改一下,用g^k(x)表示第k个任务的们就得到了MMoE的输出表达:
    y^k = \sum_{i=1}^ng^k(x)_if_i(x)

    emm...网络结构应该很已经清晰了,当然你也许会比较疑惑gate和Expert到底具体怎么做的,论文也没太说明清楚,然后去看了下相应的代码实现,发现跟我想的完全一样....就是两个非常简单的操作:

    • Gate
      把输入通过一个线性变换映射到nums_expert维,再算个softmax得到每个Expert的权重
    • Expert
      简单的基层全连接网络,relu激活,每个Expert独立权重

    至于最后到底要怎么连接,要不要跟论文里一样,这些都是个性化自己调整的东西,随自己整就好了。至于损失怎么算,就是几个任务加权求和就可以了。(暂时没看到有什么更加新颖的方法)

    最后我们看一下作者拿MMoE和其他多任务模型做的一个对比:


    多任务模型训练效果对比

    作者的意思已经再明显不过了,分明就是在说:在座的各位都是垃圾,我要打十个!你们所有的任务都给我一起上吧!!!

    总结

    总而言之呢,这篇论文给我们提供了一种不需要人为参与的非常高效且有用的多任务学习方式,将人们从人为度量数据或是任务之差异的无解工作上解脱出来,为推荐系统的多目标任务实现提供了吊打从前的强有力的工具。

    参考

    Modeling Task Relationships in Multi-task Learning with Multi-gate Mixture-of-Experts
    Modeling Task Relationships in Multi-task Learning with Multi-gate Mixture-of-Experts

    相关文章

      网友评论

          本文标题:我要打十个:多任务学习模型MMoE解读

          本文链接:https://www.haomeiwen.com/subject/hfywiktx.html