Dynamic attention in tensorflow

新代码在contrib\seq2seq\python\ops\attention_decoder_fn.py

?
?

和之前代码相比
不再采用conv的方式来计算乘,直接使用乘法和linear

?
?

给出了两种attention的实现
传统的"bahdanau": additive (Bahdanau et al., ICLR‘2015)
Neural Machine Translation by Jointly Learning to Align and Translate

以及"luong": multiplicative (Luong et al., EMNLP‘2015)
Effective Approaches to Attention-based Neural Machine Translation

?
?

这里以 bahdanau为例

?
?

还是按照?Grammar as a Foreign Language的公式

?
?

对应代码里面

将input encoder outputs 也就是输入的attention states作为 attention values

?
?

也就是在prepare_attention中

attention_values = attention_states

那么attention keys 对应 W_1h_i的部分,采用linear来实现

attention_keys = layers.linear(

attention_states, num_units, biases_initializer=None, scope=scope)

?
?

在创建score function的

_create_attention_score_fn
中完整定义了计算过程

这里去掉luong的实现部分
仅仅看bahdanau部分

?
?

with variable_scope.variable_scope(name, reuse=reuse):

if attention_option == "bahdanau":

#这里对应第一个公式最右面 query_w对应W_2, query是对应d_t

query_w = variable_scope.get_variable(

"attnW", [num_units, num_units], dtype=dtype)

#对应第一个公式最左侧的v

score_v = variable_scope.get_variable("attnV", [num_units], dtype=dtype)

?
?

def attention_score_fn(query, keys, values):

"""Put attention masks on attention_values using attention_keys and query.

?
?

Args:

query: A Tensor of shape [batch_size, num_units].

keys: A Tensor of shape [batch_size, attention_length, num_units].

values: A Tensor of shape [batch_size, attention_length, num_units].

?
?

Returns:

context_vector: A Tensor of shape [batch_size, num_units].

?
?

Raises:

ValueError: if attention_option is neither "luong" or "bahdanau".

?
?

?
?

"""

if attention_option == "bahdanau":

# transform query W_2*d_t

query = math_ops.matmul(query, query_w)

?
?

# reshape query: [batch_size, 1, num_units]

query = array_ops.reshape(query, [-1, 1, num_units])

?
?

# attn_fun 对应第一个公式的最左侧结果(=左侧) math_ops.reduce_sum(v * math_ops.tanh(keys + query), [2]) * + reduce_sum操作即是dot操作

scores = _attn_add_fun(score_v, keys, query)

?
?

# Compute alignment weights

# scores: [batch_size, length]

# alignments: [batch_size, length]

# TODO(thangluong): not normalize over padding positions.

#对应第二个公式
计算softmax结果

alignments = nn_ops.softmax(scores)

?
?

# Now calculate the attention-weighted vector.

alignments = array_ops.expand_dims(alignments, 2)

#利用softmax得到的权重 计算attention向量的加权加和

context_vector = math_ops.reduce_sum(alignments * values, [1])

context_vector.set_shape([None, num_units])

?
?

#context_vector即对应 第三个公式 =的左侧

return context_vector

?

再看下计算出contenxt_vector之后的使用,这个方法正如论文中所说也和之前旧代码基本一致

也就是说将context和query进行concat之后通过linear映射依然得到num_units的长度
作为attention

def _create_attention_construct_fn(name, num_units, attention_score_fn, reuse):

"""Function to compute attention vectors.

?
?

Args:

name: to label variables.

num_units: hidden state dimension.

attention_score_fn: to compute similarity between key and target states.

reuse: whether to reuse variable scope.

?
?

Returns:

attention_construct_fn: to build attention states.

"""

with variable_scope.variable_scope(name, reuse=reuse) as scope:

?
?

def construct_fn(attention_query, attention_keys, attention_values):

context = attention_score_fn(attention_query, attention_keys,

attention_values)

concat_input = array_ops.concat([attention_query, context], 1)

attention = layers.linear(

concat_input, num_units, biases_initializer=None, scope=scope)

return attention

?
?

return construct_fn

?
?

?
?

?
?

最终的使用,cell_output就是attention,而next_input是cell_input和attention的concate

# construct attention

attention = attention_construct_fn(cell_output, attention_keys,

attention_values)

cell_output = attention

?
?

# argmax decoder

cell_output = output_fn(cell_output) # logits

next_input_id = math_ops.cast(

math_ops.argmax(cell_output, 1), dtype=dtype)

done = math_ops.equal(next_input_id, end_of_sequence_id)

cell_input = array_ops.gather(embeddings, next_input_id)

?
?

# combine cell_input and attention

