你好,游客 登录 注册 搜索
背景:
阅读新闻

多任务深度学习实战

[日期:2016-08-09] 来源:深度学习大讲堂公众账号  作者:薛云峰 [字体: ]

深度学习大讲堂是高质量原创内容平台,邀请学术界、工业界一线专家撰稿,致力于推送人工智能与深度学习最新技术、产品和活动信息。 

 

1、多任务学习导引

 

多任务学习是机器学习中的一个分支,按1997年综述论文Multi-task Learning一文的定义:Multitask Learning (MTL) is an inductive transfer mechanism whose principle goal is to improve generalization performance. MTL improves generalization by leveraging the domAIn-specific information contained in the training signals of related tasks. It does this by training tasks in parallel while using a shared representation。翻译成中文: 多任务学习是一种归纳迁移机制,基本目标是提高泛化性能。多任务学习通过相关任务训练信号中的领域特定信息来提高泛化能力,利用共享表示采用并行训练的方法学习多个任务。

顾名思义,多任务学习是一种同时学习多个任务的机器学习方法,如图1所示,多任务学习同时学习了人类和狗的分类器以及男性和女性的性别分类器。

 

深度学习

图1. 多任务学习示例

(图片引自:http://www.cs.cornell.edu/~kilian/research/multitasklearning/multitasklearning.html)

 

进一步的,图2所示为单任务学习和多任务学习的对比。在单任务学习中,每个任务采用单独的数据源,分别学习每个任务单独的模型。而多任务学习中,多个数据源采用共享表示同时学习多个子任务模型。

 

图2. 单任务学习与多任务学习的对比:1)左侧为单任务学习。2)右侧为多任务学习

(图2引自Ramtin Mehdizadeh Seraj,Multitask Learning, Jan 2014,SFU Machine Learning Reading Group)

 

多任务学习的基本假设是多个任务之间具有相关性,因此能够利用任务之间的相关性互相促进。例如,属性分类中,抹口红和戴耳环有一定的相关性,单独训练的时候是无法利用这些信息,多任务学习则可以利用任务相关性联合提高多个属性分类的精度,详情可参考文章Maryland大学Hand等人的论文Attributes for Improved Attributes: A Multi-Task Network for Attribute Classification。

 

2、多任务深度学习

 

近年来,在深度学习技术的推动下计算机视觉领域取得了突飞猛进的进展。本质上说,深度学习是多层的神经网络,对输入进行了层级的非线性表示,来自网络可视化的证据表明,深度网络的层级表示从语义上从底层到高层不断递进。深度网络强大的表示能力,使得多任务深度学习有了施展的空间。图3所示为多任务深度网络结构示意图。Input x表示不同任务的输入数据,绿色部分表示不同任务之间共享的层,紫色表示每个任务特定的层,Task x表示不同任务对应的损失函数层。在多任务深度网络中,低层次语义信息的共享有助于减少计算量,同时共享表示层可以使得几个有共性的任务更好的结合相关性信息,任务特定层则可以单独建模任务特定的信息,实现共享信息和任务特定信息的统一。

 

图3. 多任务深度网络示意图

(图3引自Ramtin Mehdizadeh Seraj,Multitask Learning, Jan 2014,SFU Machine Learning Reading Group)

 

在深度网络中,多任务的语义信息还可以从不同的层次输出,例如GoogLeNet中的两个辅助损失层。另外一个例子比如衣服图像检索系统,颜色这类的信息可以从较浅层的时候就进行输出判断,而衣服的样式风格这类的信息,更接近高层语义,需要从更高的层次进行输出,这里的输出指的是每个任务对应的损失层的前一层。

 

3、多任务深度学习应用案例

 

目前,多任务深度学习已经广泛应用于人脸识别、细粒度车辆分类、面部关键点定位与属性分类等多个领域,以下讲介绍其中的代表性论文。

 

3.1人脸识别网络 DeepID2

 

香港中文大学汤晓鸥组发表在NIPS14的论文Deep Learning Face Representation by Joint Identification-Verification,提出了一种联合训练人脸确认损失和人脸分类损失的多任务人脸识别网络DeepID2,网络结构如下图所示:

 

图4. DeepID2网络结构示意图

 

DeepID2中共有两个损失函数,分别为人脸分类损失函数,对应于Caffe中的SoftmaxLoss:

 

另外一个是人脸确认损失函数,对应于Caffe中的Contrastive Loss:

 

 

3.2细粒度车辆分类网络

 

这里介绍一个比较有趣的将SoftmaxLoss和TripletLoss结合在一个网络中进行多任务训练的方法Embedding Label Structures for Fine-Grained Feature Representation,目前文章发表于arXiv。作者将这个网络用于细粒度车辆分类上,提醒注意的是为了计算Tiplet Loss,特征进行了L2范数归一操作,网络结构如下图所示:

 

图5. 多任务车辆分类网络结构示意图

 

3.3物体检测网络Faster R-CNN

 

在物体检测网络Faster R-CNN中也有多任务学习的应用。Faster R-CNN的网络结构如下图6所示,包含两个任务,分别为窗口回归和窗口分类,其中RPN模块的卷积层在两个任务之间共享。Faster R-CNN的最新版本支持整体端到端训练,可以同时检测多类物体,是目前最具代表性的目标检测框架,同时也是多任务深度学习的一个典型应用。

 

图6. Faster R-CNN网络结构示意图

 

3.4面部关键点定位与属性分类网络TCDCN

 

面部关键点估计和头部姿态以及人脸属性(是否戴眼镜、是否微笑和性别)之间有着紧密的联系,香港中文大学汤晓鸥组发表于ECCV14的工作Facial Landmark Detection by Deep Multi-task Learning利用多任务学习方法联合进行人脸面部关键点定位和属性预测,网络结构如下图7所示。

 

