0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

神经网络实现MTL时需要考虑的问题

jmiy_worldofai 来源:xx 2019-02-19 14:14 次阅读

在过去的一年里,我和我的团队一直致力于提高 Taboola Feed 的个性化用户体验。我们使用多任务学习(MTL)来预测同一组输入特性上的多个关键性能指标(KPIs),并在 TensorFlow 中实现了一个深度学习(DL)模型。但是,在我们开始着手这项研究的时候,MTL 对我们来说比现在复杂得多,所以我想分享一些经验教训。

在本文中,我将分享一些在神经网络(NN)中实现 MTL 时具体需要考虑哪些方面的问题,我还将对这些问题提出简单的 TensorFlow 解决方案。

我们想从硬参数共享(hard parameter sharing)的基本方法开始。硬共享意味着我们有一个共享子网,这个子网是特定于任务的。

在 TensorFlow 中使用这种模型时,由于它看起来与其他 NN 体系结构没有那么大的不同,您可能会觉得自己有哪里做错了。

经验 1-损失合并

我们在 MTL 模型中遇到的第一个挑战是为多个任务定义单个损失函数。虽然单个任务有定义明确的损失函数,但多个任务会带来多个损失。

我们最开始尝试的做法是直接将所有的损失相加。不久我们就发现,当一个任务趋同于好的结果时,其他任务看起来相当糟糕。造成这个现象的原因很简单,因为损失的规模是如此的不同,以至于一个任务主导了整个损失,而其余的任务没有机会影响共享层的学习过程。

一个快速的解决办法是用一个加权和替代损失的直接相加和,使所有的损失对共享层的影响大致相同。然而,这个解决方案涉及另一个超参数,可能需要每隔一段时间调整一次。

幸运的是,我们发现了一篇很棒的论文,论文建议使用不确定性来衡量 MTL 中的损失。具体方法是学习另一个噪声参数,该参数集成在每个任务的损失函数中。这允许 MTL 中有多个任务,并使所有损失达到相同的规模。

通过这种方法,不仅可以得到比加权和更好的结果,而且不需要考虑附加的权重超参数。这篇论文的作者还提供了一个 keras 实现方法。

经验 2-调整学习速率

学习速率是调节神经网络最重要的超参数之一,这是一个常见的规律。所以我们尝试了调优,发现了对不同任务来说最优的调试速率。选择较高的学习率会导致其中一个任务的dying Relu,而使用较低的学习率会导致另一个任务的收敛缓慢。那我们该怎么办?我们可以让每个特定于任务的子网调整为单独的学习速率,并将共享子网调整为另一个速率。

虽然这听起来很复杂,但实际上相当简单。通常,在 TensorFlow 中训练神经网络时,您可以使用如下方法:

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

A

damOptimizer 定义了应该如何应用渐变,并最小化计算并应用它们。我们可以用自己的实现来代替最小化,该实现将对计算图中的每个变量使用适当的学习速率:

all_variables = shared_vars + a_vars + b_varsall_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)

另外,这个技巧实际上也可以应用于单任务网络

经验 3-使用评估作为特征

一旦我们通过了创建预测多个任务的 NN 的第一个阶段,我们可能会将某个任务的评估作为另一个任务的结果。这个估计是张量,所以我们可以像连接其他层的输出一样连接它。但是在反向传播中会发生什么呢?

假设任务 A 的估计值作为一个特性传递给任务 B。我们可能并不想将梯度从任务 B 传回任务 A,因为我们已经给了任务 A 标签

别担心,TensorFlow 的 API 有tf.stop_gradient,它正是为了解决这个问题而存在的。当计算梯度时,它可以让你传递一个张量列表,你想把它当作常数,这正是我们所需要的。

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

同样地,这在 MTL 网络中很有用,但它不仅仅在 MTL 网络中有用。只要您想用 TensorFlow 计算一个值,并且需要假设该值是一个常量,就可以使用此技术。例如,当训练生成对抗网络(GANs)时,您不希望在生成对抗性网络的过程中进行反向传播。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 神经网络
    +关注

    关注

    42

    文章

    4769

    浏览量

    100687

