Transformer的pytorch实现
Transformer架构
Transformer模型由encoder和decoder两部分组成,decoder输出的结果,经过一个线性层,然后计算softmax。
d_model = 512 # Embedding Size
d_ff = 2048 # FeedForward dimension
d_k = d_v = 64 # dimension of K(=Q), V
n_layers = 6 # number of Encoder of Decoder Layer
n_heads = 8 # number of heads in Multi-Head Attention
class Transformer(nn.Module):
def __init__(self):
super(Transformer, self).__init__()
self.encoder = Encoder()
self.decoder = Decoder()
self.projection = nn.Linear(d_model, tgt_vocab_size, bias=False)
def forward(self, enc_inputs, dec_inputs):
enc_outputs, enc_self_attns = self.encoder(enc_inputs)
dec_outputs, dec_self_attns, dec_enc_attns = self.decoder(dec_inputs, enc_inputs, enc_outputs)
dec_logits = self.projection(dec_outputs) # dec_logits : [batch_size x src_vocab_size x tgt_vocab_size]
return dec_logits.view(-1, dec_logits.size(-1)), enc_self_attns, dec_self_attns, dec_enc_attns
实例化一个Transformer模型,输入为enc_inputs[batch_size,src_len],dec_inputs[batch_size,tgt_len]
model = Transformer()
outputs, enc_self_attns, dec_self_attns, dec_enc_attns = model(enc_inputs, dec_inputs)
Encoder
Encoder分为embedding和6层Encoderlayer,首层的Encoderlayer输入为词embedding和位置embedding相加之和enc_outputs:[batch_size,seq_len,d_model],即(1,5,512)。
Attention_mask:[batch_size,seq_lenq,seq_len],即(1,5,5),其中one is masking。
用enc_self_attns列表保存每一层encoder的attention,列表长度为6。
class Encoder(nn.Module):
def __init__(self):
super(Encoder, self).__init__()
self.src_emb = nn.Embedding(src_vocab_size, d_model)
self.pos_emb = nn.Embedding.from_pretrained(get_sinusoid_encoding_table(src_len+1, d_model),freeze=True)
self.layers = nn.ModuleList([EncoderLayer() for _ in range(n_layers)])
def forward(self, enc_inputs): # enc_inputs : [batch_size x source_len]
enc_outputs = self.src_emb(enc_inputs) + self.pos_emb(torch.LongTensor([[1,2,3,4,0]]))
enc_self_attn_mask = get_attn_pad_mask(enc_inputs, enc_inputs)
enc_self_attns = []
for layer in self.layers:
enc_outputs, enc_self_attn = layer(enc_outputs, enc_self_attn_mask)
enc_self_attns.append(enc_self_attn)
return enc_outputs, enc_self_attns
6层Encoderlayer
每层Encoderlayer包括Multi-head attention和 position-wise

该博客详细介绍了Transformer模型的实现,包括Encoder和Decoder的结构,每个部分如Multi-head attention、Position-wise Feed-Forward network子层的功能,并阐述了残差连接和Layer normalization的作用。在PyTorch中,模型的输出经过线性层和softmax计算损失。
最低0.47元/天 解锁文章
3717

被折叠的 条评论
为什么被折叠?



