#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