【发布时间】:2020-12-31 03:52:20
【问题描述】:
我正在尝试理解 Transformer 的代码 (https://github.com/SamLynnEvans/Transformer)。
如果在“train”脚本中看到train_model函数,我想知道为什么需要使用与trg不同的trg_input序列长度:
trg_input = trg[:, :-1]
在这种情况下,trg_input 的序列长度是“seq_len(trg) - 1”。 这意味着 trg 就像:
<sos> tok1 tok2 tokn <eos>
而 trg_input 是这样的:
<sos> tok1 tok2 tokn (no eos token)
请告诉我原因。
谢谢。
相关代码如下:
for i, batch in enumerate(opt.train):
src = batch.src.transpose(0, 1).to('cuda')
trg = batch.trg.transpose(0, 1).to('cuda')
trg_input = trg[:, :-1]
src_mask, trg_mask = create_masks(src, trg_input, opt)
preds = model(src, trg_input, src_mask, trg_mask)
ys = trg[:, 1:].contiguous().view(-1)
opt.optimizer.zero_grad()
loss = F.cross_entropy(preds.view(-1, preds.size(-1)), ys, ignore_index=opt.trg_pad)
loss.backward()
opt.optimizer.step()
def create_masks(src, trg, opt):
src_mask = (src != opt.src_pad).unsqueeze(-2)
if trg is not None:
trg_mask = (trg != opt.trg_pad).unsqueeze(-2)
size = trg.size(1) # get seq_len for matrix
np_mask = nopeak_mask(size, opt)
if trg.is_cuda:
np_mask.cuda()
trg_mask = trg_mask & np_mask
else:
trg_mask = None
return src_mask, trg_mask
【问题讨论】:
标签: nlp pytorch mask transformer