Deep learning 有没有更好的方法来计算多任务DNN建模的损失?

Deep learning 有没有更好的方法来计算多任务DNN建模的损失?,deep-learning,pytorch,multitasking,loss,mse,Deep Learning,Pytorch,Multitasking,Loss,Mse,假设在多任务深度学习中有1000多个任务。超过一千列的标签。在这种情况下,每个任务(列)都有特定的权重。使用下面的代码段,在每个任务上循环计算损失的总和需要很长时间 criterion = nn.MSELoss() 这个数据集相当小。数据集有10K行和1024列,标签是10K*160稀疏矩阵。这160列中的每一列都是一项任务。批量大小为32。以下是输出、标签、权重的形状: len(outputs[0]), len(outputs) (32, 160) weights.shape torch.S

假设在多任务深度学习中有1000多个任务。超过一千列的标签。在这种情况下,每个任务(列)都有特定的权重。使用下面的代码段,在每个任务上循环计算损失的总和需要很长时间

criterion = nn.MSELoss()
这个数据集相当小。数据集有10K行和1024列,标签是10K*160稀疏矩阵。这160列中的每一列都是一项任务。批量大小为32。以下是输出、标签、权重的形状:

len(outputs[0]), len(outputs)
(32, 160)
weights.shape
torch.Size([160])
labels.shape
torch.Size([32, 160])
但我真正想尝试的是一个数据集,它有超过1M行、1024个特性和超过10K个标签。标签当然是稀疏的

**update**
Thanks for you suggestions and code, Shai. I modified the code a little bit as follows, but the loss was the same as your code.


您的损失与以下情况有何不同:

all_out=torch.cat([o_[:,None]用于o_-in输出),dim=1)#all_-out的形状为32x160
所有屏蔽=标签>=0
err=(所有输出标签)**2原始L2
err=所有掩码*err#仅掩码err中的相关条目
err=err*weights[None,:]#为每个任务加权
err=err.sum()

这里的总和可能有一个小问题-您可能需要根据
all\u mask

的每一列中
1
s的数量进行加权,您的损失与:

all_out=torch.cat([o_[:,None]用于o_-in输出),dim=1)#all_-out的形状为32x160
所有屏蔽=标签>=0
err=(所有输出标签)**2原始L2
err=所有掩码*err#仅掩码err中的相关条目
err=err*weights[None,:]#为每个任务加权
err=err.sum()

这里的求和可能有一个小问题-您可能需要根据
all\u mask

的每列
1
s的数量进行加权,谢谢Shai。我终于明白了。下面是自定义函数运行良好的示例。我正在做回归,在这个例子中-100被用作面具

def MSELoss2(outputs, labels, weights):
    #This one works perfectly
    all_out = torch.cat(outputs).view(len(outputs), -1).T
    all_mask = labels != -100.0
    mask_nums = all_mask.sum(axis=0)
    err = (all_out - labels) ** 2  # raw L2 
    err = err * weights[None, :]  # weight each task
    err = err / mask_nums[None, :]
    return torch.sum(err[all_mask]) 

谢谢,谢。我终于明白了。下面是自定义函数运行良好的示例。我正在做回归,在这个例子中-100被用作面具

def MSELoss2(outputs, labels, weights):
    #This one works perfectly
    all_out = torch.cat(outputs).view(len(outputs), -1).T
    all_mask = labels != -100.0
    mask_nums = all_mask.sum(axis=0)
    err = (all_out - labels) ** 2  # raw L2 
    err = err * weights[None, :]  # weight each task
    err = err / mask_nums[None, :]
    return torch.sum(err[all_mask]) 

输出
标签
权重的
形状
是什么?谢谢您的评论。问题已更新。
输出
标签
权重
形状
是什么?谢谢您的评论。问题已更新。``def MSELOS2(输出、标签、权重):#此项功能非常有效所有输出=火炬。cat(输出)。视图(透镜(输出),-1)。T所有掩码=标签!=-100.0 mask_nums=all_mask.sum(axis=0)err=(all_out-labels)**2#raw L2 err=err*weights[None,:]#权重每个任务err=err/mask_nums[None,:]返回torch.sum(err[all_mask])`@user7725010请不要在注释中发布代码。编辑您的问题,而不是“``def MSELOS2(输出、标签、权重):#这一个可以完美地工作所有输出=火炬。猫(输出)。视图(透镜(输出),-1)。T所有掩码=标签!=-100.0 mask_nums=all_mask.sum(axis=0)err=(all_out-labels)**2#raw L2 err=err*weights[None,:]#权重每个任务err=err/mask_nums[None,:]返回torch.sum(err[all_mask])`@user7725010请不要在注释中发布代码。改为编辑您的问题
A newly raised question is the loss can't get back propagated. Only the loss of the first batch was calculated. The following batches got a loss of 0.0.

Epoch: [1/20], Step: [1/316], Loss: 4.702103614807129
Epoch: [1/20], Step: [2/316], Loss: 0.0
Epoch: [1/20], Step: [3/316], Loss: 0.0
Epoch: [1/20], Step: [4/316], Loss: 0.0
Epoch: [1/20], Step: [5/316], Loss: 0.0
The loss was 0 and outputs was 32* 160 of nan after the first batch.


def MSELoss2(outputs, labels, weights):
    #This one works perfectly
    all_out = torch.cat(outputs).view(len(outputs), -1).T
    all_mask = labels != -100.0
    mask_nums = all_mask.sum(axis=0)
    err = (all_out - labels) ** 2  # raw L2 
    err = err * weights[None, :]  # weight each task
    err = err / mask_nums[None, :]
    return torch.sum(err[all_mask])