作者 | Kajal Gupta
编译 | 聂震坤
作为机器学习下的一个分支,多任务学习的目标是让机器能同时处理多个任务。机器同时学习两个任务,而这两个任务又有助于学习其他任务。因为人可以同时处理多个任务,所以这也是机器模仿人类智慧的一种方式。对人来说,这些运算发生在复杂的大脑中,数十亿个神经元细胞进行相互作用。
多年来,研究者试图在机器学习领域效仿这一方法,这便是神经网络。当神经网络处理类似预测颜色的任务时,多任务可以极大地提高效率,因为它有助于分享跨任务的资源与参数,还减少了分开训练模型的时间。
进行多任务学习的四个步骤
-
创建数据集
-
建立神经网络架构
-
定义多任务丢失功能
-
训练
提出问题
为了执行这个任务,可提出一个简单的问题陈述:假设你想预测一朵花(玫瑰或雏菊)的类型以及它的颜色(红色,粉红色或白色)。这个问题完全适合多任务学习,因为我们希望在同一个网络中同时执行两件事情。在一个推论的结尾,将有两个分类的结果 - 花的类型及其颜色。
1.
创建数据集
对于所有的训练任务来说,最优先最重要的便是数据集。我们需要使用这个数据来训练神经网络。由于这是一个监督学习任务,数据还将包括每个图像的正确标签。
对于这个任务,将需要两个标签:花型和颜色的图像。用玫瑰和雏菊的谷歌图片,颜色为红色,粉红色和白色。最后,有三种不同颜色的玫瑰和雏菊的3200张图像。
在此步骤之后,需要将此数据集进行培训,验证和测试。我选择使用60%的图像用于训练,25%的图像用于验证,剩余的15%用于测试。我创建了三个单独的文本文件并存储了三个信息:图像路径、花型和颜色标签。花标签0将与玫瑰相关联,1关联菊花,彩色标签分别为0,1和2,分别为红色、粉红色和白色。
因此最后train.txt文件看起来是这样的:
/data/img1.jpg,0, 1
/data/img2.jpg,1, 2
/data/img3.jpg,1, 2
/data/img4.jpg,0, 0
/data/img5.jpg,0, 1
/data/img6.jpg,1, 1
.
.
.
2. 建立神经网络架构
在定义神经网络架构之前,应当首先将其可视化以便于理解:
在上图中,隐藏的节点称为“共享层”,因为这些层的重要性对于这两个任务是相同的。然后,我们有“任务特定层”,其中分别执行与每个任务相关的计算,而不在层之间共享参数。在这些任务特定的层中,特定的神经网络学习特定任务的信息。这些独立任务层中的每一个节点都有不同的输出。在此例子中,一个节点预测花朵为玫瑰或雏菊,另一个预测花的颜色是红色、粉红色或白色。
为了定义这个架构,我在TensorFlow中定义了SqueezeNet_v1.1体系结构,并修改了最后一层以执行多任务学习。我使用层直到fire8作为共享层,并在fire8作为界限将剩下层进行拆分,并将两个复制的剩余层分成两个任务。所以最终网络层看起来像这样: