pointer-network代码结构
1、在model的add_decoder中调⽤了attention_decoder
在run_beam_search中调⽤了model中的decode_onestep
在训练时不需要光速解码,测试时才需要光速解码
2、attention机制的使⽤
attention是指在解码的每⼀步对输⼊序列的中的每个单词计算⼀个attn_dist(),通过将attn_dist和encoder_state()进⾏计算的得到⼀个context vector()。
在输⼊时context vector与decoder input进⾏连接作为输⼊
在计算词汇分布 时,context vector与decoder output进⾏连接再计算词汇分布
attention机制主要就是context vector的计算和使⽤
3、attention机制的程序实现技巧
计算:
: (batch_size, attn_length)
: (batch_size, attn_length, attn_size)
: (batch_size, attn_size)
计算时:
执⾏
计算得到encoder_feature:
执⾏
计算得到decoder_features:
decoder_features = tf.expand_pand_dims(decoder_features, 1), 1)
reshape to
将计算的到的结果相加并降维得到最终结果(batch_size, attn_length)
e = duce_sum(v * math_ops.tanh(encoder_feature + decoder_features), [2, 3])
其中v: (attention_vec_size)
4、根据求最后的时,需要经过padding_mask
def masked_attention(e, enc_padding_mask):
"""Take softmax of e then apply enc_padding_mask and re-normalize"""
attn_dist = nn_ops.softmax(e)  # take softmax. shape (batch_size, attn_length)
# enc_padding_mask : [batch_size, attn_length]
attn_dist *= enc_padding_mask  # apply mask
masked_sums = tf.reduce_sum(attn_dist, axis=1)  # shape (batch_size)
return attn_dist / tf.reshape(masked_sums, [-1, 1])  # re-normalize
decoder
5、训练和测试时的计算图不太⼀样
因为训练时是teach forcing, 可以⼀次得到所有结果
⽽在测试时是每次运⾏⼀步,所以训练和测试时decoder部分的计算图是不⼀样的

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。