初级版本
模型:
模型组成:
Encoder:
对当前batch生成context vector,以及对应各个时刻的 encoder_output
Decoder
对于当前attention,以及上一时刻输出的词向量,拼接后放入decoder rnn中,生成下一个隐状态以及当前预测的输出
Attention
对于 decoder 的hidden_state, 对于当前batch 各个时刻的encoder output 生成attention,返回(batch_size, seq_len)
Seq2Seq
因为decoder 需要上一个预测出的数据当作下一个时刻的输入,所以对于每一个时刻单独应用一个 GRU,所以需要进行组织一下
模型关系:
那么这些模型什么关系呢:站在优化的角度讲,肯定是要注册的,对于所有的batch,对于attention中的transformation 并且是对所有的模型并行训练的,所以说所有的模型都是并列的
模型进阶
当前模型存在的问题:
- 因为是batch操作,所以对于输入的一批batch,产生的context vector 考虑了pad的一些字符
- attention 考虑了同一批batch 内所有时刻的output vector,是不准确的
- 当串行地产生测试集输出时,你应该一预测到eos的 token就停止了,而不是根据trg_len产生
对于第一个或者第二个问题,解决办法:
- 使用pad_pack sequence
packed_embedded = nn.utils.rnn.pack_padded_sequence(embedded, src_len)
outputs, _ = nn.utils.rnn.pad_packed_sequence(packed_outputs)
- 对于batch中pad的一些位置,将其mask为负无穷,这样当计算softmax 会变为0
attention = attention.masked_fill(mask == 0, -1e10)