Finetuning (немецкий) Bert. Это недостаточно?

Буду признателен за вашу помощь в решении проблемы, с которой я столкнулся прямо сейчас.

С помощью молнии и трансформаторов я настроил модель Берта на немецких сервисных талонах. Набор данных имеет следующий размер:

FULL Dataset: (1220, 2)
TRAIN Dataset: (854, 2)
VAL Dataset: (366, 2)

Каждый билет может относиться ровно к 1 из 10 категорий. Вот почему моя модель инициализирована в def init, например:

#changing the configuration to X lables instead of 2
self.bert = transformers.BertModel.from_pretrained(MODEL_NAME)
self.drop = th.nn.Dropout(p=0.1)
self.out = th.nn.Linear(self.bert.config.hidden_size, NUM_LABELS)
self.softmax = th.nn.Softmax(dim=1)
self.loss = th.nn.CrossEntropyLoss(reduction="none")

Это дает распределение вероятностей по 10 классам для каждой выборки. Поскольку прямая функция:

 def forward(self, input_ids, mask):
    _, pooled_output = self.bert(
                                input_ids=input_ids,
                                attention_mask=mask
                        )
    output= self.drop(pooled_output)
    output = self.out(output)
    return self.softmax(output)

Как функция потерь определяется torch.nn.CrossEntropyLoss и вызывается в пределах training_step. При Batch_Size, равном 16, logits.shape = [16,10] и batch['target']. Shape = [16] и batch['target'] = [1,5,2,4,8,6,9,0,0,1,2,7,7,7,5,3]. Является ли CrossEntropyLoss правильной функцией потерь? А оптимизатор вообще работает?

 def training_step(self, batch, batch_idx):
    logits = self.forward(batch['input_ids'], batch['mask']).squeeze()
    loss = self.loss(logits, batch['targets']).mean()
    return {'loss': loss, 'log': {'train_loss': loss}}

То же самое и с validation_step:

  def validation_step(self,batch, batch_idx):
      logits = self.forward(batch['input_ids'], batch['mask']).squeeze()
      acc = (logits.argmax(-1) == batch['targets']).float()
      loss = self.loss(logits, batch['targets'])
      return {'loss': loss, 'acc': acc}

В конце концов, модель дает одни и те же вероятности независимо от того, какую входную последовательность она получает. Это недостаточно?

Пример:

model.eval()
text = "Warum kann mein Kollege in SAP keine Transaktionen mehr     ausführen?"
input = tokenizer(            
   text,
   None,
   add_special_tokens=True,
   max_length=200,
   pad_to_max_length=True,
   return_token_type_ids=True,
   truncation=True,
   padding='max_length',
   return_tensors="pt"
   )

input = input.to(device)

out = model(input_ids=input['input_ids'], mask=input['attention_mask'])
text, out

    --> ('Warum kann mein Kollege in SAP keine Transaktionen mehr ausführen?',
 tensor([[2.9374e-03, 3.1926e-03, 8.7949e-03, 3.0573e-01, 2.6428e-04, 5.2946e-02,
      2.4758e-01, 6.2161e-03, 3.6930e-01, 3.0384e-03]], device='cuda:0',
    grad_fn=<SoftmaxBackward>))

И еще один пример:

    ('Auf meinem Telefon erscheinen keine Nummern mehr.',
 tensor([[2.9374e-03, 3.1926e-03, 8.7949e-03, 3.0573e-01, 2.6428e-04, 5.2946e-02,
          2.4758e-01, 6.2161e-03, 3.6930e-01, 3.0384e-03]], device='cuda:0',
        grad_fn=<SoftmaxBackward>))

Он немецкий, но, как видите, прогнозы точно совпадают. Что жаль:D И моя проблема. Спасибо всем миллион.

0 ответов

Другие вопросы по тегам