【论文笔记】Pointer Networks

原文地址

  Pointer Networks

主要内容(待更新)

Abstract

  我们提出一种新的神经网络结构来学习输出序列的条件概率,输出序列由与输入序列中位置对应的离散单词组成。这样的问题不能用现有的方法如sequence-to-sequence和neural turing machines(神经图灵机)解决,因为在输出的每个时间步,目标类别的数量取决于输入的长度,而这是变化的。例如可变长度序列排序、各种组合优化问题都属于此类。我们的模型使用最近提出的神经注意力机制解决了输出字典可变大小的问题。它不同于以前的注意力机制中的作用,在解码器中的每一步使用注意力将编码器隐藏结点信息融入context vector(上下文向量),而是把注意作为指针来选择输入序列中的某个元素作为输出。我们把这种架构称为Pointer Net(Ptr-Net,指针网络)。我们介绍了Ptr-Nets可以从训练样本中学习3个高难度的几何数学问题的近似解:寻找平面凸包,计算Delaunay三角以及平面旅行商问题(TSP)。Ptr-Nets不仅有助于解决带输入注意的sequence-to-sequence问题,而且可以推广到可变大小的输出字典问题。我们展示了学习模型推广到超过它们训练时最大长度的情况。我们希望这些任务的结果能够在对离散问题的神经网络学习中引起更广泛的探索。

1 Introduction

2 Models

  我们将在2.1小节和2.2小节重温sequence-to-sequence和input-attention模型,而这些是这2小节中工作的基线模型。然后在2.3小节中描述模型Ptr-Net。

2.1 Sequence-to-Sequence Model

  给出一个训练对 ( P , C P ) (\mathcal{P}, \mathcal{C^P}) (P,CP),sequence-to-sequence模型使用参数化模型(带有参数 θ \theta θ的RNN)计算条件概率 p ( C P ∣ P ; θ ) p(\mathcal{C^P|P};\theta) p(CPP;θ),来估计链式概率的结果,公式如下:
p ( C P ∣ P ; θ ) = ∏ i = 1 m ( P ) p θ ( C i ∣ C 1 , … , C i − 1 , P ; θ ) ( 1 ) p(\mathcal{C^P|P};\theta) = \prod_{i=1}^{m(\mathcal{P})}p_\theta(C_i|C_1,\dots,C_{i-1},\mathcal{P};\theta) \quad \quad \quad\quad\quad (1) p(CPP;θ)=i=1m(P)pθ(CiC1,,Ci1,P;θ)(1)上述中 P = { P 1 , … , P n } \mathcal{P} = \{P_1,\dots,P_n\} P={P1,,Pn} n n n个向量的序列, C P = { C 1 , … , C m ( P ) } \mathcal{C^P} = \{C_1, \dots, C_{m(\mathcal{P})}\} CP={C1,,Cm(P)} m ( P ) m(\mathcal{P}) m(P)个索引的序列,它在1~ n n n之间。通过最大化训练集的条件概率学习模型的参数,公式如下:
θ ∗ = arg ⁡ max ⁡ θ ∑ P , C P log ⁡ p ( C P ∣ P ; θ ) ( 2 ) \theta^\ast = \mathop{\arg\max} \limits_{\theta} \sum_{\mathcal{P, C^P}} \log p(\mathcal{C^P|P};\theta)\quad\quad\quad\quad\quad(2) θ=θargmaxP,CPlogp(CPP;θ)(2)上式的求和操作在训练样本上进行。在sequence-to-sequence模型中,我们使用长短期记忆(LSTM)建模 p θ ( C i ∣ C 1 , … , C i − 1 , P ; θ ) p_\theta(C_i|C_1, \dots, C_{i-1}, \mathcal{P};\theta) pθ(CiC1,,Ci1,P;θ)。在每个时间步 i i i输入 P i P_i Pi到RNN模型,直到输入序列的结束,再输入一个特殊符号 ⇒ \Rightarrow 。然后模型跳转到生成模式(产生输出),直到网络遇到特殊符号 ⇐ \Leftarrow ,标志输出序列的结束。
注意,这个模型不做统计上的独立性假设。我们使用了2个独立的RNN,一个编码向量 P j P_j Pj组成的序列,一个生成或解码输出符号 C i C_i Ci。称前一个RNN为编码器,后一个RNN为解码器或者生成式RNN。在推理过程中,给出序列 P \mathcal{P} P,学习参数 θ ∗ \theta^* θ会选出最大概率的序列 C ^ P \mathcal{\hat{C}^P} C^P,如:
C ^ P = arg ⁡ max ⁡ C P p ( C P ∣ P ; θ ∗ ) \mathcal{\hat{C}^P} = \mathop{\arg\max}\limits_\mathcal{C^P} p(\mathcal{C^P|P}; \theta^*) C^P=CPargmaxp(CPP;θ)由于可能的输出序列的组合数(太大),找到最优序列 C ^ \mathcal{\hat{C}} C^在计算上不切实际。因此,使用束搜索算法(beam search)在给定束大小下,寻找最大可能的序列。在sequence-to-sequence模型中,包含所有索引 C i C_i Ci的输出字典的大小是固定的并且等于 n n n,因为输出是从输入选择的。因此,我们需要为每个 n n n训练独立的模型。这就无法学习输出字典大小依赖于输入序列长度问题的求解方法。假设输出数量是 O ( n ) O(n) O(n),这个模型的计算复杂度是 O ( n ) O(n) O(n)。然而,我们正在处理的问题的精确算法计算代价更高。例如,凸包问题的计算复杂度是 O ( n log ⁡ n ) O(n \log n) O(nlogn)。而注意力机制(见2.2小节)会给模型带来更大的计算量。

