Seq2Seq - Attention(代码私戳)

初级版本

模型:

模型组成:

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产生

对于第一个或者第二个问题,解决办法:

  1. 使用pad_pack sequence
packed_embedded = nn.utils.rnn.pack_padded_sequence(embedded, src_len)
outputs, _ = nn.utils.rnn.pad_packed_sequence(packed_outputs) 
  1. 对于batch中pad的一些位置,将其mask为负无穷,这样当计算softmax 会变为0
attention = attention.masked_fill(mask == 0, -1e10)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值