承接上一期,今天继续讲解TensorFlow seq2seq中的注意力机制的代码设计。先稍微简单回顾一下常见的两种注意力机制:BahdanauAttention和LuongAttention,二者最初都是源自自然语言处理中的机器翻译问题,前者是基于加法的注意力机制,而后者是基于乘法的注意力机制,关于二者的详细比较,请参考以下的相关论文。
参考论文
Bahdanau D, Cho K, Bengio Y. Neural Machine Translation by Jointly Learning to Align and Translate[J]. Computer Science, 2014.
Luong M T, Pham H, Manning C D. Effective Approaches to Attention-based Neural Machine Translation[J]. Computer Science, 2015.
在TensorFlow中,注意力机制的实现全部在attention_wrapper.py文件中,需要重点学习的是LuongAttention和BahdanauAttention。接下来将讲讲这里面的疑难点,分为三个部分来讲:首先是注意力机制的基本组成单元,因为无论是Bahdanau注意力机制还是Luong注意力机制,它们都是继承自基础注意力类;其次是BahdanauAttention与LuongAttention的不同点——score的计算;最后是今年刚发表不久的monotonic attention mechanism,这个留到下一期重点介绍。
基础注意类(_BaseAttentionMechanism)定义了一个注意力机制的基本组成单元,它们分别是query和memory,query可以决定该聚焦到memory的哪个部位,而通常情况下,memory就是指编码器的输出,当把memory经过一个memory layer之后就得到了key,下文中会用到key。
LuongAttention的score是通过乘法来得到的,为了保证矩阵乘法可以顺利进行,query和key的depth维度必须保持一致。query的维度是[batch_size, depth],key的维度是[batch_size, max_time, depth],首先把query的维度扩充成[batch_size, 1, depth],然后与key进行矩阵相乘,得到的score的维度是[batch_size, 1, max_time],将中间的维度进行压缩即可变成[batch_size, max_time],这就是LuongAttention的score的计算方式,此score未经过归一化,函数中还提供了scale参数,如果将scale设置为True,那么score=g*score,g是一个可训练的缩放因子。
将LuongScore计算好以后,经过softmax函数即可得到归一化之后的score,然后结合前一时刻的对齐权重,即可算出当前时刻的对齐权重alignments,很容易想到其维度是[batch_size, max_time],不过这里代码中并没有结合前一时刻的对齐权重,而是直接使用归一化之后的score来作为alignments。
对于BahdanauAttention的score,由于这里要执行的是query和key的矩阵加法,因此首先也要对query进行扩充维度,使其维度变成[batch_size, 1, depth]。除此之外,这里增加了一个attention_v变量,其维度是[depth],并且函数还提供了normalize参数,如果normalize为True,那么首先需要对attention_v进行归一化,否则,直接把attention_v乘以query与key的求和矩阵即可,最终对最后一个维度进行求和即可得到维度为[batch_size, max_time]的score。
将BahdanauScore计算好以后,与Luong的操作基本类似,即经过一个softmax函数得到归一化之后的score,并将其score作为alignments。
上面计算的alignments就是当前对输入序列的注意力权重因子,即在每个样本序列中,对于所有不同时刻上隐含状态的权重。
由于这是今年刚刚提出不久的新的注意力机制,因此留到下一期长文撰写后再推送,欢迎大家提前阅读参考文献Online and Linear-Time Attention by Enforcing Monotonic Alignments。
题图:Moon in a radio telescope
你可能会感兴趣的文章有:
[DLdigest-3] Python中让你无法预测的“是”
动态层归一化(Dynamic Layer Normalization)
详述DeepMind wavenet原理及其TensorFlow实现
Layer Normalization原理及其TensorFlow实现
Batch Normalization原理及其TensorFlow实现
Maxout Network原理及其TensorFlow实现
Network-in-Network原理及其TensorFlow实现
如何基于TensorFlow实现ResNet和HighwayNet
深度学习每日摘要|坚持技术,追求原创