2.2 Content Based Input Attention

  基础sequence-to-sequence模型在输入序列 P \mathcal{P} P的末端利用识别RNN的固定维度状态生成完整的输出序列 C P \mathcal{C^P} CP。这限制了流入生成模型的信息和计算量。注意力模型改善了这个问题,它利用一个额外的神经网络增强了编码器RNN和解码器RNN,而这个神经网络对编码器RNN状态的整个序列使用了注意力机制。出于符号化目的,编码器和解码器的隐藏状态分别定义为 ( e 1 , … , e n ) (e_1, \dots, e_n) (e1,,en) ( d 1 , … , d m ( P ) ) (d_1, \dots, d_{m(\mathcal{P})}) (d1,,dm(P))。对于LSTM RNN,使用输出门与激活函数逐位相乘后的状态。在每个输出时间步 i i i,计算注意向量过程如下:
u j i = v T t a n h ( W 1 e j + W 2 d i ) j ∈ ( 1 , … , n ) a j i = s o f t m a x ( u j i ) j ∈ ( 1 , … , n ) ( 3 ) d i ′ = ∑ j = 1 n a j i e j u_j^i = v^T tanh ( W_1 e_j + W_2 d_i) \quad j \in (1, \dots, n)\quad\quad\\ a_j^i = softmax(u_j^i) \quad j \in (1, \dots, n)\quad\quad\quad\quad\quad(3)\\ d_i^\prime = \sum_{j=1}^n a_j^i e_j\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad uji=vTtanh(W1ej+W2di)j(1,,n)aji=softmax(uji)j(1,,n)(3)di=j=1najiej上式中 s o f t m a x softmax softmax将向量 u i u^i ui(长度为 n n n)归一化为注意力掩码(attention mask), v , W 1 和 W 2 v, W_1和W_2 v,W1W2是可学习参数。在所有实验中,编码器和解码器使用相同的隐藏层维度,所以 v v v是向量, W 1 和 W 2 W_1和W_2 W1W2是方阵。最后, d i ′ 和 d i d_i^\prime和d_i didi连接起来作为隐藏状态,用于做预测或者输入到循环模型的下一个时间步。注意,每个输出都要做 n n n个计算操作,所以推理时的计算复杂度变为 O ( n 2 ) O(n^2) O(n2)。在凸包问题上,这个模型比sequence-to-sequence模型效果更好,但是仍不适用于输出字典大小依赖输入的问题。尽管如此,模型经过非常简单的延伸(或者只是缩减)后就可以轻松解决这个问题。

