如何解决或者在pytorch中训练多任务学习模型-权重更新
我想在两个具有不同输入和目标的相关数据集上建立多任务学习模型。这两个任务是共享较低级别的层,但具有不同的标头层,这是一个最小的示例:
class MultiMLP(nn.Module):
"""
A simple dense network for MTL on hard parameter sharing.
"""
def __init__(self):
super().__init__()
self.hidden = nn.Linear(100,200)
self.out_task0= nn.Linear(200,1)
self.out_task0= nn.Linear(200,1)
def forward(self,x):
x = self.hidden(x)
x = F.relu(x)
y_task0 = self.out_task0(x)
y_task1 = self.out_task1(x)
return [y_task0,y_task1]
构造数据加载器,以便从两个数据集交替生成批处理,即从 task 0 ,生成 batch 0、2、4,... 任务1 中的第1、3、5,... 批处理。我想以此方式训练网络:仅更新{em>任务0 的批次的hidden
层和out_task0
的权重,并且仅更新hidden
和{{ 1}}用于任务1 。
然后在训练过程中,我依次切换out_task1
进行相应的任务,如下所示。 但是我发现每次迭代都会更新所有权重。
requires_grad
我是否错过了培训过程中的任何内容?还是整体设置不起作用?
解决方法
免责声明:PyTorch Forum已回答了该问题,如果有人遇到相同的问题,我将这些内容放在一起,功劳归功于ptrblk
该问题可能是由随机梯度下降(sgd)的任何变体引起的,这些变体利用了先前步骤中的梯度,例如,具有动量(sgd-m)的随机梯度下降,内斯特罗夫加速梯度(NAG),Adagrad,RMSprop,Adam等等。步骤t
的归零坡度不会影响依赖于历史坡度的项。因此权重仍会使用发布的问题中的设置进行更新。
从下面的代码示例中可以看到这一点。
model = nn.Linear(1,1,bias=False)
#optimizer = torch.optim.SGD(model.parameters(),lr=1.,momentum=0.) # same results for w1 and w2
optimizer = torch.optim.SGD(model.parameters(),momentum=0.5) # w2 gets updated
#optimizer = torch.optim.Adam(model.parameters(),lr=1.) # w2 gets updated
w0 = model.weight.clone()
out = model(torch.randn(1,1))
out.mean().backward()
optimizer.step()
w1 = model.weight.clone()
optimizer.zero_grad()
print(model.weight.grad)
optimizer.step()
w2 = model.weight.clone()
print(w1 - w0)
print(w2 - w1)
对于本机SGD优化器,w2和w1相同。但是SGD-M和Adam并非如此。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。