添加一些注意力
首先,我们需要了解什么是注意力。
为了在时间步长t生成一个单词,我们需要对输入序列中的每个单词给予多少关注?这就是注意力机制概念背后的关键直觉。
让我们用一个简单的例子来理解这一点:
Question: In the last decade, *who* is the best *Footballer*?
Answer: *Lionel Messi* is the best *player*.
在上面的例子中,问题中的第五个单词和梅西有关,第九个单词足球运动员和第六个单词球员有关。
因此,我们可以增加源序列中产生目标序列的特定部分的重要性,而不是查看源序列中的所有单词。这是注意力机制背后的基本思想。
根据被关注上下文向量的推导方式,有两种不同的注意机制:
Global Attention
在这里,注意力被放在所有的源位置上。换句话说,为了得到参与的上下文向量,我们考虑了编码器的所有隐藏状态。在这个总结任务中,我们将使用Global Attention。
Local Attention
在这里,注意力只放在几个源位置上。在推导参与上下文向量时,只考虑编码器的少数隐藏状态。
现在让我们了解这种注意力是如何真正起作用的:
编码器输出源序列中每个时间步长j的隐藏状态(hj)同样,解码器输出目标序列中每一个时间步长i的隐藏状态(si)我们计算一个称为对齐分数(eij)的分数,在这个分数的基础上,使用一个评分函数将源单词与目标单词对齐。利用score函数从源隐藏状态hj和目标隐藏状态si计算对齐得分。由:
其中eij为目标时间步长i和源时间步长j的对齐得分。
我们使用softmax函数对对齐分数进行归一化,以检索注意力权重(aij):
计算编码器hj的注意权值aij与隐藏状态的乘积的线性和,得到上下文向量Ci:
将所述解码器在时间步长i时的参与上下文向量与目标隐藏状态连接,生成参与隐藏向量Si,其中Si= concatenate([Si;Ci)然后将参与的隐藏向量Si送入稠密层产生yi, yi=dense(Si)。
让我们通过一个示例来理解上面的注意机制步骤。假设源文本序列为[x1, x2, x3, x4],目标摘要序列为[y1, y2]。
编码器读取整个源序列并输出每个时间步长的隐藏状态,例如h1, h2, h3, h4
解码器读取由一个时间步长偏移的整个目标序列,并输出每个时间步长(例如s1、s2、s3)的隐藏状态
目标timestep i = 1
利用score函数从源隐藏状态hi和目标隐藏状态s1计算对齐得分e1j:
e11= score(s1, h1) e12= score(s1, h2) e13= score(s1, h3) e14= score(s1, h4)
使用softmax对对齐分数e1j进行归一化,得到注意力权重a1j:
a11= exp(e11)/((exp(e11)+exp(e12)+exp(e13)+exp(e14)) a12= exp(e12)/(exp(e11)+exp(e12)+exp(e13)+exp(e14)) a13= exp(e13)/(exp(e11)+exp(e12)+exp(e13)+exp(e14)) a14= exp(e14)/(exp(e11)+exp(e12)+exp(e13)+exp(e14))
由编码器隐藏状态hj与对齐得分a1j的乘积的线性和得到上下文向量C1:
C1= h1 * a11 + h2 * a12 + h3 * a13 + h4 * a14
连接上下文向量C1和目标隐藏状态s1,生成隐藏向量s1
S1= concatenate([s1; C1])
然后将注意力隐藏向量S1输入到稠密层,产生y1
y1= dense(S1)
我们可以用同样的方法计算Y2。
实施
在本文中,我们将使用亚马逊食品评论数据集。让我们来看看数据:
https://www.kaggle.com/snap/amazon-fine-food-reviews
数据清洗
我们首先需要清理我们的数据,所以我们需要遵循的步骤是:
将所有内容转换为小写字母删除HTML标记收缩映射删除(的)删除括号()内的任何文本消除标点和特殊字符删除stopwords。删除短词
数据分布
然后,我们将分析评语和总结的长度,从而对文章的长度分布有一个总体的认识。这将帮助我们确定序列的最大长度。
标记数据:
记号赋予器构建词汇表并将单词序列转换为整数序列。我们将使用Keras’ Tokenizer来标记句子。
模型建立
我们终于到了模型制作部分。但在此之前,我们需要熟悉一些术语,这些术语在构建模型之前是必需的。
- Return Sequences= True:当参数设置为True时,LSTM为每个时间步长生成隐藏状态和单元格状态
- Return State = True:当Return State = True时,LSTM只生成最后一个时间步骤的隐藏状态和单元格状态
- Initial State:用于初始化第一个时间步骤的LSTM的内部状态
- Stacked LSTM:Stacked LSTM有多层的LSTM堆叠在彼此之上。这样可以更好地表示序列。我鼓励您试验堆叠在彼此之上的LSTM的多个层
训练和Early Stopping:
这就是在训练过程中验证损失减少的原因,我们可以推断在 epoch10之后验证损失略有增加。因此,在这个 epoch之后,我们将停止训练模型。
推理
现在,我们将为编码器和解码器建立推断。在这里,编码器和解码器将一起工作,以产生摘要。所述解码器将堆叠在所述编码器之上,所述解码器的输出将再次馈入所述解码器以产生下一个字。
Review: right quantity japanese green tea able either drink one sitting save later tastes great sweet Original summary: great japanese product Predicted summary: great teaReview: love body wash smells nice works great feels great skin add fact subscribe save deal great value sold Original summary: great product and value Predicted summary: great productReview: look like picture include items pictured buy gift recipient disappointed Original summary: very disappointed Predicted summary: not what expected
总结
在本文中,我们了解了如何使用序列到序列模型总结文本。我们可以通过增加数据集、使用双向LSTM、 Beam Search策略等方法进一步改进该模型。