2.3 Ptr-Net

  接下来将说明,对注意力模型做小小的改进后,可以将模型应用于解决输出字典大小依赖输入序列长度的组合优化问题。2.1小节中,sequence-to-sequence模型对固定大小的输出字典使用 s o f t m a x softmax softmax分布计算公式(1)中的 p ( C I ∣ C 1 , … , C i − 1 , P ) p(C_I|C_1, \dots, C_{i-1}, \mathcal{P}) p(CIC1,,Ci1,P)。因此这个模型不能解决输出字典大小可变的问题。为了解决这个问题,使用公式(3)中的注意力机制建模 p ( C I ∣ C 1 , … , C i − 1 , P ) p(C_I|C_1, \dots, C_{i-1}, \mathcal{P}) p(CIC1,,Ci1,P),公式如下:
u j i = v T t a n h ( W 1 e j + W 2 d i ) j ∈ ( 1 , … , n ) p ( C I ∣ C 1 , … , C i − 1 , P ) = s o f t m a x ( u i ) u_j^i = v^T tanh ( W_1 e_j + W_2 d_i) \quad j \in (1, \dots, n)\\ p(C_I|C_1, \dots, C_{i-1}, \mathcal{P}) = softmax(u^i) uji=vTtanh(W1ej+W2di)j(1,,n)p(CIC1,,Ci1,P)=softmax(ui)上式中 s o f t m a x softmax softmax将向量 u i u^i ui(长度为 n n n)归一化为输入字典上的分布输出, v , W 1 和 W 2 v, W_1和W_2 v,W1W2是可学习参数。这里没有融入编码器状态 e j e_j ej来传播更多的信息到解码器,而是将 u j i u_j^i uji作为指向输入元素的指针。类似地,对应于公式(1)中的 C i − 1 C_{i-1} Ci1,使用对应的 P C i − 1 P_{C_{i-1}} PCi1作为输入。我们的方法和注意力模型都可以视为基于上下文的注意力机制的应用。值得注意的是,该方法具体地针对那些输出是离散的并且对应于输入序列中的位置的问题。有一些问题可能不会被正确地解决,例如使用RNN学习直接输出目标点的坐标。然而,在推理时,这个方法并不遵守约束条件:输出精确地映射回输入。没有这个限制条件,长序列的预测结果将会变得模糊不清。

3 Motivation and Datasets Structure

  接下来的小节,将回顾前面提到的3个问题并说明所用数据的生成方案。在训练集,输入是平面的 n n n点集 P = { P 1 , … , P n } P = \{P_1, \dots, P_n\} P={P1,,Pn},其中 P j = ( x j , y j ) P_j = (x_j, y_j) Pj=(xj,yj),是笛卡尔坐标系(直角坐标系)中的点坐标。在这样的点集上寻找凸包、Delaunay三角或者TSP的解。在全部实验中,点集从 [ 0 , 1 ] × [ 0 , 1 ] [0, 1] \times [0, 1] [0,1]×[0,1]区域使用均匀分布采样。输出 C P = { C 1 , … , C m ( P ) } \mathcal{C^P} = \{C_1, \dots, C_{m(\mathcal{P})}\} CP={C1,,Cm(P)}是表示点集 P \mathcal{P} P上解的序列。在图2中可以看到凸包和Delaunay三角的输入/输出 ( P , C P ) \mathcal{(P, C^P)} (P,CP)

