multi-task learning 在即时配送中的尝试

引言

现在大多数机器学习任务都是单任务学习。对于复杂的问题,也可以分解为简单且相互独立的子问题来单独解决,然后再合并结果,得到最初复杂问题的结果。这样做看似合理,其实是不正确的,因为现实世界中很多问题不能分解为一个一个独立的子问题,即使可以分解,各个子问题之间也是相互关联的,通过一些共享因素或共享表示联系在一起。把现实问题当做一个个独立的单任务处理,忽略了问题之间所富含的丰富的关联信息。

多个任务之间共享一些因素,它们可以在学习过程中,共享它们所学到的信息,这是单任务学习所不具备的。相关联的多任务学习比单任务学习能取得更好的泛化效果。

在外卖配送场景,多种预测任务存在非常高的关联性。区域平均配送时长、区域负载、当前时刻单量呈强相关关系,利用这种相关关系,我们可以构建多任务学习的训练框架提升彼此预估准确率。

核心

问题
对于每个配送区域在每一分钟,预估该区域未来20分钟的平均配送时长。这个配送时长会作为配送区域内供需关系的调控因子,触发调控行为。

label构建

  • 未来20分钟区域所有订单的平均配送时长
  • 未来20分钟区域的订单量
  • 未来20分钟的平均负载

特征构建

  • 区域固有特征:骑手数量、区域面积等
  • 区域实时特征:实时天气、实时订单量等
  • 区域历史统计特征:同时段平均配送时长、同时段天气等

网络结构

采用DeepFM。
DeepFM模型结合了广度和深度模型的有优点,联合训练FM模型和DNN模型,来同时学习低阶特征组合和高阶特征组合,DeepFM模型的Deep部分和FM部分从词嵌入层共享数据输入,该模型具有如下优点:
(1) 结合了广度和深度模型的优点,联合训练FM模型和DNN模型,同时学习低阶特征组合和高阶特征组合。
(2) 端到端模型,无需特征工程。
(3) DeepFM共享相同的输入和词嵌入向量,训练更高效。

DeepFM的输入可由连续型变量和类别型变量共同组成,对输入的离散数据需要进行词嵌入处理,通过一个类似局部连接的结构,将离散特征映射到低维向量。DeepFM包含两部分:神经网络部分与因子分解机部分,分别负责低阶特征的提取和高阶特征的提取。这两部分共享同样的输入。

DeepFM的预测结果可以写为:$y=sigmoid(y_{fm} + f_{DNN})$

FM 部分的输出如下:

image.png

公式说明如下:
1)这里的$w_{ij}$即$$,可以理解为DeepFM结构中计算词嵌入向量的权矩阵。
2)词嵌入层的神经元个数是由词嵌入向量长度和特征数量共同确定,神经元的个数为embedding vector*field_size。

然后是DNN部分的结构,DNN的作用是构造高维特征,并且DNN的输入也是相同的词嵌入向量,即和FM部分进行权值共享。关于DNN网络中的输入$a$处理方式采用前向传播,这里假设 $a(0)=(e_1,e_2,...,e_n)$表示词嵌入层的输出,那么$a(0)$作为下一层 DNN隐藏层的输入,其前馈过程如下:
$a(l+1)=σ(W^{(l)}a^{(l)}+b^{(l)})$

在具体实现过程中,我们将词嵌入层的词嵌入向量长度设置为64,DNN部分采用3层全连接层。对于FM部分的一阶项和二阶项以及DNN的每一层分别设置dropout。其中,FM部分的dropout系数为0.85,DNN部分的dropout系数为0.9。在DNN全连接层后加入batch normalization层。

参数共享

采用硬参数共享机制进行多任务学习网络构建。参数的硬共享机制是神经网络的多任务学习中最常见的一种方式,硬共享机制降低了过拟合的风险。我们通过对于所有任务共享隐藏层,同时保留几个特定任务的输出层来实现多任务学习的模型框架。多任务学习的损失函数分为2部分:主任务损失函数、辅助任务损失函数。对于主任务选用分段函数进行优化,改善长尾情况预估偏短问题。对于辅助任务选用平方损失进行学习优化。主任务损失函数和辅助任务损失函数分别如下:
image.png

模型训练

多任务学习有交替训练和联合训练。由于数据集相同,我们采用的是多任务学习中的交替训练进行网络参数的学习。具体做法是,首先生产一个在0-1范围内的随机数,将该随机数作为当前训练轮次训练任务的依据。针对主任务和辅助任务,我们分别设定不同的训练概率,主任务为0.6、两个辅助任务均为0.2,这样可以保证主任务在有限的训练轮次下可以得到充分的训练。深度学习网络采用Adam优化器进行训练,初始学习率为0.015,每训练2000步,将学习率进行一次衰减,衰减系数为0.95。

扩展:多任务学习

概念

多任务学习(multi-task learning)是基于共享表示(shared representation),把多个相关的任务放在一起学习的一种机器学习方法。

多任务学习涉及多个相关的任务同时并行学习,梯度同时反向传播,多个任务通过底层的共享表示(shared representation)来互相帮助学习,提升泛化效果。

网络结构

在网络结构上,分为硬共享机制(在一个基学习器的最后一层加上多个特定的输出层)和soft参数共享机制(每个任务都有自己的参数和模型,模型参数之间的距离是正则化的,以便鼓励参数相似化)

(1)参数的硬共享机制:参数的硬共享机制是神经网络的多任务学习中最常见的一种方式,一般来讲,在实际应用中,通常通过在所有任务之间共享隐藏层,同时保留几个特定任务的输出层来实现。 硬共享机制降低了过拟合的风险。事实上,有文献证明了这些共享参数过拟合风险的阶数是N,其中N为任务的数量,比任务相关参数的过拟合风险要小。直观来将,这一点是非常有意义的。越多任务同时学习,我们的模型就能捕捉到越多任务的同一个表示,从而导致在我们原始任务上的过拟合风险越小。
image.png

(2)参数的软共享机制(基于约束的共享(regularization based)):每个任务都有自己的模型,自己的参数。在共享 Soft 参数时,每个任务都有自己的参数和模型。模型参数之间的距离是正则化的,以便鼓励参数相似化。我们对模型参数的距离进行正则化来保障参数的相似。如有文献使用L2距离正则化,而也有文献使用迹正则化(trace norm)。用于深度神经网络中的软共享机制的约束很大程度上是受传统多任务学习中正则化技术的影响。约束深度神经网络 Soft 参数共享的思想受到了 MTL 正则化技术的极大启发,这种思想已经用于其它模型开发。
image.png

训练方式

在训练阶段,包括交替训练和联合训练(把两个loss相加)两种方式。

什么时候交替训练好?

当对每个不同的任务有两个不同的数据集(例如,从英语翻译成法语,英语翻译成德语)时,交替训练是一个好主意。通过以这种方式设计网络,可以提高每个任务的性能,而无需找到更多任务特定的训练数据。

什么时候联合训练好?

交替训练容易对某一类产生偏向,当对于相同数据集,产生不同属性的输出时,保持任务的独立性,使用联合训练较好。

你可能感兴趣的:(机器学习,深度学习)