Ошибка «RuntimeError: элемент 0 тензоров не требует градации и не имеет grad_fn » ошибка BertFoeSequenceClassification

#nlp #pytorch #bert-language-model #huggingface-transformers #pre-trained-model

#nlp #pytorch #bert-language-model #huggingface-трансформеры #предварительно обученная модель

Вопрос:

Я пытаюсь построить модель Bert для задачи классификации арабского текста, используя предварительно подготовленную модель из https://github.com/alisafaya/Arabic-BERT я хочу знать точную разницу между этими двумя утверждениями:

 model_name = 'kuisailab/albert-large-arabic' 
model = AutoModel.from_pretrained(model_name)
model = BertForSequenceClassification .from_pretrained(model_name)
 

Я доработал модель, добавив следующие слои поверх модели:

 for param in model.parameters():
    param.requires_grad = False

model.classifier = nn.Sequential(
nn.Dropout(0.5),
nn.ReLU(),
nn.Linear(768,512),
nn.Linear(512,2), 
nn.LogSoftmax(dim=1), 
nn.Softmax(dim=1)
)
model = model.to(device)
 

и использовал оптимизатор:

 optimizer = AdamW(model.parameters(),
                  lr = 2e-5) 
 

наконец, это мой цикл обучения:

 model.train()

for idx, row in train_data.iterrows():
    text_parts = preprocess_text(str(row['sentence']))
    label = torch.tensor([row['label']]).long().to(device)

    optimizer.zero_grad()

    overall_output = torch.zeros((1, 2)).float().to(device)
    for part in text_parts:
        if len(part) > 0:
            try:
                input = part.reshape(-1)[:512].reshape(1, -1)
                # print(input.shape)
                overall_output  = model(input, labels=label)[1].float().to(device)
            except Exception as e:
                print(str(e))

#     overall_output /= len(text_parts)
    overall_output = F.softmax(overall_output[0], dim=-1)

    if label == 0:
        label = torch.tensor([1.0, 0.0]).float().to(device)
    elif label == 1:
        label = torch.tensor([0.0, 1.0]).float().to(device)

    # print(overall_output, label)

    loss = criterion(overall_output, label)
    total_loss  = loss.item()
    
    loss.backward()
    optimizer.step()
 

и я получаю ошибку:

 mat1 dim 1 must match mat2 dim 0
---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
<ipython-input-33-5c2f0fea6c1f> in <module>()
     39     total_loss  = loss.item()
     40 
---> 41     loss.backward()
     42     optimizer.step()
     43 

1 frames
/usr/local/lib/python3.6/dist-packages/torch/autograd/__init__.py in backward(tensors, grad_tensors, retain_graph, create_graph, grad_variables)
    130     Variable._execution_engine.run_backward(
    131         tensors, grad_tensors_, retain_graph, create_graph,
--> 132         allow_unreachable=True)  # allow_unreachable flag
    133 
    134 

RuntimeError: element 0 of tensors does not require grad and does not have a grad_fn 
 

есть идеи, как решить эту ошибку

Комментарии:

1. С какой ошибкой вы столкнулись?

2. Ошибка «RuntimeError: элемент 0 тензоров не требует grad и не имеет grad_fn» после того, как я использовал Automodel, я получаю эту ошибку

3. Какая ваша model_name ?

4. ‘kuisailab / albert-base-arabic’ предварительно подготовленная модель для арабского текста

5. Я также получаю ту же ошибку, когда я использовал большую версию модели: «kuisailab / albert-large-arabic» у вас есть какие-либо идеи, почему это

Ответ №1:

BertForSequenceClassification является классом, который расширяет BertModel , т.е. BertForSequenceClassification Определяет уровень логистической регрессии, для задачи классификации с потерей кросс-энтропии, которая должна быть совместно настроена или обучена на существующей модели Bert.

AutoModel , — это класс, предоставляемый в библиотеке, который позволяет автоматически идентифицировать класс модели на основе его имени или содержимого файла модели.

Поскольку вы уже знаете, что вам нужна модель для классификации, вы можете напрямую использовать BertForSequenceClassification

Комментарии:

1. Итак, я могу использовать BertForSequenceClassification, когда моей задачей является классификация для любой модели bert, верно?

2. Если быть точным, вы используете модель АЛЬБЕРТА, следовательно, вам необходимо использовать AlbertForSequenceClassification