参考论文:Get To The Point: Summarization with Pointer-Generator Networks 参考代码:atulkum/pointer_summarizer
使用的模型是seq2seq + attention,也就是前面有提到的做翻译的模型,之前写的有些问题,也是由于自己不太理解吧;现在结合这个代码,再来重新梳理一遍。 baseline model(不加attention 和 Pointer-Generator Networks)介绍: encoder是双向单层的LSTM,将数据输入到网络之后,可以得到encoder_out(batch_size, seq_len, 2 * enc_hidden_size),encoder_hidden(元组(h,c),每个size都是(2, batch_size, enc_hidden_size))。encoder_hidden应用于后续decoder_input。decoder是单向单层的LSTM,起始的hidden使用encoder_hidden(需要进行size的转化)。 然后加上attetion的操作,attention的分数计算采用如下公式: e i t = V a T tanh ( W h h i + W s s t + b ) ; e_i^t=V_a^T\tanh(W_hh_i+W_ss_t+b); eit=VaTtanh(Whhi+Wsst+b); \quad h i h_i hi表示encoder_state, 使用encoder_out, s t s_t st表示decoder_hidden,使用decoder_hidden。计算后size为(batch_size, seq_len) a t = s o f t m a x ( e t ) ; a^t=softmax(e^t); at=softmax(et); a t \quad a_t at表示每一个输入的注意力分数,size为(batch_size, seq_len)cv = ∑ α i h i \sum\alpha_{i}h_i ∑αihi表示context_vector向量 计算后的size为 (batch_size, 1, enc_hidden_size) y ^ = s o f t m a x ( t a n h [ s t ; c v ] ) \hat{y} =softmax(tanh[s_t;cv]) y^=softmax(tanh[st;cv]) 通过映射得到最终的输出,计算后的size为(batch_size, vocab_size)。 由于在完成摘要模型中,会出现很多oov的词语,为了解决这个问题,可以根据PGN计算一下跟输入相关的词语,此时变化如下: 计算一个 p g e n p_{gen} pgen的值,用于计算vocab与句中oov词语的分布概率, p g e n p_{gen} pgen的计算公式如下: p g e n = σ ( W h ∗ h ∗ + W s s t + W x x t + b ) ; p_{gen}=\sigma(W_{h^*}h^*+W_ss_t+W_xx_t+b); pgen=σ(Wh∗h∗+Wsst+Wxxt+b); \quad h ∗ h^* h∗对应上一步提到的cv, s t s_t st对应为decoder_output,x_t对应为decoder_input,此时计算的size为(batch_size, 1)利用下面的公式求对应的输出: y = p g e n y ^ + ( 1 − p g e n ) ∑ i : w i = w α ; y=p_{gen} \hat {y} + (1 - p_{gen})\sum_{i:w_i=w}\alpha; \quad y=pgeny^+(1−pgen)∑i:wi=wα; α \alpha α表示上面提到的,即注意力分数。 由于1-3构成的摘要模型中会出现词语大量重复的情况,现在使用coverage机制,对重复的词语进行惩罚的机制,进行如下改动: c i = ∑ t = 0 t = i − 1 α i c_i=\sum_{t=0}^{t=i-1}\alpha^i \quad ci=∑t=0t=i−1αi表示i时刻的c函数, α \alpha α为2中计算的注意力分布值;第2步中的 e i t e_{i}^{t} eit修改为 e i t = V a T tanh ( W h h i + W s s t + W c c i + b ) ; e_i^t=V_a^T\tanh(W_hh_i+W_ss_t+W_cc_i+b); eit=VaTtanh(Whhi+Wsst+Wcci+b);将损失函数增加一项+ λ ∑ min ( α i , c i ) \lambda\sum \min(\alpha^i,c^i) λ∑min(αi,ci)另外关于LayerNormalization之类的,暂时没有介绍。
至此,全部介绍完成,如果有疑问和我说的不到位的地方欢迎大家指出,一起学习进步。