MMOE(Multi-gate Mixture-of-Experts)

1.前提和动机

随着推荐技术的发展,目前越来越多的推荐场景,往往并不是单独的优化一个指标,比如:

视频推荐领域:推荐排序任务不仅需要考虑到用户点击率、完播率,也需要考虑到一些满意度指标,例如:对视频是否喜欢,用户观看后对视频的评分;

文章推荐领域:不仅希望用户点击阅读文章,还希望用户有更多的停留时长,互动,关注。

电商推荐领域:不仅希望用户更多对商品点击浏览,还希望用户看完商品后进行付费,点击率和转化率

所以,推荐系统做到后期,往往会朝着多目标学习进行演化,承担更多的业务目标,提高用户粘性。而多目标排序大致上有4种解决方案:

1.改变样本权重进行多目标优化:这是一种比较初始化的方式。比如主目标是点击率,分享功能是我们希望提高的功能。那么点击和分享都是正样本,分享的样本可以设置更高的样本权重。模型训练在计算梯度更新参数时,梯度乘以权重,对样本权重大的样本给予更大权重。通过这种方法,使得原始目标A会受到一定的损失以换取新增加目标B的增长,实现初级的多目标优化。

-优点:模型简单,不需要额外架构支持,没有增加算法复杂度

-缺点:没有对多目标建模,而是将多个目标折算成一个,折算权重不好确定

2.多模型分数融合:就是多个模型分别预测每个目标,最后的预测分数加权融合

-优点:模型简单

-缺点:线上服务时间开销大,部署困难,需要多个模型预测结果组合,并且不同目标难以量化评估重要性,如果样本部分特征稀疏,有的模型不好单独学习,模型融合的这几个超参数也不好确定

3.排序学习:同构预测两两物品之间相对顺序或物品序列之间顺序解决多目标学习的问题。比如:视频推荐为例,用户观看很长的i视频,点击了j视频,那么觉得观看比点击重要,假设u代表用户的偏好,则u_i>u_j。有了相对顺序,就可以使用排序学习的方式,融合多个目标,不需要序列多个模型。

-优点:优化目标顺序,不需要设计复杂超参,本身是单个模型的多个目标,线上服务压力小

-缺点:相对顺序不好构造,样本数量增大,训练速度慢,样本不平衡会被放大,比如有的用户有10次点击,有的只有1次点击,10次的会有更多机会训练

4.多任务学习:这个才是目前最常用的技术,多任务学习,可以简单的理解是用一个网络同时完成多个任务的优化,有很多优势,比如多个任务共享一个模型,占用内存少,计算速度快,并且关联任务还可以通过共享信息,互相补充,提升彼此的表现。但是,同样面临很多挑战,比如不同任务究竟如何融合呢?万一多个目标不怎么相关怎么办?目标的重要性不同,这个在训练模型的时候如何体现等等。

以下是多任务学习的经典论文。

MMOE是2018年谷歌提出来的,现在依然是非常常用的模型范式,MMOE的全称是Multi-gate Mixture-of-Experts,对于这个优化任务,引入了多个专家进行不同的决策和组合,最终完成多目标的预测。解决的是硬共享里面如果多个任务相似性不是很强,底层的embedding学习反而相互影响,最终都学不好的痛点。

2.MMOE?hard-parameter sharing

再看MMOE之前,我们先了解下多任务里面的hard-parameter sharing.

推荐系统中,即使同一个场景,常常也不只有一个业务目标。在youtube的视频推荐中,推荐排序任务不仅需要考虑用户点击率,完播率,也需要考虑到一些满意度指标,例如,对视频是否喜欢,用户观看后对视频的评分;在淘宝的信息流商品推荐张,需要考虑到点击率也需要考虑转化率;而在一些内容场景中,需要考虑到点击和互动、关注、停留时长等指标。

模型中,如果采用一个网络同时完成多个任务,就可以把这样的网络模型称为多任务模型,这种模型能在不同任务之间学习共性以及差异性,能够提高建模的质量以及效率。常见的多任务模型的设计范式大致可以分为三大类:

--hard parameter sharing的方法:这是非常经典的一种方式,底层是共享的隐藏层,学习各个任务的共同模式,上层用一些特定的全连接学习特定任务模式

这种方法目前用的也有,比如美团的猜你喜欢,知乎推荐的ranking等,这种方法最大的优势是task越多,单任务更加不可能过拟合,即可以减少任务之间过拟合的风险。但是劣势也非常明显,就是底层强制的shared layers难以学习到适用于所有任务的有效表达。尤其是任务之间存在冲突的时候。MMOE中给出了实验结论,当两个任务相关性没那么好(比如排序中的点击率与互动,点击与停留时长),此时这种结果会遭受训练困境,毕竟所有任务底层用的是同一组参数。

--soft parameter sharing:这个范式对应的结果从MOE->MMOE->PLE等。即底层不是使用共享的一个shared bottom,而是有多个tower,称为多个专家,而是有多个tower,称为多个专家,然后往往再有一个gating netwokrs在多任务学习时,给不同的tower分配不同的权重,那么这样对于不同的任务,可以允许使用底层不同的专家组合去进行预测,相较于上面所有任务共享底层,这个方式显得更加灵活。

