MTL 有很多形式:联合学习(joint learning)、自主学习(learning to learn)和带有辅助任务的学习(learning with auxiliary task)等。一般来说,优化多个损失函数就等同于进行多任务学习。即使只优化一个损失函数(如在典型情况下),也有可能借助辅助任务来改善原任务模型。
两种深度学习 MTL 方法
1、参数硬(hard)共享
在实际应用中,通常通过在所有任务之间共享隐藏层,同时保留几个特定任务的输出层来实现。
共享 Hard 参数大大降低了过拟合的风险。这很直观:我们同时学习的工作越多,我们的模型找到一个含有所有任务的表征就越困难,而过拟合我们原始任务的可能性就越小。
2、参数软(soft)共享
在软参数共享中,每个任务都有单独的模型,每个模型包含各自的参数。模型参数之间的距离会作为正则项来保证参数尽可能相似。
推荐系统CTR(CVR)预估模型(多任务学习)之ESMM【https://arxiv.org/abs/1804.07931】
ESMM(Entire Space Multi-Task Model,ESMM)模型创新地利用用户行为序列数据,在完整的样本数据空间同时学习点击率和转化率(post-view clickthrough&conversion rate,CTCVR),解决了传统CVR预估模型难以克服的样本选择偏差(sample selection bias)和训练数据过于稀疏(data sparsity )的问题。
传统的CVR模型使用有点击行为的样本集来训练,同时训练好的模型又需要在整个样本空间做预测推断,即训练样本从整体样本空间的一个较小子集中提取,而训练得到的模型却需要对整个样本空间中的样本做推断预测。【样本选择偏差】
ESMM模型两个主要的特点:
1、在整个样本空间建模。
2、共享特征表示。ESMM模型借鉴迁移学习的思路,两个子网络的embedding层共享embedding向量(特征表示)词典。网络的embedding层把大规模稀疏的输入数据映射到低维的表示向量,该层的参数占了整个网络参数的绝大部分,需要大量的训练样本才能充分学习得到。由于CTR任务的训练样本量要大大超过CVR任务的训练样本量,ESMM模型中特征表示共享的机制能够使得CVR子任务也能够从只有展现没有点击的样本中学习,从而能够极大地有利于缓解训练数据稀疏性问题。
ESMM模型的损失函数由两部分组成,对应于pCTR 和pCTCVR 两个子任务,其形式如下:
在CTR任务中,有点击行为的展现事件构成的样本标记为正样本,没有点击行为发生的展现事件标记为负样本;在CTCVR任务中,同时有点击和购买行为的展现事件标记为正样本,否则标记为负样本。
模型的实现:
ESMM模型由两个结构完全相同的子网络连接而成,我们把子网络对应的模型称之为Base模型。
base 模型:在Base模型的网络输入包括user field和item field两部分。user field主要由用户的历史行为序列构成,具体地说,包含了用户浏览的产品ID列表,以及用户浏览的品牌ID列表、类目ID列表等;不同的实体ID列表构成不同的field。网络的Embedding层,把这些实体ID都映射为固定长度的低维实数向量;接着之后的Field-wise Pooling层把同一个Field的所有实体embedding向量求和得到对应于当前Field的一个唯一的向量;之后所有Field的向量拼接(concat)在一起构成一个大的隐层向量;接着大的隐层向量之上再接入诺干全连接层,最后再连接到只有一个神经元的输出层。
定义损失函数:
y = labels['cvr'] cvr_loss = tf.reduce_sum(tf.keras.backend.binary_crossentropy(y, prop), name="cvr_loss") ctr_loss = tf.reduce_sum(tf.nn.sigmoid_cross_entropy_with_logits(labels=labels['ctr'], logits=ctr_logits), name="ctr_loss") loss = tf.add(ctr_loss, cvr_loss, name="ctcvr_loss")
损失函数的设计:
https://www.zhihu.com/question/268105631
http://xudongyang.coding.me/esmm/
http://xudongyang.coding.me/esmm-1/
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深度神经网络多任务学习(Multi-Task Learning in Deep Neural Networks) - Python技术站