原文标题:多任务深度学习的三个经验教训

文章出处:【微信号:worldofai,微信公众号:worldofai】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    神经网络教程(李亚非)

      第1章 概述  1.1 人工神经网络研究与发展  1.2 生物神经元  1.3 人工神经网络的构成  第2章人工神经网络基本模型  2.1 MP模型  2.2 感知器模型  2.3
    发表于 03-20 11:32

    神经网络简介

    神经网络简介
    发表于 08-05 21:01

    labview BP神经网络实现

    请问:我在用labview做BP神经网络实现故障诊断,在NI官网找到了机器学习工具包(MLT),但是里面没有关于这部分VI的帮助文档,对于”BP神经网络分类“这个范例有很多不懂的地方,比如
    发表于 02-22 16:08

    全连接神经网络和卷积神经网络有什么区别

    全连接神经网络和卷积神经网络的区别
    发表于 06-06 14:21

    卷积神经网络如何使用

    卷积神经网络(CNN)究竟是什么,鉴于神经网络在工程上经历了曲折的历史,您为什么还会在意它呢? 对于这些非常中肯的问题,我们似乎可以给出相对简明的答案。
    发表于 07-17 07:21

    【案例分享】ART神经网络与SOM神经网络

    今天学习了两个神经网络,分别是自适应谐振(ART)神经网络与自组织映射(SOM)神经网络。整体感觉不是很难,只不过一些最基础的概念容易理解不清。首先ART神经网络是竞争学习的一个代表,
    发表于 07-21 04:30

    人工神经网络实现方法有哪些?

    人工神经网络(Artificial Neural Network,ANN)是一种类似生物神经网络的信息处理结构,它的提出是为了解决一些非线性,非平稳,复杂的实际问题。那有哪些办法能实现人工神经
    发表于 08-01 08:06

    如何设计BP神经网络图像压缩算法?

    (Digital Signal Processor)相比,现场可编程门阵列(Field Programma-ble Gate Array,FPGA)在神经网络实现上更具优势。DSP处理器在处理时采用指令顺序执行
    发表于 08-08 06:11

    简单神经网络实现

    最简单的神经网络
    发表于 09-11 11:57

    如何构建神经网络

    原文链接:http://tecdat.cn/?p=5725 神经网络是一种基于现有数据创建预测的计算系统。如何构建神经网络神经网络包括:输入层:根据现有数据获取输入的层隐藏层:使用反向传播优化输入变量权重的层,以提高模型的预测
    发表于 07-12 08:02

    matlab实现神经网络 精选资料分享

    神经神经网络,对于神经网络实现是如何一直没有具体实现一下:现看到一个简单的神经网络模型用于训
    发表于 08-18 07:25

    基于BP神经网络的PID控制

    最近在学习电机的智能控制,上周学习了基于单神经元的PID控制,这周研究基于BP神经网络的PID控制。神经网络具有任意非线性表达能力,可以通过对系统性能的学习来实现具有最佳组合的PID控
    发表于 09-07 07:43

    卷积神经网络一维卷积的处理过程

    inference在设备端上做。嵌入式设备的特点是算力不强、memory小。可以通过对神经网络做量化来降load和省memory,但有时可能memory还吃紧,就需要神经网络在memory使用上做进一步优化
    发表于 12-23 06:16

    神经网络移植到STM32的方法

    神经网络移植到STM32最近在做的一个项目需要用到网络进行拟合,并且将拟合得到的结果用作控制,就在想能不能直接在单片机上做神经网络计算,这样就可以实时计算,不依赖于上位机。所以要解决
    发表于 01-11 06:20

    rnn是递归神经网络还是循环神经网络

    : 循环神经网络的基本概念 循环神经网络是一种具有时间序列特性的神经网络,它能够处理序列数据,具有记忆功能。与传统的前馈神经网络不同,循环神经网络
    的头像 发表于 07-05 09:52 554次阅读