基于Keras实现双向LSTM,可视化其注意力机制.doc
《基于Keras实现双向LSTM,可视化其注意力机制.doc》由会员分享,可在线阅读,更多相关《基于Keras实现双向LSTM,可视化其注意力机制.doc(10页珍藏版)》请在三一文库上搜索。
1、基于Keras实现双向LSTM,可视化其注意力机制编者按:Datalogue的Zafarali Ahmed介绍了RNN和seq2seq的概念,基于Keras实现了一个双向LSTM,并可视化了它的注意力机制。循环神经网络(RNN)在翻译(谷歌翻译)、语音识别(Cortana)和语言生成领域取得了巨大的成功。在Datalogue,我们处理大量的文本数据,我们很有兴趣帮助社区理解这一技术。在这篇教程中,我们将基于Keras编写一个RNN,将“November 5, 2016”、“5th November 2016”这样的日期表达转换为标准格式(“20161105”)。具体来说,我们希望获得一些神经网
2、络是如何做到这些的直觉。我们将利用注意力概念生成一份类似下图的映射,揭示哪些输入字符在预测输出字符上起着重要作用。教程概览我们将从一些技术背景材料开始,接着编程模型!在教程中,我会提供指向更高级内容的链接。如果你想要直接查看代码:请访问GitHub:datalogue/keras-attention你需要了解如果你想直接跳到本教程的代码部分,你最好熟悉Python和Keras。你应该熟悉下线性代数,毕竟神经网络不过是应用了非线性的一些权重矩阵。下面我们将解释RNN和seq2seq(序列到序列)模型的直觉。循环神经网络(RNN)RNN是一个应用同一变换(称为RNN单元或步骤)至一个序列的每个元素
3、的函数。RNN层的输出是RNN单元应用至序列的每个元素后的输出。在文本情形下,这些通常是后续的单词或字符。此外,RNN单元维护内部记忆,总结了目前为止所见序列的历史。RNN层的输出是一个编码序列h,可以处理该序列,也可以将它传给另一个网络。RNN的输入和输出极为灵活:多对一:使用完整的输入序列做出单个预测h。一对多:转换单个输入以生成序列h。多对多:转换整个输入序列至另一个序列。理论上,训练数据的序列长度不用一样。在实践中,我们补齐或截断序列得到相同长度,以利用TensorFlow的静态计算图的优势。我们将重点关注第三种RNN,“多对多”,也称为序列到序列(seq2seq)。由于训练中梯度计算
4、的不稳定性,RNN很难学习长序列。为了解决这一问题,可以将RNN单元替换为门控单元,比如门控循环单元(GRU)或长短时记忆网络(LSTM)。如果你想了解更多LSTM和门控单元,我强烈推荐Christopher Olah的博客(我就是从这篇开始理解RNN单元的)。从现在开始,当我们谈论RNN的时候,我们指的是门控单元。seq2seq一般框架:编码器-解码器设定几乎所有处理seq2seq问题的神经网络都涉及:编码输入序列为某种抽象表示。处理这一编码。解码至目标序列。编码器和解码器可以是任意种类的神经网络组合。在实践中,大多数人编码器和解码器都使用RNN。上图显示了一个简单的编码器-解码器设定。编码
5、步骤通常生成向量序列h,对应输入数据中的字符序列x。在一个RNN编码器中,通过纳入之前向量序列的信息生成每个向量。在将h传给解码器之前,我们可以先处理一番。例如,我们也许选择只使用最后的编码(如下图所示),因为理论上它是整个序列的总结。直观地说,这类似总结整个输入数据为单个表示,接着尝试加以解码。尽管对于情绪检测这样的分类问题(多对一),总结状态可能已经具备足够信息,对于翻译之类的问题,仅仅使用总结状态可能不够,需要考虑隐藏状态的完整序列。然而,人类不是这么翻译日期的:我们并不读取整个文本,然后单独写下每个字符的翻译。从直觉上说,一个人会整体理解一组字符“Jan”对应一月,“5”对应日期,“2
6、016”对应年。如前所述,这一想法是RNN可以捕捉的注意,并且成功用于图像说明生成(Xu等. 2015),语音识别(Chan等. 2015),还有机器翻译(Bahdanau等. 2014)。最重要的是,它们生成可解释的模型。上面提到的图像说明生成论文展示了一个注意力机制如何工作的可视化例子。在女孩和泰迪熊的复杂例子中,我们看到,生成单词“girl”(女孩)时,注意力机制成功地聚焦女孩,而不是泰迪熊!相当聪明。这不仅可以生成效果很好的可视化图像,同时便于作者诊断模型中的问题。SpaCy的创造者写了一篇编码器-注意-解码器范式的深度概览:Embed, encode, attend, predict
7、: The new deep learning formula for state-of-the-art NLP models。如果你想了解其他改动RNN的方式,可以参考Distill上的Attention and Augmented Recurrent Neural Networks。这篇教程将介绍使用单个双向LSTM作为编码器和注意解码器。更具体地说,我们将实现Bahdanau等在2014年发表的Neural machine translation by jointly learning to align and translate论文中提出的模型的简化版本。我会讲解部分数学,但如果你想了
8、解细节,我邀请你阅读论文的附录。现在我们已经了解了RNN这一概念,以及注意力机制背后的直觉,让我们开始学习如何实现这一模型,接着取得一些漂亮的可视化结果。后续小节所有的代码都可以在本文开头给出的GitHub仓库(datalogue/keras-attention)中找到,/models/NMT.py为模型的完整实现。编码器Keras自带了RNN(LSTM)实现,可以通过以下方式调用:BLSTM = Bidirectional(LSTM(encoder_units, return_sequences=True)encoder_units参数是权重矩阵的大小。return_sequences=Tr
9、ue表示我们需要完整的编码序列,而不仅仅是最终总结状态。我们的BLSTM将接受输入序列x=(x1,.,xT)中的字符作为输入,并输出编码序列h=(h1,.,hT),其中T为日期的字符数。注意这和Bahdanau等论文有点不一样,原论文中句子以单词而不是字符为单位。我们也不像原论文那样把编码序列叫做注释(annotations)。解码器下面到了有趣的部分:解码器。对序列t处的任意给定字符,解码器接受编码序列h=(h1,.,hT)、之前的隐藏状态st-1(和解码器单元共享)、字符yt-1。我们的解码器层将输出y=(y1,.,yT)(标准化日期中的字符)。上图总结了我们的整体架构。等式如前所示,解码
10、器相当复杂。所以让我们将它分解为尝试预测字符t的解码器单元执行的步骤。在下式中,大写字母变量表示可训练参数(注意,为了简明,我省去了偏置项)。根据编码序列和解码器单元的内部隐藏状态st-1,计算注意概率=(1,T)。计算上下文向量,即带关注概率的编码序列加权和。直观地说,这一向量总结了不同编码字符在预测第t个字符上的作用。我们接着更新隐藏状态。如果你熟悉LSTM单元的等式,这些也许会唤起你的回忆,重置门r,更新门z,以及提议状态。st-1用于创建提议隐藏状态。更新门控制在新的隐藏状态st中包括多少提议。(没有头绪?看这篇逐步讲解LSTM的文章)根据上下文向量、隐藏状态、之前字符,使用一个简单的
11、单层神经网络计算第t个字符。相比原论文,这里做了一点改动,原论文用了一个maxout层。这一改动是因为我们想要让模型尽可能地简单。上面的这些等式应用于编码序列中的每个字符,以生成解码序列y,该序列表示每个位置出现某个转译字符的概率。代码models/custom_recurrent.py实现了我们的定制层。这一部分比较复杂,因为我们需要对整个编码序列进行处理。多思考一下能帮助你看懂代码。我保证,如果你一边看等式,一边看代码,会容易不少。最低限度的定制Keras层需要实现这些方法:_init_,compute_output_shape,build,call。出于完整性考虑,我们也实现了get_c
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 Keras 实现 双向 LSTM 可视化 注意力 机制
链接地址:https://www.31doc.com/p-3410870.html