重复和混乱的输出从零开始训练openai变压器

时间:2019-07-06 17:44:26

标签: deep-learning nlp pytorch transformer language-model

我正在尝试使用此存储库
https://github.com/huggingface/pytorch-openai-transformer-lm
训练带有附加输入的语言模型。 我的数据如下:

┌─────────┬─────┬────┬───┐
│side info│start│The │cat│
└─────────┴─────┴────┴───┘

标签看起来像这样

┌────┬───┬─────┐
│The │cat│meows│
└────┴───┴─────┘

由于我的目标与原始培训脚本完全不同,所以我从头开始实施了培训,但我注意到,要达到像样的效果,需要比简单的LSTM模型花费更多的时间,并且即使经过15个时间段,结果也不是完全简洁的语言在200万个句子上我得到的输出看起来像这样

金标: 在大多数情况下,只有经过费力且昂贵的反复试验过程才能获得准确的结果。

输出: 在经过艰苦的错误和处理结果后,只有最准确的案例才能获得解决。

目前,我正在使用一个小型模型,每个模型有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)))

0 个答案:

没有答案