共计 1375 个字符,预计需要花费 4 分钟才能阅读完成。
前言
美团技术博客最近出了一篇文章讲多任务学习,优化的对象是深层转化。
上图是论文中给出的一个深层转化的过程图,从曝光到激活着过程经历点击、申请、审核才到激活。这种深层转化都会遇到一个问题:真实的正样本很少,而且转化的回流也会比较慢。
回想ESMM巧妙的利用了全空间的概念解决了ssb和ds问题,在这篇文章里也是利用到。这篇论文想通过学习每一个步骤之间的信息传递对下一步的影响,学习到“序列信息”。
模型网络介绍
看下网络与其他两个经典网络结构的对比:
对于这篇论文本身是基于hard share bottom的多任务学习方法,在构建各自的塔去学习相应的任务,然后在最终输出之前有一个AIT模块学习上一个步骤到下一个步骤之间信息到传递。
上面最右面的模型表示 塔t-1 到塔 t 的转化过程,AIT模块的输入是 p_{t-1}和q_t ,它的输出会作为塔对应的目标z_t
之前的描述中提到两个塔之间的之间的信息传递,就是通过上述的AIT模块来实现的,这个模块是一个简单的注意力模块,通过融合两个输入实现输出。
看到wu就是一个softmax计算权重输出的过程。
def _attention(self, input1, input2):
'''
The attention module.
:param input1: None, K
:param input2: None, K
:return: None, K
'''
# (N,L,K)
inputs = tf.concat([input1[:, None, :], input2[:, None, :]], axis=1)
# (N,L,K)*(K,K)->(N,L,K), L=2, K=32 in this.
Q = tf.tensordot(inputs, self.weights['attention_w1'], axes=1)
K = tf.tensordot(inputs, self.weights['attention_w2'], axes=1)
V = tf.tensordot(inputs, self.weights['attention_w3'], axes=1)
# (N,L)
a = tf.reduce_sum(tf.multiply(Q, K), axis=-1) / \
tf.sqrt(tf.cast(inputs.shape[-1], tf.float32))
a = tf.nn.softmax(a, axis=1)
# (N,L,K)
outputs = tf.multiply(a[:, :, None], V)
return tf.reduce_sum(outputs, axis=1) # (N, K)
公示中的 h1、h2和h3分别对应weights中的参数,然后QKV的计算跟我们常规的注意力计算有点像,类似self attention 。
AIT的输出之后还会介入一个info模块,论文里给出的是mlp模块。
这样就实现了信息之间的传递,如果按照之前给出的例子,那么需要计算相应的交叉熵loss。但是现在还有一个额外的辅助loss需要加入:
当塔t的输出大于t-1当时候加入一个惩罚项。看起来是想让其满足正常的转化规律,漏斗效应。不过现在的业务里只有二级转化,没有这么多层的转化,离线测试了下没有什么差异。
总结
1、加入 AIT 模块,类似self attention 实现信息传递融合
2、loss优化那加入了约束相loss