快捷搜索: 王者荣耀 脱发

多任务学习算法及代码实现


多任务学习 :共享相关任务表征

定义:基于共享表示(shared representation),把多个相关的任务放在一起学习的一种机器学习方法。

也就是说,基于某些层的参数共享,训练几个具有相似性的任务,然后给出每个任务的分类结果。

举例:比如我们要识别一张图像中的脸是否是人脸、哪种脸部表情、性别、年龄段。针对这个问题,可以用单个模型来预测单个任务,但是可能在数据量不够的情况下,可能会导致过拟合,但是由于这几个任务之间存在一些联系,因此可以考虑用多任务学习,让模型同时给出多个任务的结果。

在实际应用中,通常通过在所有任务之间共享隐藏层,同时保留几个特定任务的输出层来实现 多任务学习涉及多个相关的任务同时并行学习,梯度同时反向传播,多个任务通过底层的共享表示(shared representation)来互相帮助学习,提升泛化效果。

更多的应用举例

1.在金融或经济预测中较为常见,我们可能希望预测多种相关指标的值;

2.在生物信息学中同时预测多种疾病的症状。

3.识别图像中车的颜色、车型、姿态等,

网络结构

    硬共享机制:

在一个基学习器的最后一层加上多个特定的输出层,如softmax或者Dense层

具体的例子:天池fashionAI比赛用的模型

    Soft 参数共享机制

另一方面,在共享 Soft 参数时,每个任务都有自己的参数和模型。模型参数之间的距离是正则化的,以便鼓励参数相似化。例如使用 L2 距离进行正则化

keras实现多任务学习(硬共享机制)

base_model = VGG16(include_top=False, weights=imagenet,input_shape=(width, width, 3), pooling=max)
# for layer in base_model.layers[:16]:
#     layer.trainable = False

input_tensor = Input((width, width, 3))
x = input_tensor

x = Lambda(vgg16.preprocess_input)(x)
x = base_model(x)
x = Dropout(0.5)(x)

x = [Dense(count, activation=softmax, name=name)(x) for name, count in label_count.items()]

model = Model(input_tensor, x)

model.compile(optimizer=adam, loss=categorical_crossentropy, metrics=[acc])

多任务学习需要准备的数据不太一样

假设你要预测一个人的三种表情(笑,哭,萌)和性别

然后你有5张表情的图片,6张性别的图片

准备的标签的形状应该是(2,11)2表示两个任务。由于表情的图片,并没有性别的标签,所以就把性别的标签都设为零。

具体如下:

红色框中是5个表情样本的label,但是在没有性别信息,所以全都设为零

同理,蓝色框中是6个性别样本的label,但是在没有表情信息,所以全都设为零

对于模型预测输出的结果,你只关心它本来属于的那个类别即可。

更多相关的内容,可以看这篇

经验分享 程序员 微信小程序 职场和发展