Обучение NN поверх кэшированных вложений из предварительно обученной модели, потери не снижаются?

#neural-network #pytorch

Вопрос:

У меня есть несколько вложений, которые являются результатом предварительно обученной модели, сохраненной на диске. Я пытаюсь выполнить задачу двоичной классификации «принять/отклонить». Я обучил простую нейронную сеть выполнять классификацию, однако через некоторое время я не вижу никакого уменьшения потерь.

Вот мой NN, кэшированные вложения имеют форму 512:

 from transformers.modeling_outputs import SequenceClassifierOutput
class ClassNet(nn.Module):
    def __init__(self, num_labels=2):
        super(ClassNet, self).__init__()
        self.num_labels = num_labels
        self.classifier = nn.Sequential(
            nn.Linear(512, 256, bias=True),
            nn.ReLU(inplace=True),
            nn.Dropout(p=.5, inplace=False),
            nn.Linear(256, 128, bias=True),
            nn.ReLU(inplace=True),
            nn.Dropout(p=.5, inplace=False),
            nn.Linear(128, num_labels, bias=True)
        )
    def forward(self, inputs):
        
        return self.classifier(inputs)
 

Это какая-то случайная архитектура, к которой я пытаюсь приспособиться, но, похоже, сетевое плато быстро зависит от обучающих данных. Может быть, мои данные слишком сложны?

вот мой тренировочный цикл:

 optimizer = optim.Adam(model.parameters(), lr=1e-4,weight_decay=5e-3) #  L2 regularization
loss_fct=nn.CrossEntropyLoss()

model.train()
for epoch in range(10):  # loop over the dataset multiple times
    running_loss = 0.0
    for i, data in enumerate(train_loader):
        # get the inputs; data is a list of [inputs, labels]
        inputs, labels = data['embeddings'], data['labels']

        # zero the parameter gradients
        optimizer.zero_grad()
        outputs = model(inputs)
        logits = outputs.squeeze(1)
        loss = loss_fct(logits, labels.squeeze())
        loss.backward()
        optimizer.step()
        
        running_loss  = loss.item()
        if i % 2000 == 1999:    # print every 2000 mini-batches
            print('[%d, ]] loss: %.3f' %
                  (epoch   1, i   1, running_loss / 2000))
            running_loss = 0.0
        

print('Finished Training')
 

Потеря застряла на отметке 0,4 и на самом деле совсем не уменьшается через целую эпоху.

Чтобы дать небольшой контекст, предварительно обученные вложения являются выводом специально обученной модели ViT из HuggingFace, я пытаюсь выполнить задачу классификации непосредственно на выводах этой модели, построив поверх нее простую нейронную сеть.

Может ли кто-нибудь посоветовать, что происходит не так? Кроме того, если у кого-нибудь есть какие-либо предложения по повышению точности, я бы с удовольствием их выслушал.

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

1. Сколько эпох? Как долго длится тренировка? Какую ценность это num_labels имеет?

2. Я делаю это в течение 10 эпох, обучение занимает около 15 минут, а num_labels равно 2 (двоичная классификация).

3. Строили ли вы функцию потерь при обучении на итерациях (или эпохах)? Кроме того, вы вычисляете потери и/или показатели в наборе проверки?