【问题标题】:How to Multi-Head learning如何进行多头学习
【发布时间】:2020-03-15 22:19:55
【问题描述】:

我有大约 5 个模型可以单独训练,但我想将它们融合在一起,以便拥有一个大模型。 我正在研究它,因为一个大模型比许多小模型更容易更新(在生产中) 这是我想要实现的图像。

我的问题是,这样可以吗? 每个头部模型有一个数据集,我应该如何训练整个模型?

【问题讨论】:

    标签: machine-learning deep-learning pytorch


    【解决方案1】:

    我的问题是,这样可以吗

    当然可以。这种方法称为multi-task learning。根据您的数据集和您正在尝试做的事情,它甚至可能会提高性能。 Microsoft 使用multi-task model 为 NLP Glue 基准测试取得了一些不错的结果,但他们还指出,您可以通过微调每个单独任务的联合模型来进一步提高性能。

    每个头部模型有一个数据集,我应该如何训练整个模型?

    你只需要 pytorch ModuleList:

    #please note this is just pseudocode and I'm not well versed with computer vision
    #therefore you need to check if resnet50 import is correct and look 
    #for the imports of the task specific stuff
    from torch import nn
    from torchvision.models import resnet50
    
    class MultiTaskModel(nn.Module):
        def __init__(self):
            #shared part
            self.resnet50 = resnet50()
    
            #task specific stuff
            self.tasks = nn.ModuleList()
            self.tasks.add_module('depth', Depth())
            self.tasks.add_module('denseflow', Denseflow())
            #...
    
        def forward(self, tasktag, ...):
            #shared part
            resnet_output = self.resnet50(...)
    
            #task specific parts
            if tasktag == 'depth':
                return self.tasks.depth(resnet_output)
            elif tasktag == 'denseflow':
                return self.tasks.denseflow(resnet_output)
            #...
    

    【讨论】:

    • 是的,但是在这里您正在为特定任务创建特定权重吗?我想要的是让所有模型权重重新组合到一个权重文件中,因此每次我为特定任务训练模型时只是一种微调整个重量
    • 这个类MultiTaskModel只会创建一个模型(即一个权重文件),但是你真的必须在对一个任务进行微调之后检查每个任务的准确性,如果它仍然可以接受。
    【解决方案2】:

    您可以查看Detectron2 项目,特别是joined in 的模型。

    很有可能他们使用的一些想法你也可以使用。

    将模型融合在一起意味着定义主模型(包含子模型)的输入和输出。

    【讨论】:

      猜你喜欢
      • 2018-05-26
      • 1970-01-01
      • 2021-12-17
      • 1970-01-01
      • 2013-03-06
      • 2018-12-04
      • 2017-05-20
      • 1970-01-01
      • 2020-10-07
      相关资源
      最近更新 更多