词义消歧任务的Pytorch BCE损失不减少

词义消歧任务的Pytorch BCE损失不减少,pytorch,classification,word-sense-disambiguation,Pytorch,Classification,Word Sense Disambiguation,我正在进行词义消歧,并创建了自己的30万个最常见英语单词的词汇表。我的模型非常简单,句子中的每个单词(它们各自的索引值)都通过一个嵌入层,该嵌入层嵌入单词并平均结果嵌入。然后通过线性层发送平均嵌入,如下面的模型所示 class TestingClassifier(nn.Module): def __init__(self, vocabSize, features, embeddingDim): super(TestingClassifier, self).__init__()

我正在进行词义消歧,并创建了自己的30万个最常见英语单词的词汇表。我的模型非常简单,句子中的每个单词(它们各自的索引值)都通过一个嵌入层,该嵌入层嵌入单词并平均结果嵌入。然后通过线性层发送平均嵌入,如下面的模型所示

class TestingClassifier(nn.Module):
  def __init__(self, vocabSize, features, embeddingDim):
      super(TestingClassifier, self).__init__()
      self.embeddings = nn.Embedding(vocabSize, embeddingDim)
      self.linear = nn.Linear(features, 2)
      self.sigmoid = nn.Sigmoid()

  def forward(self, inputs):
      embeds = self.embeddings(inputs)
      avged = torch.mean(embeds, dim=-1)
      output = self.linear(avged)
      output = self.sigmoid(output)
      return output
我将BCELoss作为损失函数运行,SGD作为优化器运行。我的问题是,随着训练的进行,我的损失几乎没有减少,几乎就好像它收敛于一个非常高的损失。我尝试过不同的学习率(0.0001、0.001、0.01和0.1),但我遇到了相同的问题

我的培训职能如下:

def train_model(model, 
                optimizer,
                lossFunction,
                batchSize, 
                epochs, 
                isRnnModel, 
                trainDataLoader, 
                validDataLoader, 
                earlyStop = False, 
                maxPatience = 1
):

  validationAcc = []
  patienceCounter = 0
  stopTraining = False
  model.train()

  # Train network
  for epoch in range(epochs):
    losses = []
    if(stopTraining):
      break

    for inputs, labels in tqdm(trainDataLoader, position=0, leave=True):

      optimizer.zero_grad()

      # Predict and calculate loss
      prediction = model(inputs)
      loss = lossFunction(prediction, labels)
      losses.append(loss)

      # Backward propagation
      loss.backward()

      # Readjust weights
      optimizer.step()

    print(sum(losses) / len(losses))
    curValidAcc = check_accuracy(validDataLoader, model, isRnnModel) # Check accuracy on validation set
    curTrainAcc = check_accuracy(trainDataLoader, model, isRnnModel)
    print("Epoch", epoch + 1, "Training accuracy", curTrainAcc, "Validation accuracy:", curValidAcc)

    # Control early stopping
    if(earlyStop):
      if(patienceCounter == 0):
        if(len(validationAcc) > 0 and curValidAcc < validationAcc[-1]):
          benchmark = validationAcc[-1]
          patienceCounter += 1
          print("Patience counter", patienceCounter)
      
      elif(patienceCounter == maxPatience):
        print("EARLY STOP. Patience level:", patienceCounter)
        stopTraining = True

      else:
        if(curValidAcc < benchmark):
          patienceCounter += 1
          print("Patience counter", patienceCounter)
        
        else:
          benchmark = curValidAcc
          patienceCounter = 0

      validationAcc.append(curValidAcc)
def列_型号(型号、,
优化器,
失去功能,
批量大小,
时代,
ISRNN模型,
列车数据装载机,
validDataLoader,
earlyStop=False,
maxPatience=1
):
validationAcc=[]
patienceCounter=0
停止训练=错误
模型列车()
#列车网络
对于范围内的历元(历元):
损失=[]
如果(停止培训):
打破
对于输入,TQM中的标签(trainDataLoader,position=0,leave=True):
optimizer.zero_grad()
#预测和计算损失
预测=模型(输入)
损耗=损耗功能(预测、标签)
损失。追加(损失)
#反向传播
loss.backward()
#重新调整重量
optimizer.step()
打印(总额(损失)/长度(损失))
curValidAcc=检查精度(validDataLoader、模型、ISRNModel)#检查验证集的精度
curTrainAcc=检查精度(列车数据装载机、车型、ISRNN车型)
打印(“历元”,历元+1,“训练精度”,curTrainAcc,“验证精度:”,curValidAcc)
#控制提前停车
如果(早期停止):
如果(patienceCounter==0):
如果(len(validationAcc)>0且曲线alidacc

批量大小为32(训练集包含8000行),词汇大小为300k,嵌入维度为24。我曾尝试向网络中添加更多线性层,但没有任何区别。即使经过多次训练,训练集和验证集的预测精度仍保持在50%左右(这很糟糕)。非常感谢您的帮助

为什么您不只是使用手电筒。平均值(输入,dim)
??如果它的大小不正确,那么你应该使用类似于
torch.mean(input.view(batch_size,-1),dim=1)
的东西。是的,我会这样做(编辑了代码)…但不幸的是,这对我的问题没有帮助。你使用的是用于二进制数据的BCE,但是你有两个输出。您应该将自己限制为具有两个类(0和1)的一个输出。那么你的损失应该更能代表你手头的问题。