图7. TCDCN网络结构示意图

 

4、基于Caffe实现多任务学习的小样例

 

本节在目前广泛使用的深度学习开源框架Caffe的基础上实现多任务深度学习算法所需的多维标签输入。默认的,Caffe中的Data层只支持单维标签,为了支持多维标签,首先修改Caffe中的convert_imageset.cpp以支持多标签:

 

std ::ifstream infile (argv[2]);

    std :: vector < std ::pair< std :: string , std :: vector < float >> > lines;

    std :: string filename;

    std :: string label_count_string = argv[ 5 ];

    int label_count = std ::atoi(label_count_string.c_str());

    std :: vector < float > label(label_count);

    while (infile >> filename)

    {

        for ( int i = 0 ; i < label_count;i++)

            infile >> label[i];

        lines.push_back( std ::make_pair(filename, label));

    }

    // Create new DB

    scoped_ptr<db::DB> db_image(db::GetDB(FLAGS_backend));

    scoped_ptr<db::DB> db_label(db::GetDB(FLAGS_backend));

    db_image->Open(argv[ 3 ], db::NEW);

    db_label->Open(argv[ 4 ], db::NEW);

    scoped_ptr<db::Transaction> txn_image(db_image->NewTransaction());

    scoped_ptr<db::Transaction> txn_label(db_label->NewTransaction());

 

这样我们就有了多任务的深度学习的基础部分数据输入。为了向上兼容Caffe框架,本文摒弃了部分开源实现增加Data层标签维度选项并修改Data层代码的做法,直接使用两个Data层将数据读入,即分别读入数据和多维标签,接下来介绍对应的网络结构文件prototxt的修改,注意红色的注释部分。

#唯一的区别,这个层的标签没有了,因为我们使用了标签数据库负责存放标签

layer {

  name: "data"

  type: "Data"

  top: "data" //注意这里,top层输出blob只剩一个

  transform_param {

    mean_file: "/home/xyf/Multilabel/mean.binaryproto"

    crop_size: 227     

  } 

  include {

    phase: TRAIN

  }

  data_param {

    source: "/home/xyf/Multilabel/TrainDbImage"

    batch_size: 128

    backend: LMDB

  }

}

#这是我们使用的标签数据库,用来负责存放标签

layer {

  name: "labels"

  type: "Data"

  top: "labels"

  include {

    phase: TRAIN

  }

  data_param {

    source: "/home/xyf/Multilabel/TrainDbLabel"

    batch_size: 128

    backend: LMDB

  }

}

layer {

  name: "data"

  type: "Data"

  top: "data"

  transform_param {

    mean_file: "/home/xyf/Multilabel/mean.binaryproto"

    crop_size: 227     

  } 

  include {

    phase: TEST

  }

  data_param {

    source: "/home/xyf/Multilabel/TestDbImage"

    batch_size: 128

    backend: LMDB

  }

}

layer {

  name: "labels"

  type: "Data"

  top: "labels"

  include {

    phase: TEST

  }

  data_param {

    source: "/home/xyf/Multilabel/TestDbLabel"

    batch_size: 128

    backend: LMDB

  }

}

 

特别的,slice层对多维的标签进行了切分,为每个任务输出了单独的标签。

 

#此处和hdf5没有区别,将标签数据库中的内容进行切分,拆分成各个属性的标签

layer {

  name: "sliceL"

  type: "Slice"

  bottom: "labels"

  top: "label_attr1"

  top: "label_attr2"

  top: "label_attr3"

  top: "label_attr4"

  top: "label_attr5"

  slice_param

  {

    slice_dim: 1 

    slice_point: 1

    slice_point: 2

    slice_point: 3

    slice_point: 4

  }

}

 

另外一个值得讨论的是每个任务的权重设置,在本文实践中五个任务设置为等权重loss_weight:0.2。一般的,建议所有任务的权重值相加为1,如果这个数值不设置,可能会导致网络收敛不稳定,这是因为多任务学习中对不同任务的梯度进行累加,导致梯度过大,甚至可能引发参数溢出错误导致网络训练失败。

 

#且看loss_weight,本文作者选择5个属性的重要性一样,所以每个0.2。

layer {

  name: "loss_attr1"

  type: "SoftmaxWithLoss"

  bottom: "bottom_predict1"

  bottom: "label_attr1"

  top: "loss_attr1"

  loss_weight: 0.2

}

 

本文的完整代码可在 作者个人的github主页 下载:

https://github.com/HolidayXue/CodeSnap/blob/master/convert_multilabel.cpp

多任务损失函数层的网络结构示意图如下图所示:

 

 

5. 总结

 

本文回顾了多任务学习的基本概念,并讨论了多任务深度学习的基本思想和应用案例。最后以开源深度学习平台Caffe为例讨论了多任务深度学习的实现,并给出了开源代码。

 

致谢

 

本文在投稿之后经历了三轮修改,其中一轮公众号编辑部初审,一轮双盲评审大改和一轮单盲评审小修,两名审稿专家对原文进行了全面仔细的阅读,帮助作者修正了文章的若干理论表述,给出了建设性的提高可读性的修改意见。在此本文作者对全体审稿人表示感谢,并对深度学习大讲堂公众号编辑部耐心细致的审稿服务表示感谢。

 

end

该文属于“深度学习大讲堂”原创,

如需要转载,请联系

loveholicguoguo

收藏 推荐 打印 | 录入:elainebo | 阅读:
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数
点评:
       
评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款