多任务学习Demo

多任务学习简述

  • 什么是多任务学习

    • 多任务学习(Multi-Task Learning)顾名思义就是把多个任务放在一起学习,即对多个任务的目标一起联合建模并训练
    • 我们的大脑工作机制也是如此,我们时刻都在进行着多任务学习,而且不同任务之间在相互影响着。比如学习英语和法语,你学习其中的一门语言是有助于另一门语言的学习的。
  • 为什么要多任务学习

    • 多任务学习可以将多个任务联合训练,只需一个流程就可以实现多个任务的学习
    • 多任务学习可以挖掘不同任务间的联系,通过共享特征的方式实现迁移学习
    • 多任务学习一定程度上对其中的任务进行泛化,使得模型不容易过拟合

Tensorflow实现

  • 示例图

    • 先来看一个在深度学习中的双任务学习示例图
    • image-20181226170910249
    • 如图所示,两个任务除了有各自的TaskLayer参数,还有个共享参数层SharedLayer,那么这样的网络如何来训练呢?下面介绍两种训练方法以及代码实现
  • 交替训练 Alternative Trainning

    • 如图所示,交替训练的意思就是在迭代训练中你来我往地交替进行各自的loss学习,阅读下面的代码就可以一目了然了。
    • image-20181226171354726
    • 代码
    # Import Tensorflow and Numpy
    import tensorflow as tf
    import numpy as np
    
    # ======================
    # Define the Graph
    # ======================
    
    # Define the Placeholders
    X = tf.placeholder("float", [10, 10], name="X")
    Y1 = tf.placeholder("float", [10, 20], name="Y1")
    Y2 = tf.placeholder("float", [10, 20], name="Y2")
    
    # Define the weights for the layers
    initial_shared_layer_weights = np.random.rand(10,20)
    initial_Y1_layer_weights = np.random.rand(20,20)
    initial_Y2_layer_weights = np.random.rand(20,20)
    
    shared_layer_weights = tf.Variable(initial_shared_layer_weights, name="share_W", dtype="float32")
    Y1_layer_weights = tf.Variable(initial_Y1_layer_weights, name="share_Y1", dtype="float32")
    Y2_layer_weights = tf.Variable(initial_Y2_layer_weights, name="share_Y2", dtype="float32")
    
    # Construct the Layers with RELU Activations
    shared_layer = tf.nn.relu(tf.matmul(X,shared_layer_weights))
    Y1_layer = tf.nn.relu(tf.matmul(shared_layer,Y1_layer_weights))
    Y2_layer = tf.nn.relu(tf.matmul(shared_layer,Y2_layer_weights))
    
    # Calculate Loss
    Y1_Loss = tf.nn.l2_loss(Y1-Y1_layer)
    Y2_Loss = tf.nn.l2_loss(Y2-Y2_layer)
    Joint_Loss = Y1_Loss + Y2_Loss
    
    # optimisers
    Optimiser = tf.train.AdamOptimizer().minimize(Joint_Loss)
    Y1_op = tf.train.AdamOptimizer().minimize(Y1_Loss)
    Y2_op = tf.train.AdamOptimizer().minimize(Y2_Loss)
    
    with tf.Session() as session:
        session.run(tf.initialize_all_variables())
        for iters in range(10000):
            if np.random.rand() < 0.5:
                _, Y1_loss = session.run([Y1_op, Y1_Loss],
                                {
                                  X: np.random.rand(10,10)*10,
                                  Y1: np.random.rand(10,20)*10,
                                  Y2: np.random.rand(10,20)*10
                                  })
                print("iteration:{}, y1_loss:{}".format(iters, Y1_loss))
            else:
                _, Y2_loss = session.run([Y2_op, Y2_Loss],
                                {
                                  X: np.random.rand(10,10)*10,
                                  Y1: np.random.rand(10,20)*10,
                                  Y2: np.random.rand(10,20)*10
                                  })
                print("iteration:{}, y2_loss:{}".format(iters, Y2_loss))
        session.close()
    
    • 什么时候选择交替训练呢?当不同任务有各自的训练数据时,就可以对不同的任务输入各自的数据,而无需去构造一份专门的数据。如果不同任务的数据集数量差距太大时,此时模型会偏向于数据量大的任务。
  • 联合训练 Joint Training

    • 当你有一份数据带有不同的标签时,就可以对多任务同时进行训练了,怎么做到呢,很简单,只需要把不同任务的loss做一个加权和即可。
    • image-20181226172718441
    • 代码
    # Import Tensorflow and Numpy
    import tensorflow as tf
    import numpy as np
    
    # ======================
    # Define the Graph
    # ======================
    
    # Define the Placeholders
    X = tf.placeholder("float", [10, 10], name="X")
    Y1 = tf.placeholder("float", [10, 20], name="Y1")
    Y2 = tf.placeholder("float", [10, 20], name="Y2")
    
    # Define the weights for the layers
    
    initial_shared_layer_weights = np.random.rand(10,20)
    initial_Y1_layer_weights = np.random.rand(20,20)
    initial_Y2_layer_weights = np.random.rand(20,20)
    
    shared_layer_weights = tf.Variable(initial_shared_layer_weights, name="share_W", dtype="float32")
    Y1_layer_weights = tf.Variable(initial_Y1_layer_weights, name="share_Y1", dtype="float32")
    Y2_layer_weights = tf.Variable(initial_Y2_layer_weights, name="share_Y2", dtype="float32")
    
    # Construct the Layers with RELU Activations
    shared_layer = tf.nn.relu(tf.matmul(X,shared_layer_weights))
    Y1_layer = tf.nn.relu(tf.matmul(shared_layer,Y1_layer_weights))
    Y2_layer = tf.nn.relu(tf.matmul(shared_layer,Y2_layer_weights))
    
    # Calculate Loss
    Y1_Loss = tf.nn.l2_loss(Y1-Y1_layer)
    Y2_Loss = tf.nn.l2_loss(Y2-Y2_layer)
    Joint_Loss = 0.5*Y1_Loss + 0.5*Y2_Loss
    
    # optimisers
    Optimiser = tf.train.AdamOptimizer().minimize(Joint_Loss)
    Y1_op = tf.train.AdamOptimizer().minimize(Y1_Loss)
    Y2_op = tf.train.AdamOptimizer().minimize(Y2_Loss)
    
    # Joint Training
    # Calculation (Session) Code
    # ==========================
    
    # open the session
    with tf.Session() as session:
        session.run(tf.initialize_all_variables())
        for iters in range(10000):
            _, Joint_loss = session.run([Optimiser, Joint_Loss],
                        {
                          X: np.random.rand(10,10)*10,
                          Y1: np.random.rand(10,20)*10,
                          Y2: np.random.rand(10,20)*10
                          })
            print("iteration:{}, joint_loss:{}".format(iters, Joint_loss))
        session.close()
    

参考文献

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容