next_input = array_ops.concat([cell_input, attention], 1)

?
?

?
?

Dynamic attention in tensorflow

时间: 2024-10-11 06:12:56

Dynamic attention in tensorflow的相关文章

Effective Tensorflow[转]

Effective TensorFlow Table of Contents TensorFlow Basics Understanding static and dynamic shapes Scopes and when to use them Broadcasting the good and the ugly Feeding data to TensorFlow Take advantage of the overloaded operators Understanding order

一线开发者在Reddit上讨论深度学习框架:PyTorch和TensorFlow到底哪个更好?

本文标签:   机器学习 TensorFlow Google深度学习框架 分布式机器学习 PyTorch   近日,Reddit用户 cjmcmurtrie 发了一个主题为「PyTorch vs. TensorFlow」的讨论帖,想要了解这两大流行的框架之间各自有什么优势. 原帖地址:https://redd.it/5w3q74 帖子一楼写道: 我还没有从 Torch7 迁移到 TensorFlow.我玩过 TensorFlow,但我发现 Torch7 更加直观(也许是我玩得不够?).我也尝试了

Attention and Augmented Recurrent Neural Networks

Attention and Augmented Recurrent Neural Networks CHRIS OLAHGoogle Brain SHAN CARTERGoogle Brain Sept. 8 2016 Citation: Olah & Carter, 2016 Recurrent neural networks are one of the staples of deep learning, allowing neural networks to work with seque

用tensorflow框架搭建基于seq2seq-attention的聊天机器人

Tensorflow版本: GPU: 1.12.0 理论部分: 参考:https://www.bilibili.com/video/av19080685,讲解的超级详细. 代码部分: 1.语料库预处理 2.搭建模型计算图 3.启动session会话,进行模型训练. 文件夹图示如下:其中data文件夹存储对话语料,ids文件夹存储词语和id之间的映射关系,tmp文件夹存储了整个的字典以及word2vec模型,checkpoint文件存储了tensorflow训练的模型. 进入代码实战部分: 首先得

keras系列︱seq2seq系列相关实现与案例(feedback、peek、attention类型)

之前在看<Semi-supervised Sequence Learning>这篇文章的时候对seq2seq半监督的方式做文本分类的方式产生了一定兴趣,于是开始简单研究了seq2seq.先来简单说一下这篇paper的内容: 创立的新形式Sequence AutoEncoder LSTM(SA-LSTM),Pre-trained RNNs are more stable, generalize better, and achieve state-of-the-art results on var

Pointer-network的tensorflow实现-1

pointer-network是最近seq2seq比较火的一个分支,在基于深度学习的阅读理解,摘要系统中都被广泛应用. 感兴趣的可以阅读原paper 推荐阅读 https://medium.com/@devnag/pointer-networks-in-tensorflow-with-sample-code-14645063f264 ? ? 这个思路也是比较简单 就是解码的预测限定在输入的位置上 这在很多地方有用 比如考虑机器翻译的大词典问题,词汇太多了很多词是长尾的,词向量训练是不充分的,那么

(转)Image Segmentation with Tensorflow using CNNs and Conditional Random Fields

Daniil's blog Machine Learning and Computer Vision artisan. About/ Blog/ Image Segmentation with Tensorflow using CNNs and Conditional Random Fields Tensorflow and TF-Slim | Dec 18, 2016 A post showing how to perform Image Segmentation with a recentl

解析Tensorflow官方English-Franch翻译器demo

今天我们来解析下Tensorflow的Seq2Seq的demo.继上篇博客的PTM模型之后,Tensorflow官方也开放了名为translate的demo,这个demo对比之前的PTM要大了很多(首先,空间上就会需要大约20个G,另外差点把我的硬盘给运行死),但是也实用了很多.模型采用了encoder-decoder的框架结果,佐以attention机制来实现论文中的英语法语翻译功能.同时,模型的基础却来自之前的PTM模型.下面,让我们来一起来了解一下这个神奇的系统吧! 论文介绍及基础描写:

Tensorflow打造聊天机器人

Tensorflow聊天机器人 聊天机器人也叫做对话系统,是一个热门领域.微软.facebook.苹果.google.微信.slack都在上面做了大的投入,这是一波新的试图改变人和服务交流的创业浪潮.例如operator x.ai,chatfuel,以及一些库例如botkit,微软的bot开发库. 许多公司都希望机器人可以自然对话,和人类没有区别.并且许多对外声明说用了NLP和深度学习技术来实现这个目标.但围绕AI这些天花乱坠的宣传有时候也很难区别现实和虚化的差别. 我要在这个系列文章里将一些构