--任务序列依赖关系建模:这种适合于不同任务之间有一定的序列依赖关系。比如电商场景里面的ctr和cvr,其中cvr这个行为只有在点击之后才会发生。所以这种依赖关系如果能加以利用,可以解决任务预估中的样本选择偏差(SSB)和数据稀疏性(DS)问题

样本选择偏差:后一阶段的模型基于上一阶段采样后的样本子集训练,但最终在全样本空间进行推理,带来严重泛化性问题

样本稀疏:后一阶段的模型训练样本小于前一阶段任务

ESSM是一种较为通用的任务序列依赖关系建模的方法,除此之外,阿里的DBMTL,ESSM2等工作都属于这一个范式。

通过上面的描述,能大体上对多任务模型方面的几种常见建模范式有所了解,然后也知道了hard parameter sharing存在的一些问题,即不能很好的权衡特定任务的目标与任务之间的冲突关系。

而这也就是MMOE模型提出的一个动机所在了。

上面这三张图分别是hard parameter sharing,OMOE,MMOE模型的结构图。

3. MMOE模型的理论以及相关细节

3.1 混合专家模型

我们知道共享的模型结构,会遭受任务之间冲突而导致可能无法很好的收敛,从而无法学习到任务之间的共同模式。这个结构也可以看成是多个任务共用了一个专家。

先抛开任务关系,我们发现一个专家在多任务学习上的表达能力很有限,于是乎,尝试引入多个专家,这就慢慢的演化出了混合专家模型。公式表达如下:

这里的y表示的是多个专家的汇总输出,接下来它要过特定的任务塔去得到特定任务的输出。这里还加了一个门控网络机制,就是一个注意力网络,来学习各个专家的重要性权重 \sum_{i=1}^{n}{​{g(x)}_i}=1f_i(x)就是每个专家的输出,而 g(x)_i就是每个专家对应的权重。虽然这个东西无非是单个专家的基础上多引入了几个全连接网络,然后又给这几个全连接网络加权,但还是蕴含了厉害的思路:

1.模型集成思想:这个东西很像bagging的思路,即训练多个模型进行决策,这个决策的有效性显然要比单独一个模型来的靠谱,不管是从泛化能力、表达能力、学习能力上,应该都强于一个模型。

2.注意力思想:为了增加灵活性,为不同的模型还学习了重要性权重,这可能考虑到了在学习任务的共性模式上,不同的模型学习的模式不同,那么聚合的时候,显然不能按照相同的重要度聚合,所以为各个专家学习权重,默认了不同专家的决策地位不一样。

3.multi-head机制:从另一个角度看,多个专家其实代表了多个不同head,而不同的head代表了不同的非线性空间,之所以表达能力增强了,是因为把输入特征映射到了不同的空间中去学习任务之间的共性模式。可以理解成从多个角度去捕捉任务之间的共性特征模式。

但是这种机制也存在问题,MOE使用了多个混合专家增加了各种表达能力,但是呢,一个门控并不是很灵活,因为这所有的任务,最终只能选定一组专家组合,即这个专家组合是在多个任务上综合衡量的结果,并没有针对性了。如果这些任务都比较相似,那就相当于用这一组专家组合确实可以应对这多个任务,学习到多个相似任务的共性。但如果任务之间差得很大,这种单门控控制的方式就不行了,因为此时底层的多个专家学习到特征模式相差可能会很大,毕竟任务不同,而单门控机制选择专家组合的时候,肯定是选择出那些有利于大多数任务的专家,而对应某些特殊任务,可能学习的一塌糊涂。

所以,这种方式的缺口很明显,这样,也更能理解为啥提出多门控控制的专家混合模型了。

3.2 MMOE结构

再单独放一下MMOE的网络结构图。

Multi-gate Mixture-of-Experts(MMOE)的魅力就在于在OMOE的基础上,对于每个任务都会涉及一个门控网络,这样,对于每个特定的任务,都能有一组对应的专家组合去进行预测。更关键的是,参数量还不会太多。公式如下:

