多目标MMOE

介绍MMOE

deep部分:存在多个Expert网络,每个Expert网络的输出最终会经过门网络进行加权平均(比较简单的线性加权,Attention的思想)
门网络通过softmax输出每个专家网络的可能性,线性加权相乘。然后进行分类或者回归任务
对于不同的任务通过相应的Gating Network来对不同的Expert赋予不同的权重,使得部分Expert“专注于各自擅长的任务”

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v9ZD4hec-1595584810318)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200628181922777.png)]

论文:左侧的shallow tower部分和右侧的main tower部分,论文中提到的采用类似Wide&Deep模型结构就是指这两个tower,其中shallow tower可以对应Wide部分,main tower对应的是Deep部分
存在n个Expert网络,每个Expert网络的输出最终会经过Gating Network进行加权平均(比较简单的线性加权,Attention的思想)
对于不同的任务通过相应的Gating Network来对不同的Expert赋予不同的权重,使得部分Expert“专注于各自擅长的任务”

Shallow Tower部分

position bias问题,文章中shallow Tower部分主要作用就是消除Position bias的影响。这部分模型的输入是与position bias相关的一些特征(如广告展现时的排序位置、用户机型等),文章提到了用户机型也算在这部分feature当中,比较直观的认知是不同机型的尺寸的差异可能会对这些position bias有所影响。实际上我们线上的PC搜索模型当中也是采用同样的架构,即Main Tower + Shallow Tower这种类似Wide&Deep的模型结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-syyR6NQK-1595584810319)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200628191714214.png)]

在这里插入图片描述


loss计算mse和softmax_cross_entropy

tf.squeeze(control_layer,axis=[1]) #从tensor中删除所有大小是1的维度,也可以通过指定squeeze_dims来删除特定尺寸1尺寸。
tf.expand_dims(gate,axis=1) #在第axis位置增加一个维度

experts变成多个全连接层Expert
        experts = []
        for i in range(n_experts): #8*多个全连接层
            experts.append(self.Expert(shared_bottom, expert_units))
        # Convert experts to tensor
        experts = tf.convert_to_tensor(experts)
        experts = tf.transpose(experts, perm=[1, 0, 2])

GATE
		输入经过n层 分类一个,回归一个
        logits = tf.layers.dense(net, n_experts, activation=None) #使GATE和n_experts维度相等方便后续相乘 8个
        probabilities = tf.nn.softmax(logits)
权重gate层和experts层相乘,经过tower在分类
def Classify(self, gate, experts, tower_units, n_classes):
        gate = tf.expand_dims(gate, axis=1) #增加维度
        control_layer = tf.matmul(gate, experts)
        # 注意指定squeeze的维度,否则如果有一维是None,会导致整个tensor丢失形状
        control_layer = tf.squeeze(control_layer, axis=[1])
        # Tower
        net = control_layer
        for units in tower_units: # [64, 32]
            net = tf.layers.dense(net, units=units, activation=tf.nn.relu, use_bias=False)
        # Compute logits (1 per class).
        logits = tf.layers.dense(net, n_classes, activation=None)
        predicted_classes = tf.argmax(logits, 1)  #回归去掉这一行 
        return logits

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值