seq2seq难死了,卡了好久,好不容易有些头绪了。。。
目录
1.编码器与解码器
1.1原理

1.2实现
#@save
class EncoderDecoder(nn.Module):
"""编码器-解码器架构的基类"""
def __init__(self, encoder, decoder, **kwargs):
super(EncoderDecoder, self).__init__(**kwargs)
self.encoder = encoder
self.decoder = decoder
def forward(self, enc_X, dec_X, *args):
enc_outputs = self.encoder(enc_X, *args)
dec_state = self.decoder.init_state(enc_outputs, *args)
return self.decoder(dec_X, dec_state)
其中,dec_X为解码器输入,dec_state为解码器的初始状态,enc_outputs为编码器输出(p269),传入decoder中的init_state函数。
2.seq2seq
2.1构造编码器
Embedding当作每个词嵌入one-hot。onehot是最简单的一种embedding
#@save
class Seq2SeqEncoder(d2l.Encoder):
"""⽤于序列到序列学习的循环神经⽹络编码器"""
def __init__(self, vocab_size, embed_size, num_hiddens, num_layers,
dropout=0, **kwargs):
super(Seq2SeqEncoder, self).__init__(**kwargs)
# 嵌⼊层
self.embedding = nn.Embedding(vocab_size, embed_size)
self.rnn = nn.GRU(embed_size, num_hiddens, num_layers,
dropout=dropout)
def forward(self, X, *args):
# 输出'X'的形状:(batch_size,num_steps,embed_size)
X = self.embedding(X)
# 在循环神经⽹络模型中,第⼀个轴对应于时间步
X = X.permute(1, 0, 2)
# 如果未提及状态,则默认为0
output, state = self.rnn(X)
# output的形状:(num_steps,batch_size,num_hiddens)
# state的形状:(num_layers,batch_size,num_hiddens)
return output, state
编码器最终的output输出为(T,bs,hiddens),state的输出为(n_layers,bs,hiddens)。
如果是Lstm的话,state是一个包含两个tensor的tuple,为Ht与Ct
下面这个例子bs=4,T=7,生成最终的output与state符合上述结论
encoder = Seq2SeqEncoder(vocab_size=10, embed_size=8, num_hiddens=16,
num_layers=2)
encoder.eval()
X = torch.zeros((4, 7), dtype=torch.long)
output, state = encoder(X)
output.shape, state.shape
'''
(torch.Size([7, 4, 16]), torch.Size([2, 4, 16]))
'''
2.2构造解码器
encoder(X)得到的有output与state,这里init_state只拿[1],即只拿state。
再在forward中,拿到state[-1]最后一个时刻的最后一层的hidden,使用repeat广播到与X相同的维数(repeat探索下文)
目标tgt的输入X与src中的最后一层最后一个时刻广播后的state进行concat,一起送到目标层中的gru中进行输出,得到(T,bs,hidden),再通过dense的Linear层并转换维数permute,得到最终的输出(bs,T,len(v)).
state形状见(V,为(n_layer,bs,h),表示最后一个时刻每个layer的Ht
定义GRU时,假设Encoder与Decoder中的hiddens是一致的,作用是将Encoder的state与decoder的input进行concat起来,使得满足训练图:每个input都与最后的state进行cat。

&nb

本文详细介绍了Seq2Seq模型的组成部分,包括基于GRU的编码器和解码器的实现,以及如何处理输入输出。还讨论了训练过程、预测方法、损失计算,特别是针对填充词元的处理和BLEU评估指标。
最低0.47元/天 解锁文章
943





