Multi-task Learning的三个小知识

2020 年 4 月 2 日 AINLP

本文译自Deep Multi-Task Learning – 3 Lessons Learned by Zohar Komarovsky

在过去几年里,Multi-Task Learning (MTL)广泛用于解决多个Taboola(公司名)的业务问题。在这些业务问题中, 人们使用一组相同的特征以及深度学习模型来解决MTL相关问题。在这里简单分享一下我们做MTL时学习到的一些小知识。

小知识第一条:整合损失函数

MTL模型中的第一个挑战: 如何为multiple tasks定义一个统一的损失函数?最简单的办法,我们可以整合不同tasks的loss function,然后简单求和。这种方法存在一些不足,比如当模型收敛时,有一些task的表现比较好,而另外一些task的表现却惨不忍睹。其背后的原因是不同的损失函数具有不同的尺度,某些损失函数的尺度较大,从而影响了尺度较小的损失函数发挥作用。这个问题的解决方案是把多任务损失函数“简单求和”替换为“加权求和”。加权可以使得每个损失函数的尺度一致,但也带来了新的问题:加权的超参难以确定。


幸运的是,有一篇论文《Multi-Task Learning Using Uncertainty to Weigh Losses for Scene Geometry and Semantics》通过“不确定性(uncertainty)”来调整损失函数中的加权超参,使得每个任务中的损失函数具有相似的尺度。该算法的keras版本实现,详见github

小知识第二条:调整学习率 learning rate

在神经网络的参数中,learning rate是一个非常重要的参数。在实践过程中,我们发现某一个learnig rate=0.001能够把任务A学习好,而另外一个learning rate=0.1能够把任务B学好。选择较大的learning rate会导致某个任务上出现dying relu;而较小的learning rate会使得某些任务上模型收敛速度过慢。怎么解决这个问题呢?对于不同的task,我们可以采用不同的learning rate。这听上去很复杂,其实非常简单。通常来说,训练一个神经网络的tensorflow代码如下:

   
   
     
optimizer = tf.train.AdamOptimizer(learning_rate).minimize(loss)

其中AdamOptimizer定义了梯度下降的方式,minimize则计算梯度并最小化损失函数。我们可以通过自定义一个minimize函数来对某个任务的变量设置合适的learning rate。

   
   
     
all_variables = shared_vars + a_vars + b_vars
all_gradients = tf.gradients(loss, all_variables)

shared_subnet_gradients = all_gradients[:len(shared_vars)]
a_gradients = all_gradients[len(shared_vars):len(shared_vars + a_vars)]
b_gradients = all_gradients[len(shared_vars + a_vars):]

shared_subnet_optimizer = tf.train.AdamOptimizer(shared_learning_rate)
a_optimizer = tf.train.AdamOptimizer(a_learning_rate)
b_optimizer = tf.train.AdamOptimizer(b_learning_rate)

train_shared_op = shared_subnet_optimizer.apply_gradients(zip(shared_subnet_gradients, shared_vars))
train_a_op = a_optimizer.apply_gradients(zip(a_gradients, a_vars))
train_b_op = b_optimizer.apply_gradients(zip(b_gradients, b_vars))

train_op = tf.group(train_shared_op, train_a_op, train_b_op)

值得一提的是,这样的trick在单任务的神经网络上效果也是很好的。

小知识第三条:任务A的评估作为其他任务的特征

当我们构建了一个MTL的神经网络时,该模型对于任务A的估计可以作为任务B的一个特征。在前向传播时,这个过程非常简单,因为模型对于A的估计就是一个tensor,可以简单的将这个tensor作为另一个任务的输入。但是后向传播时,存在着一些不同。因为我们不希望任务B的梯度传给任务A。幸运的是,Tensorflow提供了一个API tf.stop_gradient。当计算梯度时,可以将某些tensor看成是constant常数,而非变量,从而使得其值不受梯度影响。代码如下:

   
   
     
all_gradients = tf.gradients(loss, all_variables, stop_gradients=stop_tensors)

再次值得一提的是,这个trick不仅仅可以在MTL的任务中使用,在很多其他任务中也都发挥着作用。比如,当训练一个GAN模型时,我们不需要将梯度后向传播到对抗样本的生成过程中。

感谢阅读,希望本文对您有所帮助!谢谢!


