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 И моя проблема. Спасибо всем миллион.