深度学习中的多任务学习(二)

浅谈多任务学习(Multi-task Learning)

Reference
https://www.jianshu.com/p/a6cf116c1bde

1. 多任务学习的概念

在这里插入图片描述
单任务学习(single task learning):一个loss,一个任务,例如NLP里的情感分类、NER任务一般都是可以叫单任务学习。

多任务学习(multi task learning):简单来说有多个目标函数loss同时学习的就算多任务学习。例如现在大火的短视频,短视频APP在向你展示一个大长腿/帅哥视频之前,通常既要预测你对这个视频感兴趣/不感兴趣,看多久,点赞/不点赞,转发/不转发等多个维度的信息。这么多任务既可以每个任务都搞一个模型来学,也可以一个模型多任务学习来一次全搞定的。

2.多任务学习(Multi-task learning)的两种模式

深度学习中两种多任务学习模式:隐层参数的硬共享与软共享。

  • 隐层参数硬共享,指的是多个任务之间共享网络的同几层隐藏层,只不过在网络的靠近输出部分开始分叉去做不同的任务。
  • 隐层参数软共享,不同的任务使用不同的网络,但是不同任务的网络参数,采用距离(L1,L2)等作为约束,鼓励参数相似化。

而本次的代码实现采用的是隐层参数硬共享,也就是两个任务共享网络浅层的参数。

3. 多任务学习keras实现

这里笔者简单的介绍一下如何通过keras简单的搭建一个多任务学习网络。

这里笔者的目标任务是一个10分类的关系分类任务,对关系分类任务不是很了解的同学可以移步到笔者之前的文章中去了解一下,而我将训练文本中两个存在关系的实体(entity)标了出来,在模型中加了一个命名体识别(NER)任务构成了多任务学习模型。
笔者的网络架构如下图所示:

  • 句子向量和位置向量拼接构成模型的输入,
  • 经过一层共享的LSTM编码层,后模型开始分叉,
  • 其中一条路径是经过一层MaxPooling和以及全连接层后输出文本分类的预测输出,
  • 另外一条路径是经过一层CRF层后输出命名实体识别的预测输出。

在这里插入图片描述

模型代码部分
这里模型构建不需要注意,笔者这里强调的是:

  • 各个任务的输出层一定要命名,比如笔者这个模型的文本分类任务的输出层Dense(10, activation=‘softmax’,name = “out1”)(out1)中的name =“out1”,以及NER的输出层crf = CRF(2, sparse_target=True,name =“crf_output”)中的name ="crf_output"不能省略。
  • 第二个就是model.compile中的loss和loss的权重需要和任务输出层的name进行对应,如下: loss={‘out1’: ‘categorical_crossentropy’,‘crf_output’: crf.loss_function} loss_weights={‘out1’:1, ‘crf_output’: 1}
from keras.layers import Input,LSTM,Bidirectional,Dense,Dropout,Concatenate,Embedding,GlobalMaxPool1D
from keras.models import Model
from keras_contrib.layers import CRF
import keras.backend as K
from keras.utils import plot_model

K.clear_session()
maxlen = 40
###输入
inputs = Input(shape=(maxlen,768),name="sen_emb")
pos1_en = Input(shape=(maxlen,),name="pos_en1_id")
pos2_en = Input(shape=(maxlen,),name="pos_en2_id")
pos1_emb = Embedding(maxlen,8,input_length=maxlen,name = "pos_en1_emb")(pos1_en)
pos2_emb = Embedding(maxlen,8,input_length=maxlen,name = "pos_en2_emb")(pos2_en)
x = Concatenate(axis=2)([inputs,pos1_emb,pos2_emb])

###参数共享部分
x = Bidirectional(LSTM(128,return_sequences=True))(x)

###任务一,10分类的文本分类任务
out1 = GlobalMaxPool1D()(x)
out1 = Dense(64, activation='relu')(out1)
out1 = Dropout(0.5)(out1)
out1 = Dense(10, activation='softmax',name = "out1")(out1)

###任务二,实体识别任务
crf = CRF(2, sparse_target=True,name ="crf_output")
crf_output = crf(x)

###模型有两个输出out1,crf_output
model = Model(inputs=[inputs,pos1_en,pos2_en], outputs=[out1,crf_output])
model.summary()

###模型有两个loss,categorical_crossentropy和crf.loss_function
model.compile(optimizer='adam',
              loss={'out1': 'categorical_crossentropy','crf_output': crf.loss_function},
              loss_weights={'out1':1, 'crf_output': 1},
              metrics=["acc"])
plot_model(model,to_file="model.png")
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值