如果觉得文章对您有帮助,可以关注本人的微信公众号:机器学习小知识

推荐阅读

AINLP年度阅读收藏清单

自动作诗机&藏头诗生成器:五言、七言、绝句、律诗全了

From Word Embeddings To Document Distances 阅读笔记

模型压缩实践系列之——bert-of-theseus,一个非常亲民的bert压缩方法

这门斯坦福大学自然语言处理经典入门课,我放到B站了

可解释性论文阅读笔记1-Tree Regularization

征稿启示 | 稿费+GPU算力+星球嘉宾一个都不少

关于AINLP

AINLP 是一个有趣有AI的自然语言处理社区,专注于 AI、NLP、机器学习、深度学习、推荐算法等相关技术的分享,主题包括文本摘要、智能问答、聊天机器人、机器翻译、自动生成、知识图谱、预训练模型、推荐系统、计算广告、招聘信息、求职经验分享等,欢迎关注!加技术交流群请添加AINLPer(id:ainlper),备注工作/研究方向+加群目的。




登录查看更多
0

相关内容

多任务学习(MTL)是机器学习的一个子领域,可以同时解决多个学习任务,同时利用各个任务之间的共性和差异。与单独训练模型相比,这可以提高特定任务模型的学习效率和预测准确性。多任务学习是归纳传递的一种方法,它通过将相关任务的训练信号中包含的域信息用作归纳偏差来提高泛化能力。通过使用共享表示形式并行学习任务来实现,每个任务所学的知识可以帮助更好地学习其它任务。
【Google】监督对比学习,Supervised Contrastive Learning
专知会员服务
74+阅读 · 2020年4月24日
【斯坦福大学】Gradient Surgery for Multi-Task Learning
专知会员服务
46+阅读 · 2020年1月23日
小样本学习(Few-shot Learning)综述
黑龙江大学自然语言处理实验室
28+阅读 · 2019年4月1日
关于深度多任务学习的 3 点经验
机器学习算法与Python学习
17+阅读 · 2019年2月18日
Unsupervised Learning via Meta-Learning
CreateAMind
42+阅读 · 2019年1月3日
论文浅尝 | Zero-Shot Transfer Learning for Event Extraction
开放知识图谱
26+阅读 · 2018年11月1日
笔记 | Deep active learning for named entity recognition
黑龙江大学自然语言处理实验室
24+阅读 · 2018年5月27日
Hierarchical Imitation - Reinforcement Learning
CreateAMind
19+阅读 · 2018年5月25日
论文浅尝 | Leveraging Knowledge Bases in LSTMs
开放知识图谱
6+阅读 · 2017年12月8日
共享相关任务表征,一文读懂深度神经网络多任务学习
深度学习世界
16+阅读 · 2017年6月23日
Learning Embedding Adaptation for Few-Shot Learning
Arxiv
16+阅读 · 2018年12月10日
Meta-Transfer Learning for Few-Shot Learning
Arxiv
8+阅读 · 2018年12月6日
Multi-task Deep Reinforcement Learning with PopArt
Arxiv
4+阅读 · 2018年9月12日
Arxiv
7+阅读 · 2018年5月23日
Arxiv
19+阅读 · 2018年3月28日
VIP会员
相关资讯
小样本学习(Few-shot Learning)综述
黑龙江大学自然语言处理实验室
28+阅读 · 2019年4月1日
关于深度多任务学习的 3 点经验
机器学习算法与Python学习
17+阅读 · 2019年2月18日
Unsupervised Learning via Meta-Learning
CreateAMind
42+阅读 · 2019年1月3日
论文浅尝 | Zero-Shot Transfer Learning for Event Extraction
开放知识图谱
26+阅读 · 2018年11月1日
笔记 | Deep active learning for named entity recognition
黑龙江大学自然语言处理实验室
24+阅读 · 2018年5月27日
Hierarchical Imitation - Reinforcement Learning
CreateAMind
19+阅读 · 2018年5月25日
论文浅尝 | Leveraging Knowledge Bases in LSTMs
开放知识图谱
6+阅读 · 2017年12月8日
共享相关任务表征,一文读懂深度神经网络多任务学习
深度学习世界
16+阅读 · 2017年6月23日
相关论文
Top
微信扫码咨询专知VIP会员