《Pointer Networks》

这周读的是《Pointer Networks》这篇文章。作者是Google brain和UC Berkeley的研究人员,作者在本文中通过对编码器-解码器机制和注意力机制进行改进,提出了新的网络结构pointer network,并将其运用到解决组合最优化问题。下图为seq2seq模型与指针网络的对比:

可以看出传统的seq2seq模型最终产生的是一个序列,且序列中包含的元素个数与输入序列中的元素个数相同;指针网络则是产生了一个指针,通过解码器之后通过计算对应的注意力系数产生到输入序列对应元素的指针。

作者的改进是通过对注意力机制进行改进实现的,传统的注意力机制是通过计算解码器中的隐层向量同编码器各个阶段输出的隐层向量的相关性,加权之后作为额外信息输入到解码器,起到软对齐的作用,来提高模型的性能。其计算过程如下:

改进之后的注意力机制则是将第二三步省略直接通过对向量u进行softmax得到系数最大相关向量,由此产生指针。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Pointer Networks是一种用于组合优化问题的神经网络模型,它可以处理长度可变的序列输入并输出一个可重复的子集,这个子集的大小是固定的。 这个模型的代码可以在GitHub上找到,它被实现为一个TensorFlow模型。以下是代码的主要部分: ```python class PointerModel(object): def __init__(self, input_dim, hidden_dim, seq_len, lr=0.001): self.input_dim = input_dim self.hidden_dim = hidden_dim self.seq_len = seq_len self.lr = lr self.input_data = tf.placeholder(tf.float32, [None, self.input_dim]) self.target_data = tf.placeholder(tf.int32, [None, self.seq_len]) self.encoder_cell = tf.nn.rnn_cell.GRUCell(self.hidden_dim) self.decoder_cell = tf.nn.rnn_cell.GRUCell(self.hidden_dim) with tf.variable_scope('encoder'): self.encoder_outputs, self.encoder_final_state = tf.nn.dynamic_rnn(self.encoder_cell, self.input_data, dtype=tf.float32) with tf.variable_scope('decoder'): self.decoder_outputs, self.decoder_final_state = tf.nn.dynamic_rnn(self.decoder_cell, tf.zeros([tf.shape(self.input_data)[0], self.seq_len, self.hidden_dim]), dtype=tf.float32, initial_state=self.encoder_final_state) with tf.variable_scope('pointer'): self.W1 = tf.Variable(tf.random_normal([self.hidden_dim, self.hidden_dim], stddev=0.1)) self.W2 = tf.Variable(tf.random_normal([self.hidden_dim, self.hidden_dim], stddev=0.1)) self.v = tf.Variable(tf.random_normal([self.hidden_dim, 1], stddev=0.1)) def get_logits(i, prev_output): prev_output = tf.expand_dims(prev_output, 1) u = tf.tanh(tf.matmul(self.decoder_outputs[:, i, :], self.W1) + tf.matmul(prev_output, self.W2)) return tf.matmul(u, self.v) self.logits = [] prev_output = tf.zeros([tf.shape(self.input_data)[0], self.hidden_dim]) for i in range(self.seq_len): logit = get_logits(i, prev_output) self.logits.append(logit) prev_output = self.decoder_outputs[:, i, :] self.logits = tf.stack(self.logits, axis=1) self.probs = tf.nn.softmax(self.logits) loss_mask = 1 - tf.to_float(tf.equal(self.target_data, 0)) self.loss = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(logits=self.logits, labels=self.target_data) * loss_mask) self.train_op = tf.train.AdamOptimizer(self.lr).minimize(self.loss) ``` 这个模型的实现包括了一个编码器和一个解码器,以及一个指针网络层。编码器和解码器都是GRU单元。指针网络层使用了两个权重矩阵和一个向量来计算每个位置的指针概率,并将它们组合成一个概率分布。 在训练过程中,模型使用交叉熵损失函数来最小化预测值与真实值之间的差距,并使用Adam优化器来更新模型的参数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值