这个改造看似简单,只是在OMOE上额外多加了几个门控网络,但是起到了杠杆般的效果,这里来看下大佬的理解:

  • 首先,就刚才分析的OMOE的问题,在专家组合选取上单门控会产生限制,此时如果多个任务产生了冲突,这种结构就无法进行很好的平衡。而MMOE就不一样了。MMOE是针对单个任务都单独有个门控选择专家组合,那么即使任务冲突了,也能根据不同的门控进行调整,选择出对当前任务有帮助的专家组合。所以,我觉得单门控做到了针对所有任务在专家选择上的解耦,而多门控做到了针对各个任务在专家组合选择上的解耦
  • 多门控机制能够建模任务之间的关系了。如果各个任务之间冲突,那么此时有多门控的帮助,此时让每个任务独享一个专家,如果任务之间能聚成几个相似的类,那么这几类之间应该对应的不同的专家组合,那么门控机制也可以选择出来。如果所有任务相似,那这几个门控网络学习到的权重也会相似,所以这种机制把任务的无关,部分相关和全部相关进行了一种统一。
  • 灵活的参数共享,这个可以和hard模式或者是针对每个任务单独建模的模型对比,对于hard模式,所有任务共享底层参数,而每个任务单独建模,是所有任务单独有一套参数,算是共享和不共享的两个极端,对于都共享的极端,害怕任务冲突,而对于一点都不共享的极端,无法利用迁移学习的优势,模型之间没法共享信息,互为补充,容易遭受过拟合的困境,另外还会增加计算量和参数量。而MMOE处于两者的中间,既兼顾了如果有相似任务,那就参数共享,模式共享,互为补充,如果没有相似任务,那就独立学习,互不影响。又把这两种极端给进行了统一。
  • 训练时能快速收敛,这是因为相似的任务对于特定的专家组合训练都会产生贡献,这样进行一轮epoch,相当于单独任务训练时的多轮epoch。

所以,在不产生太大的参数开销的同时,能通过一个小小的改动,既建模了任务关系,又灵活参数共享,又减少训练时间,是不是很powerful呢

MMOE整体结构不复杂,内容就整理这么多。

4.小结

最后,我们看下为什么多任务学习是有效的呢?这里看下一个别人还不错的答案:

多任务学习有效的原因是引入了归纳偏置,两个效果:

互相促进:可以把多任务模型之间的关系看作是互相先验知识,也称为归纳迁移,有了对模型的先验假设,可以更好提升模型的效果。解决数据稀疏性其实本身也是迁移学习的一个特性,多任务学习中也同样会体现。

泛化作用:不同模型学到的表征不同,可能A模型学到的是B模型所没有学好的,B模型也有其自身的特点,而这一点很可能A学不好,这样一来模型健壮性更强。

大佬的推荐算法导图。

### 面向方面的多头混合专家模型在顺序推荐系统中的实现与应用 #### 模型概述 面向方面(Facet-Aware)的多头混合专家(Mixture-of-Experts, MoE)模型旨在通过捕捉不同用户行为模式下的特定偏好来提高个性化推荐的效果。该方法利用多个子网络(即专家),每个专注于处理不同类型的信息片段或特征集,从而能够更细致地区分用户的兴趣点[^1]。 #### 架构设计 此架构由以下几个主要组件构成: - **输入层**: 接收来自序列化交互数据流作为输入; - **嵌入层(Embedding Layer)**: 将离散特征转换成连续空间内的低维表示形式; - **MoE 层 (Mixture of Experts Layers)** : 包含若干并行工作的专家模块以及一个门控机制(Gate Mechanism),用于决定哪些专家应该被激活参与预测过程;值得注意的是,在这里引入了aspect-aware的概念,意味着不同的专家可以针对具体的应用场景学习到更加专业的知识; - **融合层(Aggregation Layer)** :负责汇总各个活跃状态下的专家输出结果,并最终形成整体性的评分估计值; - **损失函数(Loss Function)** 和优化(Optimizer): 定义目标并通过反向传播调整参数以最小化误差。 ```python import torch.nn as nn from transformers import BertModel class FacetAwareMHMoERecommender(nn.Module): def __init__(self, num_experts=8, hidden_size=768, aspect_embeddings=None): super().__init__() self.bert = BertModel.from_pretrained('bert-base-uncased') self.expert_layers = nn.ModuleList([nn.Linear(hidden_size, hidden_size) for _ in range(num_experts)]) self.gate_layer = nn.Linear(hidden_size, num_experts) self.aspect_embedding = nn.Embedding(len(aspect_embeddings), hidden_size) def forward(self, input_ids, attention_mask, aspects): bert_output = self.bert(input_ids=input_ids, attention_mask=attention_mask)[0][:, 0, :] gate_weights = nn.functional.softmax(self.gate_layer(bert_output), dim=-1) expert_outputs = [expert(bert_output + self.aspect_embedding(aspects)) for expert in self.expert_layers] output = sum(w * o for w, o in zip(gate_weights.unbind(-1), expert_outputs)) return output ``` 上述代码展示了如何构建这样一个基于BERT预训练语言模型初始化编码部分,并结合自定义的MoE结构来进行物品推荐的任务实例。其中`aspects`代表了当前会话所涉及的具体领域或者话题类别信息,这有助于增强系统的理解和响应能力。 #### 使用说明 为了有效部署这个框架,开发者需要准备如下资源: - 用户历史记录及其对应的标签/评价分数; - 文本描述或者其他辅助材料帮助理解上下文环境; - 明确划分好的方面列表,以便于指导各路专家的学习方向。 完成准备工作之后,按照常规机器学习项目流程执行即可——先对全量样本做初步探索分析,接着依据业务需求选取合适的评估指标体系开展实验验证工作直至找到最优配置方案为止。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值