分类器网络似乎"Forgetting"较旧的样本



这是一个奇怪的问题:想象一个神经网络分类器。它是一个简单的线性层,后面跟着一个输入大小为64,输出大小为112的sigmoid激活。还有112个训练样本,我希望输出是一个单热向量。所以训练循环的基本结构如下所示,其中samples是一个整数索引列表:

model = nn.Sequential(nn.Linear(64,112),nn.Sequential())
loss_fn = nn.BCELoss()
optimizer = optim.AdamW(model.parameters(),lr=3e-4)
for epoch in range(500):
for input_state, index in samples:
one_hot = torch.zeros(112).float()
one_hot[index] = 1.0
optimizer.zero_grad()
prediction = model(input_state)
loss = loss_fn(prediction,one_hot)
loss.backward()
optimizer.step()

这个模型没有表现得很好,但我不认为这是模型本身的问题,而是它是如何训练的。我认为这是因为大多数情况下,所有的one_hot张量都是零,模型倾向于所有的输出都是零,这就是发生的事情。问题变成了:"如何解决这个问题?"我尝试对所有样本使用平均损失,但无济于事。我该怎么做?

这很尴尬,但答案实际上在于我如何处理我的数据。这是一个文本输入项目,所以我使用基本的python列表来创建消息块,但是当我这样做的时候,我最终使网络得到的所有输入都是相同的,但每次输出都不同。我用复制方法解决了这个问题。

最新更新