核心思想
多目标推荐领域中落地较好的模型,利用不同的expert对多目标进行打分。
模型结构
传统多任务模型(a)通过shared bottom的方式先inference出高维emb,之后将该高维emb输入到不同的塔完成不同的任务。上述模型进一步进化得到模型(b),该模型包含N个expert,每个expert会输出各自的高维emb,之后通过一个gate来决定输出到不同的塔的不同高维emb的组合。再进一步进化后得到模型©,即通过多个gate来决定多个高维emb的组合,这也是MMOE的主要思想。
代码实现
代码整体比较简单,但需要注意有些地方需要stop_gradient,因为如果不设置stop_gradient,则会导致计算重复。实例代码如下:
for i in range(self.expert_num):
expert = feas
for n in [256, 128, 64]:
expert = tf.layers.dense(expert, units=n, kernel_initializer=tf.truncated_normal_initializer(stddev=0.1), bias_initializer=tf.constant_initializer(0.1), activation=tf.nn.relu)
expert = tf.layers.dense(expert, units=1, kernel_initializer=tf.truncated_normal_initializer(stddev=0.1), bias_initializer=tf.constant_initializer(0.1))
expert_list.append(expert)
tbtj_expert = tf.nn.sigmoid(expert_list[0])
fz_expert = tf.nn.sigmoid(expert_list[1])
all_expert = tf.nn.sigmoid(expert_list[5])
stop_tbtj = tf.stop_gradient(expert_list[0])
stop_fz = tf.stop_gradient(expert_list[1])
stop_all = tf.stop_gradient(expert_list[5])
gate_list = []
for i in range(self.target_num):
gate_net = meta_input
for n in [16, 16]:
gate_net = tf.layers.dense(gate_net, units=n, kernel_initializer=tf.truncated_normal_initializer(stddev=0.1), bias_initializer=tf.constant_initializer(0.1), activation=tf.nn.relu)
gate_net = tf.nn.softmax(tf.layers.dense(gate_net, self.attention_num, kernel_initializer=tf.truncated_normal_initializer(stddev=0.1), bias_initializer=tf.constant_initializer(0.1)))
gate_list.append(gate_net)
tbtj_score = tf.nn.sigmoid(tf.reduce_sum(gate_list[0]*tf.concat([stop_tbtj, stop_all], 1), axis=1, keepdims=True))
fz_score = tf.nn.sigmoid(tf.reduce_sum(gate_list[1]*tf.concat([stop_fz, stop_all], 1), axis=1, keepdims=True))