Я пытаюсь использовать этот репозиторий
https://github.com/huggingface/pytorch-openai-transformer-lm
обучить языковой модели с дополнительным входом.
Мои данные выглядят так:
┌─────────┬─────┬────┬───┐
│side info│start│The │cat│
└─────────┴─────┴────┴───┘
Этикетки выглядят так
┌────┬───┬─────┐
│The │cat│meows│
└────┴───┴─────┘
Поскольку моя цель сильно отличается от исходного сценария обучения, я реализовал обучение с нуля, но заметил, что для того, чтобы стать несколько приличным, требуется гораздо больше времени, чем простая модель LSTM, и результаты не совсем лаконичны даже после 15 эпох на 2 миллиона предложений. Я получаю результаты, которые выглядят так:
Золотая этикетка:
В большинстве случаев точные результаты могут быть достигнуты только после кропотливого и дорогостоящего процесса проб и ошибок.
Выход:
только трудоемкие ошибки и результаты процесса могут быть достигнуты только в самых точных случаях. В пробном и дорогом иске.
В настоящее время я использую маленькую модель с 4 слоями и 2 головками в каждом.
Я случайным образом инициализировал кодировки позиций и умножил их на 0,1, чтобы соответствовать дисперсии вложений моих слов.
Есть идеи, что я мог пропустить?
Вот мой код
batch_size = 32
n_epochs = 100
max_len = 120
embeddings, emb_weights = load_embeddings(data_path+'de.en.fr.ka.tok.60000.shuf.vec',max_len)
train_dataset = SortedSentenceDataset(data_path+'train.txt', 200000, max_len, embeddings, 'avg',device)
train_sampler = train_dataset.get_sampler(batch_size)
train_loader = DataLoader(train_dataset, batch_size=1, sampler=train_sampler)
dev_dataset = SortedSentenceDataset(data_path+'valid.txt', 1000, max_len, embeddings, 'avg',device)
dev_sampler = dev_dataset.get_sampler(batch_size)
dev_loader = DataLoader(dev_dataset, batch_size=1, sampler=dev_sampler)
args = DEFAULT_CONFIG
args.n_embd = emb_weights.size(1)
# Constraint: embedding size % number of heads = 0
args.n_head = 2
args.n_layer = 4
model = load_model(args, emb_weights)
model.to(device)
criterion = torch.nn.CrossEntropyLoss()
optimizer = OpenAIAdam(model.parameters(),
lr=6.25e-3,
schedule='warmup_linear',
warmup=0.02,
t_total=n_epochs*len(train_dataset)*20,
b1=0.9,
b2=0.999,
e=1e-8,
l2=0.01,
vector_l2='store_true',
max_grad_norm=1)
best = 1000
for epoch in range(n_epochs):
do_epoch(train_loader)
val_loss = eval(dev_loader)
print('Validation loss: {}'.format(val_loss))
if val_loss < best:
best = val_loss
print('Saving model')
torch.save(model.state_dict(),"context-at-each-layer-checkpoint-{}k{}e4b.pt".format(len(train_dataset)//1000,n_epochs))
print(' '.join(generate(train_dataset,max_len,embeddings)))