Skip to content

Instantly share code, notes, and snippets.

@vene
Last active July 21, 2016 00:42
Show Gist options
  • Save vene/2a8ecf54cab07f4f154c60ecad8a8567 to your computer and use it in GitHub Desktop.
Save vene/2a8ecf54cab07f4f154c60ecad8a8567 to your computer and use it in GitHub Desktop.
Attentive GRU for classification of text dyads
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 198,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# Author: Vlad Niculae <vlad@vene.ro>\n",
"# License: 2-clause BSD\n",
"\n",
"import os\n",
"import sys\n",
"sys.setrecursionlimit(10000)\n",
"\n",
"from collections import Counter\n",
"\n",
"import numpy as np\n",
"import pandas as pd\n",
"from scipy import sparse as sp\n",
"\n",
"from sklearn.utils import shuffle\n",
"from sklearn.cross_validation import LabelKFold\n",
"\n",
"import theano as tn\n",
"import theano.tensor as T\n",
"import theano.sparse as tsp\n",
"\n",
"from lasagne.layers.base import MergeLayer\n",
"from lasagne.utils import create_param\n",
"from lasagne.objectives import categorical_crossentropy\n",
"from lasagne.nonlinearities import softmax, tanh\n",
"from lasagne.init import Uniform, GlorotUniform, Constant\n",
"from lasagne.layers import (InputLayer, LSTMLayer, GRULayer, EmbeddingLayer,\n",
" ConcatLayer, SliceLayer, DenseLayer, ElemwiseSumLayer,\n",
" get_output, get_all_params)\n",
"from lasagne.updates import adam\n",
"from lasagne.regularization import regularize_network_params, l2"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"n_samples = 100\n",
"seq_length = 30\n",
"embed_dim = 15\n",
"vocab_size = 50\n",
"n_classes = 3\n",
"\n",
"rng = np.random.RandomState(0)\n",
"E = rng.randn(vocab_size, embed_dim)\n",
"\n",
"prems = []\n",
"hypos = []\n",
"for _ in range(n_samples):\n",
" length = rng.randint(seq_length)\n",
" prems.append(rng.randint(1, vocab_size, size=(length,)))\n",
" length = rng.randint(seq_length)\n",
" hypos.append(rng.randint(1, vocab_size, size=(length,)))\n",
"\n",
"X_prem = np.zeros((n_samples, seq_length), dtype=np.int32)\n",
"X_hypo = np.zeros((n_samples, seq_length), dtype=np.int32)\n",
"\n",
"for k, seq in enumerate(prems):\n",
" X_prem[k, :len(seq)] = seq\n",
"\n",
"for k, seq in enumerate(hypos):\n",
" X_hypo[k, :len(seq)] = seq\n",
"\n",
"mask_prem = X_prem != 0\n",
"mask_hypo = X_hypo != 0\n",
"\n",
"# len_prem = np.array([len(prem) for prem in prems], dtype=np.int32)\n",
"y = rng.randint(0, n_classes, size=(n_samples,))"
]
},
{
"cell_type": "code",
"execution_count": 200,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"class AttentionMergeLayer(MergeLayer):\n",
" \"\"\"Attention layer\n",
" \n",
" alpha = softmax_i(v' * tanh(Wp * p_i + Wh * h + b))\n",
" \n",
" incomings must be (P, h, mask) where:\n",
" \n",
" P: the premise sequence: (batch_size, seq_length, prem_dim)\n",
" h: the hypothesis repr.: (batch_size, prem_repr_dim)\n",
" mask: (batch_size, seq_length), mask for the premise\n",
" \"\"\"\n",
" def __init__(self, incomings, num_units, W_hypo=GlorotUniform(),\n",
" W_prem=GlorotUniform(), v=Uniform(),\n",
" b=Constant(0.), nonlinearity=tanh, activation=softmax,\n",
" **kwargs):\n",
"\n",
" super(AttentionMergeLayer, self).__init__(incomings, **kwargs)\n",
"\n",
" self.num_units = num_units\n",
" self.nonlinearity = nonlinearity\n",
" self.activation = activation\n",
"\n",
" prem_dim = self.input_shapes[0][-1]\n",
" hypo_dim = self.input_shapes[1][-1]\n",
"\n",
" self.W_prem = self.add_param(W_prem, (prem_dim, num_units), name='W_prem')\n",
" self.W_hypo = self.add_param(W_hypo, (hypo_dim, num_units), name='W_hypo')\n",
" self.v = self.add_param(v, (num_units,), name='v')\n",
" self.b = self.add_param(b, (num_units,), name=\"b\", regularizable=False)\n",
"\n",
" def get_output_for(self, inputs, **kwargs):\n",
" prem_all, hypo, mask = inputs # must be length 3\n",
" # prem_all.shape: (_, seq_length, dim)\n",
" # hypo.shape: (_, dim)\n",
" \n",
" WpP = T.dot(prem_all, self.W_prem) # (_, seq_length, num_units)\n",
" WhH = T.dot(hypo, self.W_hypo) # (_, num_units)\n",
" \n",
" both = WpP + WhH.dimshuffle([0, 'x', 1])\n",
" both = self.nonlinearity(both + self.b)\n",
" \n",
" attn_weights = T.dot(both, self.v)\n",
" \n",
" # We must zero out the masked entries after the softmax.\n",
" # Setting them to 0 doesn't work; so we set them to an obscenely low number.\n",
" # What is a better solution to this mess?\n",
" attn_weights -= 1e100 * (1 - mask)\n",
" attn_weights = self.activation(attn_weights)\n",
"\n",
" return attn_weights\n",
"\n",
" def get_output_shape_for(self, input_shapes):\n",
" prem_shape, _, _ = input_shapes\n",
" batch_size, seq_length, prem_dim = prem_shape\n",
" return batch_size, seq_length"
]
},
{
"cell_type": "code",
"execution_count": 201,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"class BilinearAttentionMergeLayer(MergeLayer):\n",
" \n",
" \"\"\"Attention layer\n",
" \n",
" alpha = softmax_i(p_i' W h)\n",
" \n",
" incomings must be (P, h, mask) where:\n",
" \n",
" P: the premise sequence: (batch_size, seq_length, prem_dim)\n",
" h: the hypothesis repr.: (batch_size, prem_repr_dim)\n",
" mask: (batch_size, seq_length), mask for the premise\n",
" \"\"\"\n",
" def __init__(self, incomings, W=GlorotUniform(), activation=softmax, **kwargs):\n",
"\n",
" super(BilinearAttentionMergeLayer, self).__init__(incomings, **kwargs)\n",
"\n",
" self.activation = activation\n",
"\n",
" prem_dim = self.input_shapes[0][-1]\n",
" hypo_dim = self.input_shapes[1][-1]\n",
"\n",
" self.W = self.add_param(W, (prem_dim, hypo_dim), name='W')\n",
"\n",
" def get_output_for(self, inputs, **kwargs):\n",
" prem_all, hypo, mask = inputs # must be length 3\n",
" \n",
" # prem_all.shape: (_, seq_length, prem_dim)\n",
" # hypo.shape: (_, hypo_dim)\n",
" \n",
" PW = T.dot(prem_all, self.W) # (_, seq_length, hypo_dim)\n",
" \n",
" attn_weights = T.batched_dot(PW, hypo)\n",
"\n",
" # We must zero out the masked entries after the softmax.\n",
" # Setting them to 0 doesn't work; so we set them to an obscenely low number.\n",
" # What is a better solution to this mess?\n",
" attn_weights -= 1e100 * (1 - mask)\n",
" attn_weights = self.activation(attn_weights)\n",
"\n",
" return attn_weights\n",
"\n",
" def get_output_shape_for(self, input_shapes):\n",
" prem_shape, _, _ = input_shapes\n",
" batch_size, seq_length, prem_dim = prem_shape\n",
" return batch_size, seq_length"
]
},
{
"cell_type": "code",
"execution_count": 202,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"class DotMergeLayer(MergeLayer):\n",
" def __init__(self, incomings, **kwargs):\n",
" super(DotMergeLayer, self).__init__(incomings, **kwargs)\n",
" \n",
" def get_output_for(self, inputs, **kwargs):\n",
" a, b = inputs # must be length 2\n",
" return T.batched_dot(a, b)\n",
"\n",
" def get_output_shape_for(self, input_shapes):\n",
" a_shape, b_shape = input_shapes\n",
" \n",
" batch_size, seq_length, dim = b_shape\n",
" batch_size, seq_length = a_shape\n",
" \n",
" return batch_size, dim"
]
},
{
"cell_type": "code",
"execution_count": 203,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"activations = {'softmax': softmax}\n",
"\n",
"class AttentiveGRU(object):\n",
" def __init__(self, embed_init, seq_length, layer_size=5, bidi=True, attention='additive',\n",
" attention_activation='softmax', alpha=1e-3, learning_rate=0.001):\n",
" \n",
" embed_size = embed_init.shape[1]\n",
" embed_W = create_param(embed_init, embed_init.shape, 'embed_W')\n",
" \n",
" # must explicitly declare input variables, to make them stay integers\n",
" X_prem_data = T.imatrix()\n",
" X_prem = InputLayer(shape=(None, seq_length), input_var=X_prem_data)\n",
" mask_prem = InputLayer(shape=(None, seq_length))\n",
" \n",
" X_hypo_data = T.imatrix()\n",
" X_hypo = InputLayer(shape=(None, seq_length), input_var=X_hypo_data)\n",
" mask_hypo = InputLayer(shape=(None, seq_length))\n",
" \n",
" # categorical target classes\n",
" y = T.ivector()\n",
"\n",
" self.model = dict()\n",
" self.model['embed_prem'] = EmbeddingLayer(\n",
" X_prem, input_size=vocab_size, output_size=embed_size, W=embed_W)\n",
"\n",
"\n",
" self.model['embed_hypo'] = EmbeddingLayer(\n",
" X_hypo, input_size=vocab_size, output_size=embed_size,\n",
" W=self.model['embed_prem'].W # share embeddings\n",
" )\n",
" \n",
" encoding_size = 2 * layer_size if bidi else layer_size\n",
"\n",
" gru_prem_attrs = {\n",
" 'incoming': self.model['embed_prem'],\n",
" 'num_units': layer_size,\n",
" 'mask_input': mask_prem,\n",
" 'only_return_final': False\n",
" }\n",
" \n",
" self.model['gru_prem_fwd'] = GRULayer(**gru_prem_attrs)\n",
"\n",
" if bidi: # backward pass\n",
" self.model['gru_prem_rev'] = GRULayer(backwards=True,\n",
" **gru_prem_attrs)\n",
"\n",
" # encode the hypothesis\n",
" \n",
" gru_hypo_attrs = {\n",
" 'incoming': self.model['embed_hypo'],\n",
" 'num_units': layer_size,\n",
" 'mask_input': mask_hypo,\n",
" 'only_return_final': True\n",
" }\n",
" \n",
" last_fwd = SliceLayer(self.model['gru_prem_fwd'], -1, axis=1)\n",
" self.model['gru_hypo_fwd'] = GRULayer(hid_init=last_fwd,\n",
" **gru_hypo_attrs)\n",
" if bidi:\n",
" last_rev = SliceLayer(self.model['gru_prem_rev'], 0, axis=1)\n",
" self.model['gru_hypo_rev'] = GRULayer(backwards=True,\n",
" hid_init=last_rev,\n",
" **gru_hypo_attrs)\n",
" \n",
" self.model['gru_prem'] = ConcatLayer([self.model['gru_prem_fwd'],\n",
" self.model['gru_prem_rev']],\n",
" axis=-1)\n",
"\n",
" \n",
" self.model['gru_hypo'] = ConcatLayer([self.model['gru_hypo_fwd'],\n",
" self.model['gru_hypo_rev']],\n",
" axis=-1)\n",
" \n",
" last = ConcatLayer([last_fwd, last_rev], axis=-1)\n",
" else:\n",
" self.model['gru_prem'] = self.model['gru_prem_fwd']\n",
" self.model['gru_hypo'] = self.model['gru_hypo_fwd']\n",
" last = last_fwd\n",
" \n",
" if attention == 'additive':\n",
" self.model['attention'] = AttentionMergeLayer(\n",
" (self.model['gru_prem'], self.model['gru_hypo'], mask_prem),\n",
" encoding_size,\n",
" activation=activations.get(attention_activation))\n",
" elif attention == 'bilinear':\n",
" self.model['attention'] = BilinearAttentionMergeLayer(\n",
" (self.model['gru_prem'], self.model['gru_hypo'], mask_prem),\n",
" activation=activations.get(attention_activation))\n",
" \n",
" if attention:\n",
" self.model['enc_prem'] = DotMergeLayer(\n",
" (self.model['attention'], self.model['gru_prem']))\n",
" else:\n",
" self.model['enc_prem'] = last\n",
"\n",
" \n",
" self.model['final_prem'] = DenseLayer(\n",
" self.model['enc_prem'],\n",
" encoding_size,\n",
" nonlinearity=None,\n",
" b=None)\n",
" \n",
" self.model['final_hypo'] = DenseLayer(\n",
" self.model['gru_hypo'],\n",
" encoding_size,\n",
" nonlinearity=None)\n",
" \n",
" self.model['final_sum'] = ElemwiseSumLayer([\n",
" self.model['final_prem'], self.model['final_hypo']])\n",
" \n",
" self.model['final_softmax'] = DenseLayer(\n",
" self.model['final_sum'],\n",
" n_classes,\n",
" nonlinearity=softmax)\n",
" \n",
" y_pred = get_output(self.model['final_softmax'])\n",
" loss = categorical_crossentropy(y_pred, y).mean()\n",
"\n",
" loss += alpha * regularize_network_params(self.model['final_softmax'], l2)\n",
"\n",
" input_vars = [X_prem.input_var, mask_prem.input_var,\n",
" X_hypo.input_var, mask_hypo.input_var]\n",
" train_params = get_all_params(self.model['final_softmax'],\n",
" trainable=True)\n",
"\n",
" self._predict = tn.function(input_vars, y_pred)\n",
" \n",
" if attention:\n",
" self._predict_with_attn = tn.function(input_vars,\n",
" (y_pred, get_output(self.model['attention'])))\n",
"\n",
" self.fit = tn.function(input_vars + [y],\n",
" loss,\n",
" updates=adam(loss,\n",
" train_params,\n",
" learning_rate=learning_rate))\n",
" \n",
" def predict(self, X_prem, mask_prem, X_hypo, mask_hypo, return_attention=False):\n",
" if return_attention:\n",
" return self._predict_with_attn(X_prem, mask_prem, X_hypo, mask_hypo)\n",
" else:\n",
" return self._predict(X_prem, mask_prem, X_hypo, mask_hypo)"
]
},
{
"cell_type": "code",
"execution_count": 204,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"tn.config.optimizer = 'fast_compile'"
]
},
{
"cell_type": "code",
"execution_count": 205,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"net = AttentiveGRU(E, seq_length, bidi=True, attention=None, layer_size=2)"
]
},
{
"cell_type": "code",
"execution_count": 206,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"0.22"
]
},
"execution_count": 206,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"y_proba = net.predict(X_prem, mask_prem, X_hypo, mask_hypo)\n",
"np.mean(np.argmax(y_proba, axis=1) == y) # chance level#"
]
},
{
"cell_type": "code",
"execution_count": 207,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"loss=1.9498005854790814, acc=0.21\n",
"loss=1.89372025187931, acc=0.3\n",
"loss=1.8474109856994736, acc=0.38\n",
"loss=1.8073892687766397, acc=0.43\n",
"loss=1.77113751503378, acc=0.43\n",
"loss=1.7366553288507536, acc=0.47\n",
"loss=1.702506670319463, acc=0.48\n",
"loss=1.6677613392122375, acc=0.52\n",
"loss=1.6318417876247366, acc=0.58\n",
"loss=1.5944215491709164, acc=0.61\n",
"loss=1.5553892755253014, acc=0.65\n",
"loss=1.5147988618191466, acc=0.66\n",
"loss=1.4728261331911028, acc=0.67\n",
"loss=1.4297431717288425, acc=0.69\n",
"loss=1.3858939461445268, acc=0.7\n",
"loss=1.341659237469965, acc=0.72\n",
"loss=1.297410410460883, acc=0.72\n",
"loss=1.2534608334407404, acc=0.75\n",
"loss=1.2100357278454787, acc=0.78\n",
"loss=1.1672759876354661, acc=0.79\n",
"loss=1.1252709337831523, acc=0.82\n",
"loss=1.0840959912767372, acc=0.89\n",
"loss=1.0438364843207777, acc=0.9\n",
"loss=1.0046035189209426, acc=0.93\n",
"loss=0.9665491387351164, acc=0.95\n",
"loss=0.9298703310450812, acc=0.95\n",
"loss=0.8947914052197085, acc=0.96\n",
"loss=0.8615302409695914, acc=0.97\n",
"loss=0.8302637307062655, acc=0.98\n",
"loss=0.8011040313439612, acc=0.99\n",
"loss=0.774089482399178, acc=0.99\n",
"loss=0.7491887799264072, acc=1.0\n",
"loss=0.7263139058451001, acc=1.0\n",
"loss=0.7053363905148169, acc=1.0\n",
"loss=0.6861028513281759, acc=1.0\n",
"loss=0.6684479855910394, acc=1.0\n",
"loss=0.6522046888752953, acc=1.0\n",
"loss=0.6372113927398522, acc=1.0\n",
"loss=0.6233168244220636, acc=1.0\n",
"loss=0.6103826923831037, acc=1.0\n",
"loss=0.5982850083667244, acc=1.0\n",
"loss=0.5869145662071509, acc=1.0\n",
"loss=0.5761767586130633, acc=1.0\n",
"loss=0.5659907814565794, acc=1.0\n",
"loss=0.5562883510033055, acc=1.0\n",
"loss=0.5470121476429128, acc=1.0\n",
"loss=0.5381141999356057, acc=1.0\n",
"loss=0.5295543604864443, acc=1.0\n",
"loss=0.5212989534071434, acc=1.0\n",
"loss=0.5133196196814167, acc=1.0\n"
]
}
],
"source": [
"losses_no_attn = []\n",
"\n",
"for it in range(500):\n",
" loss = net.fit(X_prem, mask_prem, X_hypo, mask_hypo, y.astype(np.int32))\n",
" losses_no_attn.append(loss)\n",
"\n",
" if it % 10 == 0:\n",
" y_proba = net.predict(X_prem, mask_prem, X_hypo, mask_hypo)\n",
" print(\"loss={}, acc={}\".format(\n",
" loss,\n",
" np.mean(np.argmax(y_proba, axis=1) == y)))"
]
},
{
"cell_type": "code",
"execution_count": 208,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"loss=1.901533964577657, acc=0.39\n",
"loss=1.8615421878567093, acc=0.38\n",
"loss=1.8258121659873938, acc=0.42\n",
"loss=1.7915691976758086, acc=0.45\n",
"loss=1.7574961758801946, acc=0.47\n",
"loss=1.723075417852178, acc=0.51\n",
"loss=1.6881201895192182, acc=0.53\n",
"loss=1.6526431669304227, acc=0.56\n",
"loss=1.6167604453570346, acc=0.55\n",
"loss=1.58059833508201, acc=0.59\n",
"loss=1.5442104338917106, acc=0.59\n",
"loss=1.5075334190114476, acc=0.61\n",
"loss=1.470404971709582, acc=0.64\n",
"loss=1.4326327003111388, acc=0.65\n",
"loss=1.3940746594356406, acc=0.69\n",
"loss=1.3546894363517565, acc=0.72\n",
"loss=1.3145436837878601, acc=0.74\n",
"loss=1.2737980511111182, acc=0.77\n",
"loss=1.232687769522767, acc=0.8\n",
"loss=1.191497559109101, acc=0.82\n",
"loss=1.1505312719618468, acc=0.84\n",
"loss=1.1100910588537525, acc=0.87\n",
"loss=1.0704680962952091, acc=0.9\n",
"loss=1.0319330453355768, acc=0.93\n",
"loss=0.9947214463218103, acc=0.94\n",
"loss=0.9590219472605277, acc=0.95\n",
"loss=0.9249744961896644, acc=0.97\n",
"loss=0.8926767134905061, acc=0.98\n",
"loss=0.8621882563521737, acc=0.99\n",
"loss=0.8335324919884621, acc=0.99\n",
"loss=0.8066991355487956, acc=0.99\n",
"loss=0.781648390375549, acc=0.99\n",
"loss=0.7583157200258444, acc=0.99\n",
"loss=0.7366168463928744, acc=0.99\n",
"loss=0.7164534641396629, acc=0.99\n",
"loss=0.6977196676647253, acc=0.99\n",
"loss=0.6803076955320023, acc=0.99\n",
"loss=0.6641112213637842, acc=1.0\n",
"loss=0.6490258227869828, acc=1.0\n",
"loss=0.6349482285510986, acc=1.0\n",
"loss=0.6217765180060976, acc=1.0\n",
"loss=0.6094120782475195, acc=1.0\n",
"loss=0.5977624131343313, acc=1.0\n",
"loss=0.5867434698590288, acc=1.0\n",
"loss=0.5762808244017887, acc=1.0\n",
"loss=0.5663097977180985, acc=1.0\n",
"loss=0.5567748695173792, acc=1.0\n",
"loss=0.5476287390113508, acc=1.0\n",
"loss=0.5388312708812081, acc=1.0\n",
"loss=0.5303484619795843, acc=1.0\n"
]
}
],
"source": [
"net = AttentiveGRU(E, seq_length, bidi=True, attention='additive', layer_size=2)\n",
"losses_additive = []\n",
"\n",
"for it in range(500):\n",
" loss = net.fit(X_prem, mask_prem, X_hypo, mask_hypo, y.astype(np.int32))\n",
" losses_additive.append(loss)\n",
"\n",
" if it % 10 == 0:\n",
" y_proba = net.predict(X_prem, mask_prem, X_hypo, mask_hypo, return_attention=False)\n",
" print(\"loss={}, acc={}\".format(\n",
" loss,\n",
" np.mean(np.argmax(y_proba, axis=1) == y)))"
]
},
{
"cell_type": "code",
"execution_count": 209,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([[-0.26207097, 0.33590725, 0.33259971, -0.32970025],\n",
" [-0.39494361, 0.28743113, -0.03976701, 0.07317588],\n",
" [-0.52447955, 0.11495866, -0.27472087, -0.35032745],\n",
" [ 0.11378576, -0.3382656 , -0.04726767, -0.14024962]])"
]
},
"execution_count": 209,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"net.model['attention'].W_hypo.get_value()"
]
},
{
"cell_type": "code",
"execution_count": 210,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"y_proba, attn = net.predict(X_prem, mask_prem, X_hypo, mask_hypo, return_attention=True)"
]
},
{
"cell_type": "code",
"execution_count": 211,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x7f85f55a38d0>]"
]
},
"execution_count": 211,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\ngg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f8618ca43c8>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.plot(attn[0][mask_prem[0]])\n",
"plt.plot(attn[1][mask_prem[1]])\n",
"plt.plot(attn[20][mask_prem[20]])"
]
},
{
"cell_type": "code",
"execution_count": 212,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x7f85efed7f60>]"
]
},
"execution_count": 212,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\nPwnrAAAAAElFTkSuQmCC\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f86078ffb70>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.plot(attn[0][~mask_prem[0]])\n",
"plt.plot(attn[1][~mask_prem[1]])\n",
"plt.plot(attn[20][~mask_prem[20]])\n",
"# (proves that the mask is correctly applied)"
]
},
{
"cell_type": "code",
"execution_count": 213,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"loss=1.9480461239249618, acc=0.27\n",
"loss=1.90055856846684, acc=0.28\n",
"loss=1.8635133262955184, acc=0.31\n",
"loss=1.8329108045222653, acc=0.42\n",
"loss=1.805344067997885, acc=0.41\n",
"loss=1.7789174620589354, acc=0.42\n",
"loss=1.7526309954595467, acc=0.43\n",
"loss=1.7257594378330738, acc=0.45\n",
"loss=1.6977514267428329, acc=0.5\n",
"loss=1.6682861601662191, acc=0.55\n",
"loss=1.637235428209328, acc=0.59\n",
"loss=1.6045840393950963, acc=0.63\n",
"loss=1.5703773049456973, acc=0.65\n",
"loss=1.5347023659568833, acc=0.68\n",
"loss=1.4976847964089381, acc=0.71\n",
"loss=1.4594709714713225, acc=0.72\n",
"loss=1.420192959712963, acc=0.73\n",
"loss=1.3799482970452512, acc=0.75\n",
"loss=1.338797362916937, acc=0.75\n",
"loss=1.2967742690395148, acc=0.77\n",
"loss=1.25392613665761, acc=0.79\n",
"loss=1.2103739835953173, acc=0.79\n",
"loss=1.1663679522255876, acc=0.83\n",
"loss=1.1223141797354872, acc=0.84\n",
"loss=1.0787564914435173, acc=0.85\n",
"loss=1.0362938796173042, acc=0.86\n",
"loss=0.9954359021242094, acc=0.87\n",
"loss=0.9564729119335187, acc=0.9\n",
"loss=0.9194681949736301, acc=0.93\n",
"loss=0.8843742345033663, acc=0.95\n",
"loss=0.8511576732852495, acc=0.95\n",
"loss=0.8198392959146557, acc=0.96\n",
"loss=0.7904715543633851, acc=0.99\n",
"loss=0.7631110493488948, acc=0.99\n",
"loss=0.7377948743504197, acc=0.99\n",
"loss=0.7145172588717611, acc=1.0\n",
"loss=0.6932157610829757, acc=1.0\n",
"loss=0.6737723262494618, acc=1.0\n",
"loss=0.6560267328702175, acc=1.0\n",
"loss=0.6397954892019533, acc=1.0\n",
"loss=0.6248900696285247, acc=1.0\n",
"loss=0.6111309747926492, acc=1.0\n",
"loss=0.5983564080844179, acc=1.0\n",
"loss=0.5864260828260751, acc=1.0\n",
"loss=0.5752215070915597, acc=1.0\n",
"loss=0.5646441693418753, acc=1.0\n",
"loss=0.5546127634248019, acc=1.0\n",
"loss=0.5450602213136475, acc=1.0\n",
"loss=0.5359309897942091, acc=1.0\n",
"loss=0.52717873896287, acc=1.0\n"
]
}
],
"source": [
"net = AttentiveGRU(E, seq_length, bidi=True, attention='bilinear', layer_size=2)\n",
"losses_bilinear = []\n",
"\n",
"for it in range(500):\n",
" loss = net.fit(X_prem, mask_prem, X_hypo, mask_hypo, y.astype(np.int32))\n",
" losses_bilinear.append(loss)\n",
"\n",
" if it % 10 == 0:\n",
" y_proba = net.predict(X_prem, mask_prem, X_hypo, mask_hypo)\n",
" print(\"loss={}, acc={}\".format(\n",
" loss,\n",
" np.mean(np.argmax(y_proba, axis=1) == y)))"
]
},
{
"cell_type": "code",
"execution_count": 214,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([[-0.01427229, -0.84638519, 0.91559878, -0.51115447],\n",
" [-0.26177523, 0.88549904, 0.22315163, -0.78730886],\n",
" [-0.74448717, 0.85175997, -0.28896319, 0.04915983],\n",
" [ 0.23710413, 0.83967037, 0.02126809, 0.40354205]])"
]
},
"execution_count": 214,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"net.model['attention'].W.get_value()"
]
},
{
"cell_type": "code",
"execution_count": 215,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"y_proba, attn = net.predict(X_prem, mask_prem, X_hypo, mask_hypo, return_attention=True)"
]
},
{
"cell_type": "code",
"execution_count": 216,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x7f8618b9feb8>]"
]
},
"execution_count": 216,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\nXymlIsj/A/Py8M7UcCWOAAAAAElFTkSuQmCC\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f8606a2a278>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.plot(attn[0][mask_prem[0]])\n",
"plt.plot(attn[1][mask_prem[1]])\n",
"plt.plot(attn[20][mask_prem[20]])"
]
},
{
"cell_type": "code",
"execution_count": 217,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x7f861b197908>]"
]
},
"execution_count": 217,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\nPwnrAAAAAElFTkSuQmCC\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f85f1d03470>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.plot(attn[0][~mask_prem[0]])\n",
"plt.plot(attn[1][~mask_prem[1]])\n",
"plt.plot(attn[20][~mask_prem[20]])\n",
"# (proves that the mask is correctly applied)"
]
},
{
"cell_type": "code",
"execution_count": 218,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f85f44a9d68>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"%matplotlib inline\n",
"\n",
"plt.plot(losses_no_attn, label=\"no attention\")\n",
"plt.plot(losses_additive, label=\"additive attention\")\n",
"plt.plot(losses_bilinear, label=\"bilinear attention\")\n",
"plt.legend()\n",
"plt.ylabel(\"loss\")\n",
"plt.xlabel(\"epoch\")\n",
"plt.show()"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.4.5"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment