#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. Строили ли вы функцию потерь при обучении на итерациях (или эпохах)? Кроме того, вы вычисляете потери и/или показатели в наборе проверки?