├── imgs
└── Снимок экрана 2017-12-26 в 4.30.58 ДП.png
├── README.md
├── Intro to Pointer Network.ipynb
└── Neural Combinatorial Optimization.ipynb
/imgs/Снимок экрана 2017-12-26 в 4.30.58 ДП.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cafe/np-hard-deep-reinforcement-learning/master/imgs/Снимок экрана 2017-12-26 в 4.30.58 ДП.png
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # combinatorial optimization with DL/RL: IPython tutorials
2 | This tutorial demonstrates technique to solve combinatorial optimization problems such as the well-known travelling salesman problem. The method was presented in the paper [Neural Combinatorial Optimization with Reinforcement Learning](https://arxiv.org/abs/1611.09940).
3 |
4 | The Algorithm applies the pointer network architecture wherein an attention mechanism is fashioned to point to elements of an input sequence, allowing a decoder to output said elements. The network is trained by reinforcement learning using an actor-critic method.
5 |
6 | **Note!** This model does not beat existing baselines for TSP, moreover local search method LK-H solves these tsp tasks to optimality in seconds on a CPU, compared to suboptimal results by this model in several hours on a GPU.
7 |
8 | The algorithm consists of two parts:
9 |
10 | ## Pointer Network
11 |
12 | Intro to PN for simple sorting task: [Intro to Pointer Network.ipynb](https://github.com/higgsfield/np-hard-deep-reinforcement-learning/blob/master/Intro%20to%20Pointer%20Network.ipynb).
13 |
14 | Paper: [Pointer Networks](https://arxiv.org/abs/1506.03134).
15 |
16 | Blog post by fast ml: [Introduction to pointer networks](http://fastml.com/introduction-to-pointer-networks/).
17 |
18 | ## Neural Combinatorial Optimization
19 |
20 | [Neural Combinatorial Optimization.ipynb](https://github.com/higgsfield/np-hard-deep-reinforcement-learning/blob/master/Neural%20Combinatorial%20Optimization.ipynb)
21 |
22 | Paper: [Neural Combinatorial Optimization with Reinforcement Learning](https://arxiv.org/abs/1611.09940)
23 |
24 |
25 |
--------------------------------------------------------------------------------
/Intro to Pointer Network.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {
6 | "collapsed": true
7 | },
8 | "source": [
9 | "This tutorial demostrates Pointer Networks with readable code."
10 | ]
11 | },
12 | {
13 | "cell_type": "code",
14 | "execution_count": null,
15 | "metadata": {
16 | "collapsed": true
17 | },
18 | "outputs": [],
19 | "source": [
20 | "import math\n",
21 | "import numpy as np\n",
22 | "\n",
23 | "import torch\n",
24 | "import torch.nn as nn\n",
25 | "import torch.optim as optim\n",
26 | "import torch.autograd as autograd\n",
27 | "import torch.nn.functional as F\n",
28 | "from torch.autograd import Variable\n",
29 | "from torch.utils.data import Dataset, DataLoader\n",
30 | "\n",
31 | "USE_CUDA = True"
32 | ]
33 | },
34 | {
35 | "cell_type": "code",
36 | "execution_count": 3,
37 | "metadata": {
38 | "collapsed": true
39 | },
40 | "outputs": [],
41 | "source": [
42 | "from IPython.display import clear_output\n",
43 | "from tqdm import tqdm\n",
44 | "import matplotlib.pyplot as plt\n",
45 | "%matplotlib inline"
46 | ]
47 | },
48 | {
49 | "cell_type": "markdown",
50 | "metadata": {},
51 | "source": [
52 | "
Generating dataset for sorting task
"
53 | ]
54 | },
55 | {
56 | "cell_type": "code",
57 | "execution_count": 4,
58 | "metadata": {
59 | "collapsed": false
60 | },
61 | "outputs": [],
62 | "source": [
63 | "class SortDataset(Dataset):\n",
64 | " \n",
65 | " def __init__(self, data_len, num_samples, random_seed=111):\n",
66 | " super(SortDataset, self).__init__()\n",
67 | " torch.manual_seed(random_seed)\n",
68 | "\n",
69 | " self.data_set = []\n",
70 | " for _ in tqdm(range(num_samples)):\n",
71 | " x = x = torch.randperm(data_len)\n",
72 | " self.data_set.append(x)\n",
73 | "\n",
74 | " self.size = len(self.data_set)\n",
75 | "\n",
76 | " def __len__(self):\n",
77 | " return self.size\n",
78 | "\n",
79 | " def __getitem__(self, idx):\n",
80 | " return self.data_set[idx]"
81 | ]
82 | },
83 | {
84 | "cell_type": "code",
85 | "execution_count": 5,
86 | "metadata": {
87 | "collapsed": true
88 | },
89 | "outputs": [],
90 | "source": [
91 | "train_size = 1000\n",
92 | "val_size = 100"
93 | ]
94 | },
95 | {
96 | "cell_type": "code",
97 | "execution_count": 6,
98 | "metadata": {
99 | "collapsed": false
100 | },
101 | "outputs": [
102 | {
103 | "name": "stderr",
104 | "output_type": "stream",
105 | "text": [
106 | "100%|██████████| 1000/1000 [00:00<00:00, 23103.26it/s]\n",
107 | "100%|██████████| 100/100 [00:00<00:00, 188338.75it/s]\n"
108 | ]
109 | }
110 | ],
111 | "source": [
112 | "train_dataset = SortDataset(10, train_size)\n",
113 | "val_dataset = SortDataset(10, val_size)"
114 | ]
115 | },
116 | {
117 | "cell_type": "markdown",
118 | "metadata": {},
119 | "source": [
120 | "Attention mechanism
\n",
121 | "\n",
122 | "Using two types of attention mechanism: \"Dot\" and \"Bahdanau\" . More details in Effective Approaches to Attention-based Neural Machine Translation
"
123 | ]
124 | },
125 | {
126 | "cell_type": "markdown",
127 | "metadata": {},
128 | "source": [
129 | "$$\n",
130 | "a_t(s) = align(h_t, \\bar h_s) = \\dfrac{exp(score(h_t, \\bar h_s))}{\\sum_{s'} exp(score(h_t, \\bar h_{s'}))}\n",
131 | "$$\n",
132 | "\n",
133 | "$$\n",
134 | "score(h_t, \\bar h_s) =\n",
135 | "\\begin{cases}\n",
136 | "h_t ^\\top \\bar h_s & Dot \\\\\n",
137 | "v_a ^\\top \\tanh(\\textbf{W}_a [ h_t ; \\bar h_s ]) & Bahdanau\n",
138 | "\\end{cases}\n",
139 | "$$"
140 | ]
141 | },
142 | {
143 | "cell_type": "code",
144 | "execution_count": 25,
145 | "metadata": {
146 | "collapsed": true
147 | },
148 | "outputs": [],
149 | "source": [
150 | "class Attention(nn.Module):\n",
151 | " def __init__(self, hidden_size, use_tanh=False, C=10, use_cuda=USE_CUDA):\n",
152 | " super(Attention, self).__init__()\n",
153 | " \n",
154 | " self.use_tanh = use_tanh\n",
155 | " self.W_query = nn.Linear(hidden_size, hidden_size)\n",
156 | " self.W_ref = nn.Conv1d(hidden_size, hidden_size, 1, 1)\n",
157 | " self.C = C\n",
158 | " \n",
159 | " V = torch.FloatTensor(hidden_size)\n",
160 | " if use_cuda:\n",
161 | " V = V.cuda() \n",
162 | " self.V = nn.Parameter(V)\n",
163 | " self.V.data.uniform_(-(1. / math.sqrt(hidden_size)) , 1. / math.sqrt(hidden_size))\n",
164 | " \n",
165 | " def forward(self, query, ref):\n",
166 | " \"\"\"\n",
167 | " Args: \n",
168 | " query: [batch_size x hidden_size]\n",
169 | " ref: ]batch_size x seq_len x hidden_size]\n",
170 | " \"\"\"\n",
171 | " \n",
172 | " batch_size = ref.size(0)\n",
173 | " seq_len = ref.size(1)\n",
174 | "\n",
175 | " ref = ref.permute(0, 2, 1)\n",
176 | " query = self.W_query(query).unsqueeze(2) # [batch_size x hidden_size x 1]\n",
177 | " ref = self.W_ref(ref) # [batch_size x hidden_size x seq_len] \n",
178 | "\n",
179 | " expanded_query = query.repeat(1, 1, seq_len) # [batch_size x hidden_size x seq_len]\n",
180 | " V = self.V.unsqueeze(0).unsqueeze(0).repeat(batch_size, 1, 1) # [batch_size x 1 x hidden_size]\n",
181 | "\n",
182 | " logits = torch.bmm(V, F.tanh(expanded_query + ref)).squeeze(1)\n",
183 | " \n",
184 | " if self.use_tanh:\n",
185 | " logits = self.C * F.tanh(logits)\n",
186 | " else:\n",
187 | " logits = logits \n",
188 | " return ref, logits"
189 | ]
190 | },
191 | {
192 | "cell_type": "markdown",
193 | "metadata": {},
194 | "source": [
195 | "Pointer Network
\n",
196 | "Pointer Networks\n",
197 | "
\n",
198 | "The model solves the problem of variable size output dictionaries using a recently proposed mechanism of neural attention. It differs from the previous attention attempts in that, instead of using attention to blend hidden units of an encoder to a context vector at each decoder step, it uses attention as a pointer to select a member of the input sequence as the output.
\n",
199 | "
"
200 | ]
201 | },
202 | {
203 | "cell_type": "code",
204 | "execution_count": 30,
205 | "metadata": {
206 | "collapsed": true
207 | },
208 | "outputs": [],
209 | "source": [
210 | "class PointerNet(nn.Module):\n",
211 | " def __init__(self, \n",
212 | " embedding_size,\n",
213 | " hidden_size,\n",
214 | " seq_len,\n",
215 | " n_glimpses,\n",
216 | " tanh_exploration,\n",
217 | " use_tanh,\n",
218 | " use_cuda=USE_CUDA):\n",
219 | " super(PointerNet, self).__init__()\n",
220 | " \n",
221 | " self.embedding_size = embedding_size\n",
222 | " self.hidden_size = hidden_size\n",
223 | " self.n_glimpses = n_glimpses\n",
224 | " self.seq_len = seq_len\n",
225 | " self.use_cuda = use_cuda\n",
226 | " \n",
227 | " \n",
228 | " self.embedding = nn.Embedding(seq_len, embedding_size)\n",
229 | " self.encoder = nn.LSTM(embedding_size, hidden_size, batch_first=True)\n",
230 | " self.decoder = nn.LSTM(embedding_size, hidden_size, batch_first=True)\n",
231 | " self.pointer = Attention(hidden_size, use_tanh=use_tanh, C=tanh_exploration, use_cuda=use_cuda)\n",
232 | " self.glimpse = Attention(hidden_size, use_tanh=False, use_cuda=use_cuda)\n",
233 | " \n",
234 | " self.decoder_start_input = nn.Parameter(torch.FloatTensor(embedding_size))\n",
235 | " self.decoder_start_input.data.uniform_(-(1. / math.sqrt(embedding_size)), 1. / math.sqrt(embedding_size))\n",
236 | " \n",
237 | " self.criterion = nn.CrossEntropyLoss()\n",
238 | " \n",
239 | " def apply_mask_to_logits(self, logits, mask, idxs): \n",
240 | " batch_size = logits.size(0)\n",
241 | " clone_mask = mask.clone()\n",
242 | "\n",
243 | " if idxs is not None:\n",
244 | " clone_mask[[i for i in range(batch_size)], idxs.data] = 1\n",
245 | " logits[clone_mask] = -np.inf\n",
246 | " return logits, clone_mask\n",
247 | " \n",
248 | " def forward(self, inputs, target):\n",
249 | " \"\"\"\n",
250 | " Args: \n",
251 | " inputs: [batch_size x sourceL]\n",
252 | " \"\"\"\n",
253 | " batch_size = inputs.size(0)\n",
254 | " seq_len = inputs.size(1)\n",
255 | " assert seq_len == self.seq_len\n",
256 | " \n",
257 | " embedded = self.embedding(inputs)\n",
258 | " target_embedded = self.embedding(target)\n",
259 | " encoder_outputs, (hidden, context) = self.encoder(embedded)\n",
260 | " \n",
261 | " mask = torch.zeros(batch_size, seq_len).byte()\n",
262 | " if self.use_cuda:\n",
263 | " mask = mask.cuda()\n",
264 | " \n",
265 | " idxs = None\n",
266 | " \n",
267 | " decoder_input = self.decoder_start_input.unsqueeze(0).repeat(batch_size, 1)\n",
268 | " \n",
269 | " loss = 0\n",
270 | " \n",
271 | " for i in range(seq_len):\n",
272 | " \n",
273 | " \n",
274 | " _, (hidden, context) = self.decoder(decoder_input.unsqueeze(1), (hidden, context))\n",
275 | " \n",
276 | " query = hidden.squeeze(0)\n",
277 | " for i in range(self.n_glimpses):\n",
278 | " ref, logits = self.glimpse(query, encoder_outputs)\n",
279 | " logits, mask = self.apply_mask_to_logits(logits, mask, idxs)\n",
280 | " query = torch.bmm(ref, F.softmax(logits).unsqueeze(2)).squeeze(2) \n",
281 | " \n",
282 | " \n",
283 | " _, logits = self.pointer(query, encoder_outputs)\n",
284 | " logits, mask = self.apply_mask_to_logits(logits, mask, idxs)\n",
285 | " \n",
286 | " decoder_input = target_embedded[:,i,:]\n",
287 | " \n",
288 | " loss += self.criterion(logits, target[:,i])\n",
289 | " \n",
290 | " \n",
291 | " return loss / seq_len"
292 | ]
293 | },
294 | {
295 | "cell_type": "code",
296 | "execution_count": 31,
297 | "metadata": {
298 | "collapsed": false
299 | },
300 | "outputs": [],
301 | "source": [
302 | "pointer = PointerNet(embedding_size=32, hidden_size=32, seq_len=10, n_glimpses=1, tanh_exploration=10, use_tanh=True)\n",
303 | "adam = optim.Adam(pointer.parameters(), lr=1e-4)\n",
304 | "\n",
305 | "if USE_CUDA:\n",
306 | " pointer = pointer.cuda()"
307 | ]
308 | },
309 | {
310 | "cell_type": "code",
311 | "execution_count": 32,
312 | "metadata": {
313 | "collapsed": false
314 | },
315 | "outputs": [],
316 | "source": [
317 | "train_loader = DataLoader(train_dataset, batch_size=1, shuffle=True, num_workers=1)\n",
318 | "val_loader = DataLoader(val_dataset, batch_size=1, shuffle=True, num_workers=1)"
319 | ]
320 | },
321 | {
322 | "cell_type": "markdown",
323 | "metadata": {},
324 | "source": [
325 | "Train and Validate
"
326 | ]
327 | },
328 | {
329 | "cell_type": "code",
330 | "execution_count": 33,
331 | "metadata": {
332 | "collapsed": false,
333 | "scrolled": false
334 | },
335 | "outputs": [
336 | {
337 | "data": {
338 | "image/png": "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\nEARBEAKU/wc96ASxxhbKmwAAAABJRU5ErkJggg==\n",
339 | "text/plain": [
340 | ""
341 | ]
342 | },
343 | "metadata": {},
344 | "output_type": "display_data"
345 | }
346 | ],
347 | "source": [
348 | "n_epochs = 1\n",
349 | "train_loss = []\n",
350 | "val_loss = []\n",
351 | "\n",
352 | "for epoch in range(n_epochs):\n",
353 | " for batch_id, sample_batch in enumerate(train_loader):\n",
354 | "\n",
355 | " inputs = Variable(sample_batch)\n",
356 | " target = Variable(torch.sort(sample_batch)[0])\n",
357 | " if USE_CUDA:\n",
358 | " inputs = inputs.cuda()\n",
359 | " target = target.cuda()\n",
360 | "\n",
361 | " loss = pointer(inputs, target)\n",
362 | "\n",
363 | " adam.zero_grad()\n",
364 | " loss.backward()\n",
365 | " adam.step()\n",
366 | " \n",
367 | " train_loss.append(loss.data[0])\n",
368 | "\n",
369 | " if batch_id % 10 == 0:\n",
370 | "\n",
371 | " clear_output(True)\n",
372 | " plt.figure(figsize=(20,5))\n",
373 | " plt.subplot(131)\n",
374 | " plt.title('train epoch %s loss %s' % (epoch, train_loss[-1] if len(train_loss) else 'collecting'))\n",
375 | " plt.plot(train_loss)\n",
376 | " plt.grid()\n",
377 | " plt.subplot(132)\n",
378 | " plt.title('val epoch %s loss %s' % (epoch, val_loss[-1] if len(val_loss) else 'collecting'))\n",
379 | " plt.plot(val_loss)\n",
380 | " plt.grid()\n",
381 | " plt.show()\n",
382 | " \n",
383 | " if batch_id % 100 == 0:\n",
384 | " pointer.eval()\n",
385 | " for val_batch in val_loader:\n",
386 | " inputs = Variable(val_batch)\n",
387 | " target = Variable(torch.sort(val_batch)[0])\n",
388 | " if USE_CUDA:\n",
389 | " inputs = inputs.cuda()\n",
390 | " target = target.cuda()\n",
391 | "\n",
392 | " loss = pointer(inputs, target)\n",
393 | " val_loss.append(loss.data[0])"
394 | ]
395 | }
396 | ],
397 | "metadata": {
398 | "kernelspec": {
399 | "display_name": "Python 2",
400 | "language": "python",
401 | "name": "python2"
402 | },
403 | "language_info": {
404 | "codemirror_mode": {
405 | "name": "ipython",
406 | "version": 2
407 | },
408 | "file_extension": ".py",
409 | "mimetype": "text/x-python",
410 | "name": "python",
411 | "nbconvert_exporter": "python",
412 | "pygments_lexer": "ipython2",
413 | "version": "2.7.13"
414 | }
415 | },
416 | "nbformat": 4,
417 | "nbformat_minor": 2
418 | }
419 |
--------------------------------------------------------------------------------
/Neural Combinatorial Optimization.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {
6 | "collapsed": true
7 | },
8 | "source": [
9 | "This tutorial presents Neural Combinatorial Optimization with Reinforcement Learning. Focusing on the traveling salesman problem (TSP) and train a recurrent neural network that, given a set of city coordinates, predicts a distribution over different city permutations. Using\n",
10 | "negative tour length as the reward signal, the model optimize the parameters of the recurrent\n",
11 | "neural network using a policy gradient method.
Despite the computational expense, without much engineering and\n",
12 | "heuristic designing, Neural Combinatorial Optimization achieves close to optimal\n",
13 | "results on 2D Euclidean graphs with up to 100 nodes.
\n",
14 | "Previous attempts used supervised learning. Learning from examples in such a\n",
15 | "way is undesirable for NP-hard problems because (1) the performance of the model is tied to the\n",
16 | "quality of the supervised labels, (2) getting high-quality labeled data is expensive and may be infeasible\n",
17 | "for new problem statements, (3) one cares more about finding a competitive solution more than\n",
18 | "replicating the results of another algorithm. By contrast, Reinforcement Learning (RL) provides an appropriate paradigm for training\n",
19 | "neural networks for combinatorial optimization, especially because these problems have relatively\n",
20 | "simple reward mechanisms that could be even used at test time.
"
21 | ]
22 | },
23 | {
24 | "cell_type": "code",
25 | "execution_count": null,
26 | "metadata": {
27 | "collapsed": true
28 | },
29 | "outputs": [],
30 | "source": [
31 | "import math\n",
32 | "import numpy as np\n",
33 | "\n",
34 | "import torch\n",
35 | "import torch.nn as nn\n",
36 | "import torch.optim as optim\n",
37 | "import torch.autograd as autograd\n",
38 | "import torch.nn.functional as F\n",
39 | "from torch.autograd import Variable\n",
40 | "from torch.utils.data import Dataset, DataLoader\n",
41 | "\n",
42 | "USE_CUDA = True"
43 | ]
44 | },
45 | {
46 | "cell_type": "code",
47 | "execution_count": 2,
48 | "metadata": {
49 | "collapsed": true
50 | },
51 | "outputs": [],
52 | "source": [
53 | "from IPython.display import clear_output\n",
54 | "from tqdm import tqdm\n",
55 | "import matplotlib.pyplot as plt\n",
56 | "%matplotlib inline"
57 | ]
58 | },
59 | {
60 | "cell_type": "markdown",
61 | "metadata": {},
62 | "source": [
63 | "Generating dataset for TSP Task
"
64 | ]
65 | },
66 | {
67 | "cell_type": "code",
68 | "execution_count": 3,
69 | "metadata": {
70 | "collapsed": true
71 | },
72 | "outputs": [],
73 | "source": [
74 | "class TSPDataset(Dataset):\n",
75 | " \n",
76 | " def __init__(self, num_nodes, num_samples, random_seed=111):\n",
77 | " super(TSPDataset, self).__init__()\n",
78 | " torch.manual_seed(random_seed)\n",
79 | "\n",
80 | " self.data_set = []\n",
81 | " for l in tqdm(range(num_samples)):\n",
82 | " x = torch.FloatTensor(2, num_nodes).uniform_(0, 1)\n",
83 | " self.data_set.append(x)\n",
84 | "\n",
85 | " self.size = len(self.data_set)\n",
86 | "\n",
87 | " def __len__(self):\n",
88 | " return self.size\n",
89 | "\n",
90 | " def __getitem__(self, idx):\n",
91 | " return self.data_set[idx]"
92 | ]
93 | },
94 | {
95 | "cell_type": "code",
96 | "execution_count": 4,
97 | "metadata": {
98 | "collapsed": true
99 | },
100 | "outputs": [],
101 | "source": [
102 | "train_size = 1000000\n",
103 | "val_size = 10000"
104 | ]
105 | },
106 | {
107 | "cell_type": "code",
108 | "execution_count": 5,
109 | "metadata": {
110 | "collapsed": false
111 | },
112 | "outputs": [
113 | {
114 | "name": "stderr",
115 | "output_type": "stream",
116 | "text": [
117 | "100%|██████████| 1000000/1000000 [00:01<00:00, 662672.59it/s]\n",
118 | "100%|██████████| 10000/10000 [00:00<00:00, 785980.06it/s]\n",
119 | "100%|██████████| 1000000/1000000 [00:01<00:00, 547748.62it/s]\n",
120 | "100%|██████████| 10000/10000 [00:00<00:00, 636706.49it/s]\n"
121 | ]
122 | }
123 | ],
124 | "source": [
125 | "train_20_dataset = TSPDataset(20, train_size)\n",
126 | "val_20_dataset = TSPDataset(20, val_size)\n",
127 | "\n",
128 | "train_50_dataset = TSPDataset(50, train_size)\n",
129 | "val_50_dataset = TSPDataset(50, val_size)"
130 | ]
131 | },
132 | {
133 | "cell_type": "markdown",
134 | "metadata": {},
135 | "source": [
136 | "Reward
\n",
137 | "\n",
138 | "Given an input graph, represented as a sequence of n cities in a two dimensional space, the task is finding a permutation of the points π, termed a tour, that visits each city once and has the minimum\n",
139 | "total length. Tthe length of a tour is defined by a permutation π.\n",
140 | "
"
141 | ]
142 | },
143 | {
144 | "cell_type": "code",
145 | "execution_count": 6,
146 | "metadata": {
147 | "collapsed": true
148 | },
149 | "outputs": [],
150 | "source": [
151 | "def reward(sample_solution, USE_CUDA=False):\n",
152 | " \"\"\"\n",
153 | " Args:\n",
154 | " sample_solution seq_len of [batch_size]\n",
155 | " \"\"\"\n",
156 | " batch_size = sample_solution[0].size(0)\n",
157 | " n = len(sample_solution)\n",
158 | " tour_len = Variable(torch.zeros([batch_size]))\n",
159 | " \n",
160 | " if USE_CUDA:\n",
161 | " tour_len = tour_len.cuda()\n",
162 | "\n",
163 | " for i in range(n - 1):\n",
164 | " tour_len += torch.norm(sample_solution[i] - sample_solution[i + 1], dim=1)\n",
165 | " \n",
166 | " tour_len += torch.norm(sample_solution[n - 1] - sample_solution[0], dim=1)\n",
167 | "\n",
168 | " return tour_len"
169 | ]
170 | },
171 | {
172 | "cell_type": "markdown",
173 | "metadata": {},
174 | "source": [
175 | "Attention mechanism
\n",
176 | "\n",
177 | "Using two types of attention mechanism: \"Dot\" and \"Bahdanau\" . More details in Effective Approaches to Attention-based Neural Machine Translation
"
178 | ]
179 | },
180 | {
181 | "cell_type": "markdown",
182 | "metadata": {},
183 | "source": [
184 | "$$\n",
185 | "a_t(s) = align(h_t, \\bar h_s) = \\dfrac{exp(score(h_t, \\bar h_s))}{\\sum_{s'} exp(score(h_t, \\bar h_{s'}))}\n",
186 | "$$\n",
187 | "\n",
188 | "$$\n",
189 | "score(h_t, \\bar h_s) =\n",
190 | "\\begin{cases}\n",
191 | "h_t ^\\top \\bar h_s & Dot \\\\\n",
192 | "v_a ^\\top \\tanh(\\textbf{W}_a [ h_t ; \\bar h_s ]) & Bahdanau\n",
193 | "\\end{cases}\n",
194 | "$$"
195 | ]
196 | },
197 | {
198 | "cell_type": "code",
199 | "execution_count": 7,
200 | "metadata": {
201 | "collapsed": true
202 | },
203 | "outputs": [],
204 | "source": [
205 | "class Attention(nn.Module):\n",
206 | " def __init__(self, hidden_size, use_tanh=False, C=10, name='Bahdanau', use_cuda=USE_CUDA):\n",
207 | " super(Attention, self).__init__()\n",
208 | " \n",
209 | " self.use_tanh = use_tanh\n",
210 | " self.C = C\n",
211 | " self.name = name\n",
212 | " \n",
213 | " if name == 'Bahdanau':\n",
214 | " self.W_query = nn.Linear(hidden_size, hidden_size)\n",
215 | " self.W_ref = nn.Conv1d(hidden_size, hidden_size, 1, 1)\n",
216 | "\n",
217 | " V = torch.FloatTensor(hidden_size)\n",
218 | " if use_cuda:\n",
219 | " V = V.cuda() \n",
220 | " self.V = nn.Parameter(V)\n",
221 | " self.V.data.uniform_(-(1. / math.sqrt(hidden_size)) , 1. / math.sqrt(hidden_size))\n",
222 | " \n",
223 | " \n",
224 | " def forward(self, query, ref):\n",
225 | " \"\"\"\n",
226 | " Args: \n",
227 | " query: [batch_size x hidden_size]\n",
228 | " ref: ]batch_size x seq_len x hidden_size]\n",
229 | " \"\"\"\n",
230 | " \n",
231 | " batch_size = ref.size(0)\n",
232 | " seq_len = ref.size(1)\n",
233 | " \n",
234 | " if self.name == 'Bahdanau':\n",
235 | " ref = ref.permute(0, 2, 1)\n",
236 | " query = self.W_query(query).unsqueeze(2) # [batch_size x hidden_size x 1]\n",
237 | " ref = self.W_ref(ref) # [batch_size x hidden_size x seq_len] \n",
238 | " expanded_query = query.repeat(1, 1, seq_len) # [batch_size x hidden_size x seq_len]\n",
239 | " V = self.V.unsqueeze(0).unsqueeze(0).repeat(batch_size, 1, 1) # [batch_size x 1 x hidden_size]\n",
240 | " logits = torch.bmm(V, F.tanh(expanded_query + ref)).squeeze(1)\n",
241 | " \n",
242 | " elif self.name == 'Dot':\n",
243 | " query = query.unsqueeze(2)\n",
244 | " logits = torch.bmm(ref, query).squeeze(2) #[batch_size x seq_len x 1]\n",
245 | " ref = ref.permute(0, 2, 1)\n",
246 | " \n",
247 | " else:\n",
248 | " raise NotImplementedError\n",
249 | " \n",
250 | " if self.use_tanh:\n",
251 | " logits = self.C * F.tanh(logits)\n",
252 | " else:\n",
253 | " logits = logits \n",
254 | " return ref, logits"
255 | ]
256 | },
257 | {
258 | "cell_type": "markdown",
259 | "metadata": {},
260 | "source": [
261 | "Graph Embedding
\n",
262 | "\n",
263 | "This is simple node embedding. For more advanced methods see Graph Embedding Techniques, Applications, and Performance: A Survey\n",
264 | "
"
265 | ]
266 | },
267 | {
268 | "cell_type": "code",
269 | "execution_count": 8,
270 | "metadata": {
271 | "collapsed": true
272 | },
273 | "outputs": [],
274 | "source": [
275 | "class GraphEmbedding(nn.Module):\n",
276 | " def __init__(self, input_size, embedding_size, use_cuda=USE_CUDA):\n",
277 | " super(GraphEmbedding, self).__init__()\n",
278 | " self.embedding_size = embedding_size\n",
279 | " self.use_cuda = use_cuda\n",
280 | " \n",
281 | " self.embedding = nn.Parameter(torch.FloatTensor(input_size, embedding_size)) \n",
282 | " self.embedding.data.uniform_(-(1. / math.sqrt(embedding_size)), 1. / math.sqrt(embedding_size))\n",
283 | " \n",
284 | " def forward(self, inputs):\n",
285 | " batch_size = inputs.size(0)\n",
286 | " seq_len = inputs.size(2)\n",
287 | " embedding = self.embedding.repeat(batch_size, 1, 1) \n",
288 | " embedded = []\n",
289 | " inputs = inputs.unsqueeze(1)\n",
290 | " for i in range(seq_len):\n",
291 | " embedded.append(torch.bmm(inputs[:, :, :, i].float(), embedding))\n",
292 | " embedded = torch.cat(embedded, 1)\n",
293 | " return embedded"
294 | ]
295 | },
296 | {
297 | "cell_type": "markdown",
298 | "metadata": {},
299 | "source": [
300 | "Pointer Network
\n",
301 | "Pointer Networks\n",
302 | "
\n",
303 | "Check my tutorial - intro to Pointer Networks
\n",
304 | "The model solves the problem of variable size output dictionaries using a recently proposed mechanism of neural attention. It differs from the previous attention attempts in that, instead of using attention to blend hidden units of an encoder to a context vector at each decoder step, it uses attention as a pointer to select a member of the input sequence as the output.
\n",
305 | "
"
306 | ]
307 | },
308 | {
309 | "cell_type": "code",
310 | "execution_count": 9,
311 | "metadata": {
312 | "collapsed": true
313 | },
314 | "outputs": [],
315 | "source": [
316 | "class PointerNet(nn.Module):\n",
317 | " def __init__(self, \n",
318 | " embedding_size,\n",
319 | " hidden_size,\n",
320 | " seq_len,\n",
321 | " n_glimpses,\n",
322 | " tanh_exploration,\n",
323 | " use_tanh,\n",
324 | " attention,\n",
325 | " use_cuda=USE_CUDA):\n",
326 | " super(PointerNet, self).__init__()\n",
327 | " \n",
328 | " self.embedding_size = embedding_size\n",
329 | " self.hidden_size = hidden_size\n",
330 | " self.n_glimpses = n_glimpses\n",
331 | " self.seq_len = seq_len\n",
332 | " self.use_cuda = use_cuda\n",
333 | " \n",
334 | " \n",
335 | " self.embedding = GraphEmbedding(2, embedding_size, use_cuda=use_cuda)\n",
336 | " self.encoder = nn.LSTM(embedding_size, hidden_size, batch_first=True)\n",
337 | " self.decoder = nn.LSTM(embedding_size, hidden_size, batch_first=True)\n",
338 | " self.pointer = Attention(hidden_size, use_tanh=use_tanh, C=tanh_exploration, name=attention, use_cuda=use_cuda)\n",
339 | " self.glimpse = Attention(hidden_size, use_tanh=False, name=attention, use_cuda=use_cuda)\n",
340 | " \n",
341 | " self.decoder_start_input = nn.Parameter(torch.FloatTensor(embedding_size))\n",
342 | " self.decoder_start_input.data.uniform_(-(1. / math.sqrt(embedding_size)), 1. / math.sqrt(embedding_size))\n",
343 | " \n",
344 | " def apply_mask_to_logits(self, logits, mask, idxs): \n",
345 | " batch_size = logits.size(0)\n",
346 | " clone_mask = mask.clone()\n",
347 | "\n",
348 | " if idxs is not None:\n",
349 | " clone_mask[[i for i in range(batch_size)], idxs.data] = 1\n",
350 | " logits[clone_mask] = -np.inf\n",
351 | " return logits, clone_mask\n",
352 | " \n",
353 | " def forward(self, inputs):\n",
354 | " \"\"\"\n",
355 | " Args: \n",
356 | " inputs: [batch_size x 1 x sourceL]\n",
357 | " \"\"\"\n",
358 | " batch_size = inputs.size(0)\n",
359 | " seq_len = inputs.size(2)\n",
360 | " assert seq_len == self.seq_len\n",
361 | " \n",
362 | " embedded = self.embedding(inputs)\n",
363 | " encoder_outputs, (hidden, context) = self.encoder(embedded)\n",
364 | " \n",
365 | " \n",
366 | " prev_probs = []\n",
367 | " prev_idxs = []\n",
368 | " mask = torch.zeros(batch_size, seq_len).byte()\n",
369 | " if self.use_cuda:\n",
370 | " mask = mask.cuda()\n",
371 | " \n",
372 | " idxs = None\n",
373 | " \n",
374 | " decoder_input = self.decoder_start_input.unsqueeze(0).repeat(batch_size, 1)\n",
375 | " \n",
376 | " for i in range(seq_len):\n",
377 | " \n",
378 | " \n",
379 | " _, (hidden, context) = self.decoder(decoder_input.unsqueeze(1), (hidden, context))\n",
380 | " \n",
381 | " query = hidden.squeeze(0)\n",
382 | " for i in range(self.n_glimpses):\n",
383 | " ref, logits = self.glimpse(query, encoder_outputs)\n",
384 | " logits, mask = self.apply_mask_to_logits(logits, mask, idxs)\n",
385 | " query = torch.bmm(ref, F.softmax(logits).unsqueeze(2)).squeeze(2) \n",
386 | " \n",
387 | " \n",
388 | " _, logits = self.pointer(query, encoder_outputs)\n",
389 | " logits, mask = self.apply_mask_to_logits(logits, mask, idxs)\n",
390 | " probs = F.softmax(logits)\n",
391 | " \n",
392 | " \n",
393 | " idxs = probs.multinomial().squeeze(1)\n",
394 | " for old_idxs in prev_idxs:\n",
395 | " if old_idxs.eq(idxs).data.any():\n",
396 | " print seq_len\n",
397 | " print(' RESAMPLE!')\n",
398 | " idxs = probs.multinomial().squeeze(1)\n",
399 | " break\n",
400 | " decoder_input = embedded[[i for i in range(batch_size)], idxs.data, :] \n",
401 | " \n",
402 | " prev_probs.append(probs)\n",
403 | " prev_idxs.append(idxs)\n",
404 | " \n",
405 | " return prev_probs, prev_idxs"
406 | ]
407 | },
408 | {
409 | "cell_type": "markdown",
410 | "metadata": {},
411 | "source": [
412 | "Optimization with policy gradients
\n",
413 | "Model-free policy-based Reinforcement Learning to optimize the parameters of a pointer network using the well-known REINFORCE algorithm
"
414 | ]
415 | },
416 | {
417 | "cell_type": "code",
418 | "execution_count": 10,
419 | "metadata": {
420 | "collapsed": true
421 | },
422 | "outputs": [],
423 | "source": [
424 | "class CombinatorialRL(nn.Module):\n",
425 | " def __init__(self, \n",
426 | " embedding_size,\n",
427 | " hidden_size,\n",
428 | " seq_len,\n",
429 | " n_glimpses,\n",
430 | " tanh_exploration,\n",
431 | " use_tanh,\n",
432 | " reward,\n",
433 | " attention,\n",
434 | " use_cuda=USE_CUDA):\n",
435 | " super(CombinatorialRL, self).__init__()\n",
436 | " self.reward = reward\n",
437 | " self.use_cuda = use_cuda\n",
438 | " \n",
439 | " self.actor = PointerNet(\n",
440 | " embedding_size,\n",
441 | " hidden_size,\n",
442 | " seq_len,\n",
443 | " n_glimpses,\n",
444 | " tanh_exploration,\n",
445 | " use_tanh,\n",
446 | " attention,\n",
447 | " use_cuda)\n",
448 | "\n",
449 | "\n",
450 | " def forward(self, inputs):\n",
451 | " \"\"\"\n",
452 | " Args:\n",
453 | " inputs: [batch_size, input_size, seq_len]\n",
454 | " \"\"\"\n",
455 | " batch_size = inputs.size(0)\n",
456 | " input_size = inputs.size(1)\n",
457 | " seq_len = inputs.size(2)\n",
458 | " \n",
459 | " probs, action_idxs = self.actor(inputs)\n",
460 | " \n",
461 | " actions = []\n",
462 | " inputs = inputs.transpose(1, 2)\n",
463 | " for action_id in action_idxs:\n",
464 | " actions.append(inputs[[x for x in range(batch_size)], action_id.data, :])\n",
465 | "\n",
466 | " \n",
467 | " action_probs = [] \n",
468 | " for prob, action_id in zip(probs, action_idxs):\n",
469 | " action_probs.append(prob[[x for x in range(batch_size)], action_id.data])\n",
470 | "\n",
471 | " R = self.reward(actions, self.use_cuda)\n",
472 | " \n",
473 | " return R, action_probs, actions, action_idxs"
474 | ]
475 | },
476 | {
477 | "cell_type": "code",
478 | "execution_count": 11,
479 | "metadata": {
480 | "collapsed": true
481 | },
482 | "outputs": [],
483 | "source": [
484 | "embedding_size = 128\n",
485 | "hidden_size = 128\n",
486 | "n_glimpses = 1\n",
487 | "tanh_exploration = 10\n",
488 | "use_tanh = True\n",
489 | "\n",
490 | "beta = 0.9\n",
491 | "max_grad_norm = 2."
492 | ]
493 | },
494 | {
495 | "cell_type": "markdown",
496 | "metadata": {},
497 | "source": [
498 | "Creating two models:
\n",
499 | "1. Pointer Network with Dot Attention - TSP 20
2. Pointer Network with Bahdanau Attention - TSP 50
"
500 | ]
501 | },
502 | {
503 | "cell_type": "code",
504 | "execution_count": 13,
505 | "metadata": {
506 | "collapsed": false
507 | },
508 | "outputs": [],
509 | "source": [
510 | "tsp_20_model = CombinatorialRL(\n",
511 | " embedding_size,\n",
512 | " hidden_size,\n",
513 | " 20,\n",
514 | " n_glimpses, \n",
515 | " tanh_exploration,\n",
516 | " use_tanh,\n",
517 | " reward,\n",
518 | " attention=\"Dot\",\n",
519 | " use_cuda=USE_CUDA)\n",
520 | "\n",
521 | "tsp_50_model = CombinatorialRL(\n",
522 | " embedding_size,\n",
523 | " hidden_size,\n",
524 | " 50,\n",
525 | " n_glimpses, \n",
526 | " tanh_exploration,\n",
527 | " use_tanh,\n",
528 | " reward,\n",
529 | " attention=\"Bahdanau\",\n",
530 | " use_cuda=USE_CUDA)"
531 | ]
532 | },
533 | {
534 | "cell_type": "code",
535 | "execution_count": 14,
536 | "metadata": {
537 | "collapsed": true
538 | },
539 | "outputs": [],
540 | "source": [
541 | "if USE_CUDA:\n",
542 | " tsp_20_model = tsp_20_model.cuda()\n",
543 | " tsp_50_model = tsp_50_model.cuda()"
544 | ]
545 | },
546 | {
547 | "cell_type": "markdown",
548 | "metadata": {},
549 | "source": [
550 | "Simple Training Class
"
551 | ]
552 | },
553 | {
554 | "cell_type": "code",
555 | "execution_count": 18,
556 | "metadata": {
557 | "collapsed": true
558 | },
559 | "outputs": [],
560 | "source": [
561 | "class TrainModel:\n",
562 | " def __init__(self, model, train_dataset, val_dataset, batch_size=128, threshold=None, max_grad_norm=2.):\n",
563 | " self.model = model\n",
564 | " self.train_dataset = train_dataset\n",
565 | " self.val_dataset = val_dataset\n",
566 | " self.batch_size = batch_size\n",
567 | " self.threshold = threshold\n",
568 | " \n",
569 | " self.train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True, num_workers=1)\n",
570 | " self.val_loader = DataLoader(val_dataset, batch_size=batch_size, shuffle=True, num_workers=1)\n",
571 | "\n",
572 | " self.actor_optim = optim.Adam(model.actor.parameters(), lr=1e-4)\n",
573 | " self.max_grad_norm = max_grad_norm\n",
574 | " \n",
575 | " self.train_tour = []\n",
576 | " self.val_tour = []\n",
577 | " \n",
578 | " self.epochs = 0\n",
579 | " \n",
580 | " def train_and_validate(self, n_epochs):\n",
581 | " critic_exp_mvg_avg = torch.zeros(1)\n",
582 | " if USE_CUDA: \n",
583 | " critic_exp_mvg_avg = critic_exp_mvg_avg.cuda()\n",
584 | "\n",
585 | " for epoch in range(n_epochs):\n",
586 | " for batch_id, sample_batch in enumerate(self.train_loader):\n",
587 | " self.model.train()\n",
588 | "\n",
589 | " inputs = Variable(sample_batch)\n",
590 | " inputs = inputs.cuda()\n",
591 | "\n",
592 | " R, probs, actions, actions_idxs = self.model(inputs)\n",
593 | "\n",
594 | " if batch_id == 0:\n",
595 | " critic_exp_mvg_avg = R.mean()\n",
596 | " else:\n",
597 | " critic_exp_mvg_avg = (critic_exp_mvg_avg * beta) + ((1. - beta) * R.mean())\n",
598 | "\n",
599 | "\n",
600 | " advantage = R - critic_exp_mvg_avg\n",
601 | "\n",
602 | " logprobs = 0\n",
603 | " for prob in probs: \n",
604 | " logprob = torch.log(prob)\n",
605 | " logprobs += logprob\n",
606 | " logprobs[logprobs < -1000] = 0. \n",
607 | "\n",
608 | " reinforce = advantage * logprobs\n",
609 | " actor_loss = reinforce.mean()\n",
610 | "\n",
611 | " self.actor_optim.zero_grad()\n",
612 | " actor_loss.backward()\n",
613 | " torch.nn.utils.clip_grad_norm(self.model.actor.parameters(),\n",
614 | " float(self.max_grad_norm), norm_type=2)\n",
615 | "\n",
616 | " self.actor_optim.step()\n",
617 | "\n",
618 | " critic_exp_mvg_avg = critic_exp_mvg_avg.detach()\n",
619 | "\n",
620 | " self.train_tour.append(R.mean().data[0])\n",
621 | "\n",
622 | " if batch_id % 10 == 0:\n",
623 | " self.plot(self.epochs)\n",
624 | "\n",
625 | " if batch_id % 100 == 0: \n",
626 | "\n",
627 | " self.model.eval()\n",
628 | " for val_batch in self.val_loader:\n",
629 | " inputs = Variable(val_batch)\n",
630 | " inputs = inputs.cuda()\n",
631 | "\n",
632 | " R, probs, actions, actions_idxs = self.model(inputs)\n",
633 | " self.val_tour.append(R.mean().data[0])\n",
634 | "\n",
635 | " if self.threshold and self.train_tour[-1] < self.threshold:\n",
636 | " print \"EARLY STOPPAGE!\"\n",
637 | " break\n",
638 | " \n",
639 | " self.epochs += 1\n",
640 | " \n",
641 | " def plot(self, epoch):\n",
642 | " clear_output(True)\n",
643 | " plt.figure(figsize=(20,5))\n",
644 | " plt.subplot(131)\n",
645 | " plt.title('train tour length: epoch %s reward %s' % (epoch, self.train_tour[-1] if len(self.train_tour) else 'collecting'))\n",
646 | " plt.plot(self.train_tour)\n",
647 | " plt.grid()\n",
648 | " plt.subplot(132)\n",
649 | " plt.title('val tour length: epoch %s reward %s' % (epoch, self.val_tour[-1] if len(self.val_tour) else 'collecting'))\n",
650 | " plt.plot(self.val_tour)\n",
651 | " plt.grid()\n",
652 | " plt.show()"
653 | ]
654 | },
655 | {
656 | "cell_type": "markdown",
657 | "metadata": {
658 | "collapsed": true
659 | },
660 | "source": [
661 | "TSP 20 Results of Pointer Network with Dot Attention
"
662 | ]
663 | },
664 | {
665 | "cell_type": "code",
666 | "execution_count": 78,
667 | "metadata": {
668 | "collapsed": false
669 | },
670 | "outputs": [],
671 | "source": [
672 | "tsp_20_train = TrainModel(tsp_20_model, \n",
673 | " train_20_dataset, \n",
674 | " val_20_dataset, \n",
675 | " threshold=3.99)"
676 | ]
677 | },
678 | {
679 | "cell_type": "code",
680 | "execution_count": 77,
681 | "metadata": {
682 | "collapsed": false
683 | },
684 | "outputs": [
685 | {
686 | "data": {
687 | "image/png": "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\n/wEa4UrbKl9wggAAAABJRU5ErkJggg==\n",
688 | "text/plain": [
689 | ""
690 | ]
691 | },
692 | "metadata": {},
693 | "output_type": "display_data"
694 | }
695 | ],
696 | "source": [
697 | "tsp_20_train.train_and_validate(5)"
698 | ]
699 | },
700 | {
701 | "cell_type": "markdown",
702 | "metadata": {
703 | "collapsed": true
704 | },
705 | "source": [
706 | "TSP 50 Results of Pointer Network with Bahdanau Attention
\n"
707 | ]
708 | },
709 | {
710 | "cell_type": "code",
711 | "execution_count": 19,
712 | "metadata": {
713 | "collapsed": false
714 | },
715 | "outputs": [],
716 | "source": [
717 | "train_50_train = TrainModel(tsp_50_model, \n",
718 | " train_50_dataset, \n",
719 | " val_50_dataset, \n",
720 | " threshold=6.4)"
721 | ]
722 | },
723 | {
724 | "cell_type": "code",
725 | "execution_count": 20,
726 | "metadata": {
727 | "collapsed": false
728 | },
729 | "outputs": [
730 | {
731 | "data": {
732 | "image/png": "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\n",
733 | "text/plain": [
734 | ""
735 | ]
736 | },
737 | "metadata": {},
738 | "output_type": "display_data"
739 | }
740 | ],
741 | "source": [
742 | "train_50_train.train_and_validate(10)"
743 | ]
744 | }
745 | ],
746 | "metadata": {
747 | "kernelspec": {
748 | "display_name": "Python 2",
749 | "language": "python",
750 | "name": "python2"
751 | },
752 | "language_info": {
753 | "codemirror_mode": {
754 | "name": "ipython",
755 | "version": 2
756 | },
757 | "file_extension": ".py",
758 | "mimetype": "text/x-python",
759 | "name": "python",
760 | "nbconvert_exporter": "python",
761 | "pygments_lexer": "ipython2",
762 | "version": "2.7.13"
763 | }
764 | },
765 | "nbformat": 4,
766 | "nbformat_minor": 2
767 | }
768 |
--------------------------------------------------------------------------------