学校网站空间建设情况,优秀网页设计,做教程网站资源放哪里有,安徽智能网站建设《Transformer的PyTorch实现》这篇博文以一个机器翻译任务非常优雅简介的阐述了Transformer结构。在阅读时存在一些小困惑#xff0c;此处权当一个记录。
1.自定义数据中enc_input、dec_input及dec_output的区别
博文中给出了两对德语翻译成英语的例子#xff1a;
# S: de…《Transformer的PyTorch实现》这篇博文以一个机器翻译任务非常优雅简介的阐述了Transformer结构。在阅读时存在一些小困惑此处权当一个记录。
1.自定义数据中enc_input、dec_input及dec_output的区别
博文中给出了两对德语翻译成英语的例子
# S: decoding input 的起始符
# E: decoding output 的结束符
# P意为padding如果当前句子短于本batch的最长句子那么用这个符号填补缺失的单词
sentence [# enc_input dec_input dec_output[ich mochte ein bier P,S i want a beer ., i want a beer . E],[ich mochte ein cola P,S i want a coke ., i want a coke . E],
]初看会对这其中的enc_input、dec_input及dec_output三个句子的作用不太理解此处作详细解释 -enc_input是模型需要翻译的输入句子, -dec_input是用于指导模型开始翻译过程的信号 -dec_output是模型训练时的目标输出模型的目标是使其产生的输出尽可能接近dec_output即为翻译真实标签。他们在transformer block中的位置如下
在使用Transformer进行翻译的时候需要在Encoder端输入enc_input编码的向量在decoder端最初只输入起始符S然后让Transformer网络预测下一个token。
我们知道Transformer架构在进行预测时每次推理时会获得下一个token因此推理不是并行的需要输出多少个token理论上就要推理多少次。那么在训练阶段也需要像预测那样根据之前的输出预测下一个token然而再所引出dec_output中对应的token做损失吗实际并不是这样如果真是这样做就没有办法并行训练了。
实际我认为Transformer的并行应该是有两个层次 1不同batch在训练和推理时是否可以实现并行 2一个batch是否能并行得把所有的token推理出来 Tranformer在训练时实现了上述的12而推理时12都没有实现。Transformer的推理似乎很难实现并行原因是如果一次性推理两句话那么如何保证这两句话一样长难道有一句已经结束了另一句没有结束需要不断的把结束符E送入继续预测下一个结束符吗此外Transformer在预测下一个token时必须前面的token已经预测出来了如果第i-1个token都没有是无法得到第i个token。因此推理的时候都是逐句话预测逐token预测。这儿实际也是我认为是transformer结构需要改进的地方。这样才可以提高transformer的推理效率。
2.Transformer的训练流程
此处给出博文中附带的非常简洁的Transformer训练代码
from torch import optim
from model import *model Transformer().cuda()
model.train()
# 损失函数,忽略为0的类别不对其计算loss因为是padding无意义
criterion nn.CrossEntropyLoss(ignore_index0)
optimizer optim.SGD(model.parameters(), lr1e-3, momentum0.99)# 训练开始
for epoch in range(1000):for enc_inputs, dec_inputs, dec_outputs in loader:enc_inputs: [batch_size, src_len] [2,5]dec_inputs: [batch_size, tgt_len] [2,6]dec_outputs: [batch_size, tgt_len] [2,6]enc_inputs, dec_inputs, dec_outputs enc_inputs.cuda(), dec_inputs.cuda(), dec_outputs.cuda() # [2, 6], [2, 6], [2, 6]outputs model(enc_inputs, dec_inputs) # outputs: [batch_size * tgt_len, tgt_vocab_size]loss criterion(outputs, dec_outputs.view(-1)) # 将dec_outputs展平成一维张量# 更新权重optimizer.zero_grad()loss.backward()optimizer.step()print(fEpoch [{epoch 1}/1000], Loss: {loss.item()})
torch.save(model, fMyTransformer_temp.pth)这段代码非常简洁可以看到输入的是batch为2的样本送入Transformer网络中直接logits算损失。Transformer在训练时实际上使用了一个策略叫teacher forcing。要解释这个策略的意义以本博文给出的样本为例对于输入的样本
ich mochte ein bier在进行训练时当我们给出起始符S接下来应该预测出
I那训练时有了SI后则应该预测出
want那么问题来了如I就预测错了假如预测成了a,那么在预测want时还应该使用Sa来预测吗当然不是即使预测错了也应该用对应位置正确的tokenSI去预测下一个token这就是teacher forcing。
那么transformer是如何实现这样一个teacher forcing的机制的呢且听下回分解。