3.1 Convex Hull

  使用这个例子作为基准来发展模型并理解使用数据驱动方法解决组合问题的困难。找到有限个点的凸包在计算几何中是很好理解的,已经有几个精确的解法被提出。一般地,找到解(一般唯一)的计算复杂度为 O ( n log ⁡ n ) O(n \log n) O(nlogn) n n n是点的个数。向量 P j P_j Pj [ 0 , 1 ] × [ 0 , 1 ] [0, 1] \times [0, 1] [0,1]×[0,1]均匀采样。 C i C_i Ci是对应于序列 P P P中位置的索引,在1~ n n n之间,或表示序列开始、结束的特殊字符,如图2(a)所示。为了将输出表达为序列,从最小索引表示的点开始,逆时针走(随机选择,但是有助于减少训练时的不确定)构成序列。
在这里插入图片描述

3.2 Delaunay Triangulation

  平面点集 P \mathcal{P} P的Delaunay三角是一种三角测量,它使得每个三角形的外接圆是空的,即外接圆内部没有来自 P \mathcal{P} P的点。在这个例子中,输出 C P = { C 1 , … , C m ( P ) } \mathcal{C^P} = \{C_1, \dots, C_{m(\mathcal{P})}\} CP={C1,,Cm(P)}对应于序列,这些序列表达了点集 P \mathcal{P} P的三角测量。每个 C i C_i Ci是整数构成的三元组,从1~ n n n,对应 P \mathcal{P} P中三角顶点的位置或者序列符号的开始/结束。如图2(b)所示。注意,序列 C P \mathcal{C^P} CP的任何排列都代表 P \mathcal{P} P的同一种三角测量,而且组成每个三角表达 C i C_i Ci的3个整数也可以被排列。不失一般性地,类似在训练过程中为凸包问题所做的,通过内切圆心坐标(词典编辑顺序)给三角形 C i C_i Ci排序并选择升序的三角表达序列。模型在不排序的情况下表现较差,而找出让Ptr-Net更好发挥的排序方式将会是未来工作的一部分。

3.3 Travelling Salesman Problem (TSP)

  TSP出现在计算机科学理论的诸多领域,是微芯片设计或DNA序列的重要算法。我们的工作主要针对平面对称TSP:给出城市列表,找到最短路径,能够参观每个城市仅一次且最终回到起始点。此外,假设两个城市之间往返的距离一致。这个NP-难(NP-hard)问题可以测试模型的能力以及局限性。输入/输出对 ( P , C P ) \mathcal{(P, C^P)} (P,CP)的形式与3.1小节中凸包问题的输入/输出对类似。 P \mathcal{P} P是笛卡尔坐标系中表示城市的点集,从 [ 0 , 1 ] × [ 0 , 1 ] [0, 1] \times [0, 1] [0,1]×[0,1]区域随机选择。 C P = { C 1 , … , C n } \mathcal{C^P} = \{C_1, \dots, C_n\} CP={C1,,Cn}是1~ n n n的整数排列,代表最优路径。为保持一致性,在训练集上总是从第一个城市开始。为了获得准确的数据,使用了Held-Karp算法,它能以 O ( 2 n n 2 ) O(2^n n^2) O(2nn2)的复杂度找到最优解(实验中 n n n增大到20)。在更大的 n n n下找到精确解的计算代价太大,因此考虑了得到近似解的算法,如A1和A2,这两个的复杂度都是 O ( n 2 ) O(n^2) O(n2),以及A3,它应用了复杂度为 O ( n 3 ) O(n^3) O(n3)的Christofides算法(A1、A2、A3均为原文中参考文献的算法)。A3算法可以保证找到最短路径长度1.5倍以内的近似解。 表2展示了测试集上的结果。
图

4 Empirical Results

4.1 Architecture and Hyperparameters

4.2 Convex Hull

4.3 Delaunay Triangulation

4.4 Travelling Salesman Problem

5 Conclusions

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、付费专栏及课程。

余额充值