diff --git a/.gitignore b/.gitignore index 8961a01..31e7fa0 100644 --- a/.gitignore +++ b/.gitignore @@ -67,3 +67,6 @@ nlidata/* rel_ext_data* *_solved.ipynb .DS_Store + +ColBERT* +experiments* diff --git a/evaluation_methods.ipynb b/evaluation_methods.ipynb index 5432275..0f69457 100644 --- a/evaluation_methods.ipynb +++ b/evaluation_methods.ipynb @@ -670,7 +670,7 @@ "metadata": {}, "outputs": [], "source": [ - "SST_HOME = os.path.join(\"data\", \"trees\")" + "SST_HOME = os.path.join('data', 'sentiment')" ] }, { @@ -679,8 +679,8 @@ "metadata": {}, "outputs": [], "source": [ - "def unigrams_phi(tree):\n", - " return Counter(tree.leaves())" + "def unigrams_phi(text):\n", + " return Counter(text.lower().split())" ] }, { @@ -690,9 +690,7 @@ "outputs": [], "source": [ "train = sst.build_dataset(\n", - " SST_HOME,\n", - " reader=sst.train_reader,\n", - " class_func=sst.binary_class_func,\n", + " sst.train_reader(SST_HOME),\n", " phi=unigrams_phi)" ] }, @@ -703,9 +701,7 @@ "outputs": [], "source": [ "dev = sst.build_dataset(\n", - " SST_HOME,\n", - " reader=sst.dev_reader,\n", - " class_func=sst.binary_class_func,\n", + " sst.dev_reader(SST_HOME),\n", " phi=unigrams_phi,\n", " vectorizer=train['vectorizer'])" ] @@ -740,7 +736,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "Stopping after epoch 447. Training loss did not improve more than tol=1e-05. Final error is 0.000899996972293593." + "Stopping after epoch 757. Training loss did not improve more than tol=1e-05. Final error is 0.00045882913400419056." ] } ], @@ -759,12 +755,13 @@ "text": [ " precision recall f1-score support\n", "\n", - " negative 0.765 0.729 0.746 428\n", - " positive 0.750 0.784 0.767 444\n", + " negative 0.624 0.598 0.611 428\n", + " neutral 0.264 0.231 0.247 229\n", + " positive 0.624 0.689 0.655 444\n", "\n", - " accuracy 0.757 872\n", - " macro avg 0.757 0.756 0.756 872\n", - "weighted avg 0.757 0.757 0.757 872\n", + " accuracy 0.559 1101\n", + " macro avg 0.504 0.506 0.504 1101\n", + "weighted avg 0.549 0.559 0.553 1101\n", "\n" ] } @@ -804,7 +801,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "Stopping after epoch 69. Validation score did not improve by tol=1e-05 for more than 50 epochs. Final error is 0.06454353779554367" + "Stopping after epoch 82. Validation score did not improve by tol=1e-05 for more than 50 epochs. Final error is 0.1478035654872656" ] } ], @@ -823,12 +820,13 @@ "text": [ " precision recall f1-score support\n", "\n", - " negative 0.781 0.734 0.757 428\n", - " positive 0.757 0.802 0.779 444\n", + " negative 0.641 0.673 0.657 428\n", + " neutral 0.285 0.179 0.220 229\n", + " positive 0.644 0.736 0.687 444\n", "\n", - " accuracy 0.768 872\n", - " macro avg 0.769 0.768 0.768 872\n", - "weighted avg 0.769 0.768 0.768 872\n", + " accuracy 0.596 1101\n", + " macro avg 0.523 0.529 0.521 1101\n", + "weighted avg 0.568 0.596 0.578 1101\n", "\n" ] } @@ -855,7 +853,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -895,7 +893,7 @@ "\n", "In addition, in deep learning, we're often dealing with classes of models that are in principle capable of learning anything. The real question is implicitly how efficiently they can learn given the available data and other resources. Learning curves bring this our very clearly.\n", "\n", - "We can improve the curves by adding confidence intervals to them derived from repeated runs. Here's a plot from a paper I recently wrote with Nick Dingwall ([Dingwall and Potts 2018](https://arxiv.org/abs/1803.09901)):\n", + "We can improve the curves by adding confidence intervals to them derived from repeated runs. Here's a plot from a paper I wrote with Nick Dingwall ([Dingwall and Potts 2018](https://arxiv.org/abs/1803.09901)):\n", "\n", "\n", "\n", @@ -934,13 +932,13 @@ "name": "stderr", "output_type": "stream", "text": [ - "Finished epoch 500 of 500; error is 0.007755517493933439ore than tol=1e-05. Final error is 0.6944566369056702." + "Finished epoch 500 of 500; error is 0.012734206393361092" ] }, { "data": { "text/plain": [ - "defaultdict(int, {'correct': 9, 'incorrect': 1})" + "defaultdict(int, {'correct': 7, 'incorrect': 3})" ] }, "execution_count": 16, diff --git a/evaluation_metrics.ipynb b/evaluation_metrics.ipynb index eee9913..1414000 100644 --- a/evaluation_metrics.ipynb +++ b/evaluation_metrics.ipynb @@ -2857,9 +2857,17 @@ "execution_count": 52, "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/45/77p9r7r13q7_pwzzlsv85fxr0000gn/T/ipykernel_69328/1028661969.py:7: UserWarning: FixedFormatter should only be used together with FixedLocator\n", + " ax2.set_xticklabels(prc['threshold'].values[::100].round(3))\n" + ] + }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -2958,9 +2966,17 @@ } }, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/45/77p9r7r13q7_pwzzlsv85fxr0000gn/T/ipykernel_69328/1028661969.py:7: UserWarning: FixedFormatter should only be used together with FixedLocator\n", + " ax2.set_xticklabels(prc['threshold'].values[::100].round(3))\n" + ] + }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -3494,7 +3510,7 @@ { "data": { "text/plain": [ - "(-0.014107322107322122, 0.6559028954996294)" + "(-0.014107322107322118, 0.6559028954996294)" ] }, "execution_count": 60, diff --git a/feature_attribution.ipynb b/feature_attribution.ipynb index 7a0122a..469b8f1 100644 --- a/feature_attribution.ipynb +++ b/feature_attribution.ipynb @@ -14,7 +14,7 @@ "outputs": [], "source": [ "__author__ = \"Christopher Potts\"\n", - "__version__ = \"CS224u, Stanford, Summer 2022\"" + "__version__ = \"CS224u, Stanford, Spring 2022\"" ] }, { @@ -37,10 +37,40 @@ "source": [ "## Overview\n", "\n", - "This notebook is an experimental extension of the CS224u course code. It focuses on the [Integrated Gradients](https://arxiv.org/abs/1703.01365) method for feature attribution, with comparisons to the \"inputs $\\times$ gradients\" method. To run the notebook, first install [the Captum library](https://captum.ai/):\n", - "\n", - "```pip install captum```\n", - "\n", + "This notebook is an experimental extension of the CS224u course code. It focuses on the [Integrated Gradients](https://arxiv.org/abs/1703.01365) method for feature attribution, with comparisons to the \"inputs $\\times$ gradients\" method. To run the notebook, first install [the Captum library](https://captum.ai/):" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: captum in /Applications/anaconda3/envs/nlu/lib/python3.9/site-packages (0.5.0)\n", + "Requirement already satisfied: matplotlib in /Applications/anaconda3/envs/nlu/lib/python3.9/site-packages (from captum) (3.4.3)\n", + "Requirement already satisfied: torch>=1.6 in /Applications/anaconda3/envs/nlu/lib/python3.9/site-packages (from captum) (1.10.0)\n", + "Requirement already satisfied: numpy in /Applications/anaconda3/envs/nlu/lib/python3.9/site-packages (from captum) (1.20.3)\n", + "Requirement already satisfied: typing-extensions in /Applications/anaconda3/envs/nlu/lib/python3.9/site-packages (from torch>=1.6->captum) (3.10.0.2)\n", + "Requirement already satisfied: pillow>=6.2.0 in /Applications/anaconda3/envs/nlu/lib/python3.9/site-packages (from matplotlib->captum) (8.4.0)\n", + "Requirement already satisfied: cycler>=0.10 in /Applications/anaconda3/envs/nlu/lib/python3.9/site-packages (from matplotlib->captum) (0.10.0)\n", + "Requirement already satisfied: python-dateutil>=2.7 in /Applications/anaconda3/envs/nlu/lib/python3.9/site-packages (from matplotlib->captum) (2.8.2)\n", + "Requirement already satisfied: pyparsing>=2.2.1 in /Applications/anaconda3/envs/nlu/lib/python3.9/site-packages (from matplotlib->captum) (3.0.4)\n", + "Requirement already satisfied: kiwisolver>=1.0.1 in /Applications/anaconda3/envs/nlu/lib/python3.9/site-packages (from matplotlib->captum) (1.3.1)\n", + "Requirement already satisfied: six in /Applications/anaconda3/envs/nlu/lib/python3.9/site-packages (from cycler>=0.10->matplotlib->captum) (1.16.0)\n" + ] + } + ], + "source": [ + "!pip install captum" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ "This is not currently a required installation (but it will be in future years)." ] }, @@ -55,7 +85,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -72,7 +102,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -94,7 +124,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -107,7 +137,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -125,7 +155,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -141,7 +171,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -157,7 +187,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -167,7 +197,7 @@ " [1.]])" ] }, - "execution_count": 8, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -185,7 +215,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -195,7 +225,7 @@ " [-0.]], grad_fn=)" ] }, - "execution_count": 9, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } @@ -213,7 +243,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ @@ -222,7 +252,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 12, "metadata": {}, "outputs": [], "source": [ @@ -231,7 +261,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -241,7 +271,7 @@ " [1.]], dtype=torch.float64, grad_fn=)" ] }, - "execution_count": 12, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } @@ -259,7 +289,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 14, "metadata": {}, "outputs": [], "source": [ @@ -278,7 +308,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 15, "metadata": {}, "outputs": [ { @@ -287,7 +317,7 @@ "tensor([[1.]])" ] }, - "execution_count": 14, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -305,7 +335,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 16, "metadata": {}, "outputs": [], "source": [ @@ -320,7 +350,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 17, "metadata": {}, "outputs": [], "source": [ @@ -342,7 +372,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 18, "metadata": {}, "outputs": [ { @@ -351,7 +381,7 @@ "array([0.20138107, 0.02833358, 0.11584416, 0. , 0. ])" ] }, - "execution_count": 17, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } @@ -362,7 +392,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 19, "metadata": {}, "outputs": [], "source": [ @@ -371,7 +401,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 20, "metadata": {}, "outputs": [], "source": [ @@ -380,14 +410,14 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "Stopping after epoch 350. Training loss did not improve more than tol=1e-05. Final error is 1.4553862810134888." + "Stopping after epoch 449. Training loss did not improve more than tol=1e-05. Final error is 1.3419027030467987." ] } ], @@ -397,7 +427,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 22, "metadata": {}, "outputs": [], "source": [ @@ -406,16 +436,16 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "0.844" + "0.8568" ] }, - "execution_count": 22, + "execution_count": 23, "metadata": {}, "output_type": "execute_result" } @@ -426,7 +456,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 24, "metadata": {}, "outputs": [], "source": [ @@ -435,7 +465,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 25, "metadata": {}, "outputs": [], "source": [ @@ -451,7 +481,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 26, "metadata": {}, "outputs": [], "source": [ @@ -470,16 +500,16 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "tensor([ 0.9523, 0.5059, 0.7190, -0.0193, -0.0127], dtype=torch.float64)" + "tensor([ 0.6544, 0.6739, 0.7057, -0.0173, -0.0059], dtype=torch.float64)" ] }, - "execution_count": 26, + "execution_count": 27, "metadata": {}, "output_type": "execute_result" } @@ -497,7 +527,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 28, "metadata": {}, "outputs": [], "source": [ @@ -514,7 +544,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 29, "metadata": {}, "outputs": [], "source": [ @@ -530,7 +560,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 30, "metadata": {}, "outputs": [], "source": [ @@ -542,7 +572,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 31, "metadata": {}, "outputs": [], "source": [ @@ -554,14 +584,14 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 32, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "Stopping after epoch 45. Validation score did not improve by tol=1e-05 for more than 10 epochs. Final error is 0.5286356508731842" + "Stopping after epoch 24. Validation score did not improve by tol=1e-05 for more than 10 epochs. Final error is 1.3742991983890533" ] }, { @@ -570,13 +600,13 @@ "text": [ " precision recall f1-score support\n", "\n", - " negative 0.632 0.666 0.648 428\n", - " neutral 0.252 0.144 0.183 229\n", - " positive 0.638 0.745 0.687 444\n", + " negative 0.629 0.696 0.661 428\n", + " neutral 0.295 0.100 0.150 229\n", + " positive 0.625 0.773 0.691 444\n", "\n", - " accuracy 0.589 1101\n", - " macro avg 0.507 0.518 0.506 1101\n", - "weighted avg 0.555 0.589 0.567 1101\n", + " accuracy 0.603 1101\n", + " macro avg 0.516 0.523 0.500 1101\n", + "weighted avg 0.558 0.603 0.567 1101\n", "\n" ] } @@ -598,7 +628,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 33, "metadata": {}, "outputs": [], "source": [ @@ -614,7 +644,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 34, "metadata": {}, "outputs": [ { @@ -623,7 +653,7 @@ "['negative', 'neutral', 'positive']" ] }, - "execution_count": 33, + "execution_count": 34, "metadata": {}, "output_type": "execute_result" } @@ -634,7 +664,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 35, "metadata": {}, "outputs": [], "source": [ @@ -654,7 +684,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 36, "metadata": {}, "outputs": [], "source": [ @@ -670,7 +700,7 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 37, "metadata": {}, "outputs": [], "source": [ @@ -686,7 +716,7 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 38, "metadata": {}, "outputs": [], "source": [ @@ -702,7 +732,7 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 39, "metadata": {}, "outputs": [], "source": [ @@ -718,7 +748,7 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 40, "metadata": {}, "outputs": [], "source": [ @@ -737,7 +767,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 41, "metadata": {}, "outputs": [], "source": [ @@ -754,7 +784,7 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 42, "metadata": {}, "outputs": [], "source": [ @@ -763,20 +793,20 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 43, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "[('.', 0.0810196881304765),\n", - " ('fun', 0.06947951198804361),\n", - " ('film', 0.04929371582902589),\n", - " ('solid', 0.04672621050246706),\n", - " ('kids', 0.03809466066035495)]" + "[(',', 0.04512846003808179),\n", + " ('.', 0.03875377384651548),\n", + " ('film', 0.036562292947638124),\n", + " ('fun', 0.02995531556022619),\n", + " ('best', 0.015621606617978723)]" ] }, - "execution_count": 42, + "execution_count": 43, "metadata": {}, "output_type": "execute_result" } @@ -794,7 +824,7 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 44, "metadata": {}, "outputs": [], "source": [ @@ -803,7 +833,7 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 45, "metadata": {}, "outputs": [ { @@ -812,7 +842,7 @@ "'No one goes unindicted here , which is probably for the best .'" ] }, - "execution_count": 44, + "execution_count": 45, "metadata": {}, "output_type": "execute_result" } @@ -823,7 +853,7 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 46, "metadata": {}, "outputs": [], "source": [ @@ -832,21 +862,21 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 47, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "[('best', 0.7275746240134193),\n", - " ('probably', 0.3349310239020713),\n", - " ('.', 0.08365320489322038),\n", - " (',', 0.01769884396379488),\n", - " ('one', 0.002754690330329966),\n", - " ('goes', -0.19133889066064283)]" + "[('best', 0.43364394640626314),\n", + " (',', 0.04500691178712216),\n", + " ('.', 0.03940604247146967),\n", + " ('probably', 0.03321118433841792),\n", + " ('one', 0.008722432294266332),\n", + " ('goes', -0.03914730368530946)]" ] }, - "execution_count": 46, + "execution_count": 47, "metadata": {}, "output_type": "execute_result" } @@ -864,7 +894,7 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 48, "metadata": {}, "outputs": [], "source": [ @@ -877,7 +907,7 @@ }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 49, "metadata": {}, "outputs": [], "source": [ @@ -886,7 +916,7 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 50, "metadata": {}, "outputs": [], "source": [ @@ -895,7 +925,7 @@ }, { "cell_type": "code", - "execution_count": 50, + "execution_count": 51, "metadata": {}, "outputs": [], "source": [ @@ -904,7 +934,7 @@ }, { "cell_type": "code", - "execution_count": 51, + "execution_count": 52, "metadata": {}, "outputs": [], "source": [ @@ -921,7 +951,7 @@ }, { "cell_type": "code", - "execution_count": 52, + "execution_count": 53, "metadata": {}, "outputs": [], "source": [ @@ -938,7 +968,7 @@ }, { "cell_type": "code", - "execution_count": 53, + "execution_count": 54, "metadata": {}, "outputs": [], "source": [ @@ -990,7 +1020,7 @@ " true_class=true_class,\n", " attr_class=None,\n", " attr_score=attrs.sum(),\n", - " raw_input=raw_input,\n", + " raw_input_ids=raw_input,\n", " convergence_score=delta)\n", "\n", " return score_vis" @@ -998,13 +1028,13 @@ }, { "cell_type": "code", - "execution_count": 54, + "execution_count": 55, "metadata": {}, "outputs": [ { "data": { "text/html": [ - "
Legend: Negative Neutral Positive
True LabelPredicted LabelAttribution LabelAttribution ScoreWord Importance
22 (0.82)None2.69 #s They said it would be great , and they were right . #/s
00 (0.50)None1.67 #s They said it would be great , and they were wrong . #/s
22 (0.76)None1.17 #s They were right to say it would be great . #/s
00 (0.62)None3.81 #s They were wrong to say it would be great . #/s
22 (0.77)None1.60 #s They said it would be stellar , and they were correct . #/s
01 (0.47)None1.07 #s They said it would be stellar , and they were incorrect . #/s
" + "
Legend: Negative Neutral Positive
True LabelPredicted LabelAttribution LabelAttribution ScoreWord Importance
22 (0.82)None1.98 #s They said it would be great , and they were right . #/s
00 (0.50)None0.07 #s They said it would be great , and they were wrong . #/s
22 (0.76)None2.39 #s They were right to say it would be great . #/s
00 (0.62)None3.46 #s They were wrong to say it would be great . #/s
22 (0.77)None1.78 #s They said it would be stellar , and they were correct . #/s
01 (0.47)None1.17 #s They said it would be stellar , and they were incorrect . #/s
" ], "text/plain": [ "" diff --git a/finetuning.ipynb b/finetuning.ipynb index 594d260..cf55250 100644 --- a/finetuning.ipynb +++ b/finetuning.ipynb @@ -67,6 +67,7 @@ "from sklearn.metrics import classification_report\n", "import torch\n", "import torch.nn as nn\n", + "import transformers\n", "from transformers import BertModel, BertTokenizer\n", "\n", "from torch_shallow_neural_classifier import TorchShallowNeuralClassifier\n", @@ -109,9 +110,7 @@ "metadata": {}, "outputs": [], "source": [ - "import logging\n", - "logger = logging.getLogger()\n", - "logger.level = logging.ERROR" + "transformers.logging.set_verbosity_error()" ] }, { @@ -213,7 +212,7 @@ "dict_keys(['input_ids', 'token_type_ids', 'attention_mask'])" ] }, - "execution_count": 13, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } @@ -241,7 +240,7 @@ " [101, 15035, 3520, 156, 14787, 13327, 4455, 28026, 1116, 102, 0, 0]]" ] }, - "execution_count": 14, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -270,7 +269,7 @@ "[[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0]]" ] }, - "execution_count": 15, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } @@ -317,7 +316,7 @@ "torch.Size([2, 768])" ] }, - "execution_count": 17, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -346,7 +345,7 @@ "torch.Size([2, 12, 768])" ] }, - "execution_count": 18, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } @@ -467,8 +466,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 3h 3min 16s, sys: 1h 9min 9s, total: 4h 12min 26s\n", - "Wall time: 35min 24s\n" + "CPU times: user 32min 44s, sys: 52.8 s, total: 33min 37s\n", + "Wall time: 8min 24s\n" ] } ], @@ -485,8 +484,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 20min 28s, sys: 6min 30s, total: 26min 59s\n", - "Wall time: 4min 7s\n" + "CPU times: user 4min 14s, sys: 7.2 s, total: 4min 22s\n", + "Wall time: 1min 5s\n" ] } ], @@ -521,15 +520,15 @@ "name": "stderr", "output_type": "stream", "text": [ - "Stopping after epoch 23. Validation score did not improve by tol=1e-05 for more than 10 epochs. Final error is 5.422645628452301" + "Stopping after epoch 45. Validation score did not improve by tol=1e-05 for more than 10 epochs. Final error is 5.156181752681732" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 9.19 s, sys: 355 ms, total: 9.55 s\n", - "Wall time: 3.09 s\n" + "CPU times: user 21.3 s, sys: 2.56 s, total: 23.9 s\n", + "Wall time: 8.85 s\n" ] } ], @@ -557,13 +556,13 @@ "text": [ " precision recall f1-score support\n", "\n", - " negative 0.732 0.741 0.736 428\n", - " neutral 0.397 0.135 0.202 229\n", - " positive 0.659 0.876 0.752 444\n", + " negative 0.696 0.787 0.739 428\n", + " neutral 0.342 0.279 0.308 229\n", + " positive 0.756 0.732 0.744 444\n", "\n", - " accuracy 0.669 1101\n", - " macro avg 0.596 0.584 0.564 1101\n", - "weighted avg 0.633 0.669 0.632 1101\n", + " accuracy 0.659 1101\n", + " macro avg 0.598 0.600 0.597 1101\n", + "weighted avg 0.647 0.659 0.651 1101\n", "\n" ] } @@ -604,7 +603,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "Stopping after epoch 40. Validation score did not improve by tol=1e-05 for more than 10 epochs. Final error is 5.189640045166016" + "Stopping after epoch 39. Validation score did not improve by tol=1e-05 for more than 10 epochs. Final error is 5.242022633552551" ] }, { @@ -613,16 +612,16 @@ "text": [ " precision recall f1-score support\n", "\n", - " negative 0.726 0.757 0.741 428\n", - " neutral 0.412 0.175 0.245 229\n", - " positive 0.688 0.865 0.766 444\n", + " negative 0.701 0.806 0.750 428\n", + " neutral 0.435 0.162 0.236 229\n", + " positive 0.714 0.842 0.773 444\n", "\n", - " accuracy 0.679 1101\n", - " macro avg 0.609 0.599 0.584 1101\n", - "weighted avg 0.646 0.679 0.648 1101\n", + " accuracy 0.687 1101\n", + " macro avg 0.617 0.603 0.586 1101\n", + "weighted avg 0.651 0.687 0.652 1101\n", "\n", - "CPU times: user 3h 25min 19s, sys: 1h 14min 58s, total: 4h 40min 17s\n", - "Wall time: 39min 33s\n" + "CPU times: user 38min 14s, sys: 1min 2s, total: 39min 17s\n", + "Wall time: 9min 49s\n" ] } ], @@ -675,7 +674,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "Stopping after epoch 35. Validation score did not improve by tol=1e-05 for more than 10 epochs. Final error is 0.5038421787321568" + "Stopping after epoch 32. Validation score did not improve by tol=1e-05 for more than 10 epochs. Final error is 0.7171962857246399" ] }, { @@ -684,16 +683,16 @@ "text": [ " precision recall f1-score support\n", "\n", - " negative 0.708 0.687 0.698 428\n", - " neutral 0.355 0.328 0.341 229\n", - " positive 0.726 0.777 0.751 444\n", + " negative 0.702 0.776 0.737 428\n", + " neutral 0.351 0.236 0.282 229\n", + " positive 0.747 0.797 0.771 444\n", "\n", - " accuracy 0.649 1101\n", - " macro avg 0.597 0.597 0.596 1101\n", - "weighted avg 0.642 0.649 0.645 1101\n", + " accuracy 0.672 1101\n", + " macro avg 0.600 0.603 0.597 1101\n", + "weighted avg 0.647 0.672 0.656 1101\n", "\n", - "CPU times: user 3h 26min 32s, sys: 1h 15min 19s, total: 4h 41min 51s\n", - "Wall time: 39min 59s\n" + "CPU times: user 38min 45s, sys: 1min 39s, total: 40min 24s\n", + "Wall time: 10min 6s\n" ] } ], @@ -870,27 +869,27 @@ "name": "stderr", "output_type": "stream", "text": [ - "Finished epoch 1 of 1; error is 96.940810058265926" + "Finished epoch 1 of 1; error is 184.64238105341792" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "Best params: {'eta': 0.0001, 'gradient_accumulation_steps': 8, 'hidden_dim': 300}\n", - "Best score: 0.586\n", + "Best params: {'eta': 5e-05, 'gradient_accumulation_steps': 4, 'hidden_dim': 200}\n", + "Best score: 0.587\n", " precision recall f1-score support\n", "\n", - " negative 0.715 0.808 0.759 428\n", - " neutral 0.700 0.031 0.059 229\n", - " positive 0.662 0.905 0.765 444\n", + " negative 0.686 0.930 0.790 428\n", + " neutral 0.514 0.079 0.136 229\n", + " positive 0.763 0.836 0.798 444\n", "\n", - " accuracy 0.686 1101\n", - " macro avg 0.692 0.581 0.527 1101\n", - "weighted avg 0.691 0.686 0.616 1101\n", + " accuracy 0.715 1101\n", + " macro avg 0.655 0.615 0.575 1101\n", + "weighted avg 0.682 0.715 0.657 1101\n", "\n", - "CPU times: user 1h 48min 23s, sys: 5min 23s, total: 1h 53min 47s\n", - "Wall time: 1h 55min 41s\n" + "CPU times: user 1h 27min 12s, sys: 11min 18s, total: 1h 38min 31s\n", + "Wall time: 1h 37min 44s\n" ] } ], @@ -961,7 +960,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "Stopping after epoch 9. Validation score did not improve by tol=1e-05 for more than 5 epochs. Final error is 7.519404984079301" + "Stopping after epoch 9. Validation score did not improve by tol=1e-05 for more than 5 epochs. Final error is 11.503188711278199" ] }, { @@ -970,16 +969,16 @@ "text": [ " precision recall f1-score support\n", "\n", - " negative 0.756 0.825 0.789 912\n", - " neutral 0.338 0.314 0.325 389\n", - " positive 0.821 0.771 0.795 909\n", + " negative 0.816 0.754 0.784 912\n", + " neutral 0.332 0.501 0.400 389\n", + " positive 0.881 0.756 0.813 909\n", "\n", - " accuracy 0.713 2210\n", - " macro avg 0.638 0.636 0.636 2210\n", - "weighted avg 0.709 0.713 0.710 2210\n", + " accuracy 0.710 2210\n", + " macro avg 0.676 0.670 0.666 2210\n", + "weighted avg 0.758 0.710 0.728 2210\n", "\n", - "CPU times: user 13min 7s, sys: 19 s, total: 13min 26s\n", - "Wall time: 13min 27s\n" + "CPU times: user 9min 54s, sys: 1min 22s, total: 11min 17s\n", + "Wall time: 11min 16s\n" ] } ], diff --git a/nli_02_models.ipynb b/nli_02_models.ipynb index 8e5a520..676fafb 100644 --- a/nli_02_models.ipynb +++ b/nli_02_models.ipynb @@ -9,7 +9,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -73,7 +73,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -102,7 +102,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -111,7 +111,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -124,9 +124,31 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Reusing dataset snli (/home/ubuntu/.cache/huggingface/datasets/snli/plain_text/1.0.0/1f60b67533b65ae0275561ff7828aad5ee4282d0e6f844fd148d05d3c6ea251b)\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "aad015597d324d7b8ecc411825f9b664", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0/3 [00:00\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
#MODALTrue
correct
False56
True88
\n", + "" + ], + "text/plain": [ + "#MODAL True\n", + "correct \n", + "False 56\n", + "True 88" + ] + }, + "execution_count": 48, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "pd.crosstab(ann_analysis_df['correct'], ann_analysis_df['#MODAL'])" ] diff --git a/requirements.txt b/requirements.txt index de5aff1..15a9356 100644 --- a/requirements.txt +++ b/requirements.txt @@ -31,3 +31,4 @@ torchvision==0.11.1 transformers==4.17.0 datasets==2.0.0 spacy +gitpython diff --git a/setup.ipynb b/setup.ipynb index cb55d34..d20f748 100644 --- a/setup.ipynb +++ b/setup.ipynb @@ -97,7 +97,7 @@ "\n", "We recommend that you download it, unzip it, and place it in the same directory as your local copy of this Github repository. If you decide to put it somewhere else, you'll need to adjust the paths given in the \"Set-up\" sections of essentially all the notebooks.\n", "\n", - "We recommend you to check the `md5` checksum of the `data.tgz` afte the download. The current version (as of 8/22/2021), the checksum is `a447b2a81835707ad7882f8f881af79a`. If you see the different checksum, then ask this to the teaching staff." + "We recommend you to check the `md5` checksum of the `data.tgz` after the download. The current version (as of 8/22/2021), the checksum is `a447b2a81835707ad7882f8f881af79a`. If you see the different checksum, then ask this to the teaching staff." ] }, { diff --git a/sst_03_neural_networks.ipynb b/sst_03_neural_networks.ipynb index 41ac327..5ffd723 100644 --- a/sst_03_neural_networks.ipynb +++ b/sst_03_neural_networks.ipynb @@ -223,8 +223,8 @@ " macro avg 0.544 0.521 0.480 1101\n", "weighted avg 0.571 0.611 0.555 1101\n", "\n", - "CPU times: user 2.12 s, sys: 52.9 ms, total: 2.18 s\n", - "Wall time: 2.18 s\n" + "CPU times: user 2.48 s, sys: 75.5 ms, total: 2.56 s\n", + "Wall time: 2.5 s\n" ] } ], @@ -305,16 +305,16 @@ "text": [ " precision recall f1-score support\n", "\n", - " negative 0.591 0.673 0.630 428\n", + " negative 0.593 0.673 0.630 428\n", " neutral 0.423 0.048 0.086 229\n", - " positive 0.560 0.741 0.638 444\n", + " positive 0.560 0.743 0.639 444\n", "\n", - " accuracy 0.570 1101\n", - " macro avg 0.525 0.487 0.451 1101\n", - "weighted avg 0.544 0.570 0.520 1101\n", + " accuracy 0.571 1101\n", + " macro avg 0.525 0.488 0.452 1101\n", + "weighted avg 0.544 0.571 0.521 1101\n", "\n", - "CPU times: user 3.64 s, sys: 41 ms, total: 3.68 s\n", - "Wall time: 3.69 s\n" + "CPU times: user 4.62 s, sys: 340 ms, total: 4.96 s\n", + "Wall time: 4.4 s\n" ] } ], @@ -574,15 +574,15 @@ "name": "stderr", "output_type": "stream", "text": [ - "Stopping after epoch 58. Validation score did not improve by tol=1e-05 for more than 10 epochs. Final error is 0.2520811893045902" + "Stopping after epoch 58. Validation score did not improve by tol=1e-05 for more than 10 epochs. Final error is 0.2886183727532625" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 6min 37s, sys: 27.9 s, total: 7min 5s\n", - "Wall time: 2min 52s\n" + "CPU times: user 38.9 s, sys: 24.6 s, total: 1min 3s\n", + "Wall time: 19.2 s\n" ] } ], @@ -610,13 +610,13 @@ "text": [ " precision recall f1-score support\n", "\n", - " negative 0.589 0.565 0.577 428\n", - " neutral 0.250 0.249 0.249 229\n", - " positive 0.621 0.646 0.634 444\n", + " negative 0.575 0.614 0.594 428\n", + " neutral 0.230 0.223 0.226 229\n", + " positive 0.637 0.606 0.621 444\n", "\n", - " accuracy 0.532 1101\n", - " macro avg 0.487 0.487 0.487 1101\n", - "weighted avg 0.531 0.532 0.532 1101\n", + " accuracy 0.530 1101\n", + " macro avg 0.481 0.481 0.481 1101\n", + "weighted avg 0.529 0.530 0.529 1101\n", "\n" ] } @@ -684,15 +684,15 @@ "name": "stderr", "output_type": "stream", "text": [ - "Stopping after epoch 22. Validation score did not improve by tol=1e-05 for more than 10 epochs. Final error is 0.7556907385587692" + "Stopping after epoch 27. Validation score did not improve by tol=1e-05 for more than 10 epochs. Final error is 0.3226494677364826" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 3min 7s, sys: 16.6 s, total: 3min 23s\n", - "Wall time: 1min 29s\n" + "CPU times: user 13.1 s, sys: 9.15 s, total: 22.2 s\n", + "Wall time: 5.63 s\n" ] } ], @@ -720,13 +720,13 @@ "text": [ " precision recall f1-score support\n", "\n", - " negative 0.642 0.757 0.695 428\n", - " neutral 0.250 0.157 0.193 229\n", - " positive 0.695 0.707 0.701 444\n", + " negative 0.676 0.664 0.670 428\n", + " neutral 0.307 0.323 0.315 229\n", + " positive 0.700 0.694 0.697 444\n", "\n", - " accuracy 0.612 1101\n", - " macro avg 0.529 0.540 0.529 1101\n", - "weighted avg 0.582 0.612 0.593 1101\n", + " accuracy 0.605 1101\n", + " macro avg 0.561 0.560 0.561 1101\n", + "weighted avg 0.609 0.605 0.607 1101\n", "\n" ] } @@ -797,27 +797,27 @@ "name": "stderr", "output_type": "stream", "text": [ - "Stopping after epoch 16. Validation score did not improve by tol=1e-05 for more than 10 epochs. Final error is 0.7026695416478938" + "Stopping after epoch 14. Validation score did not improve by tol=1e-05 for more than 10 epochs. Final error is 2.7038347354674672" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "Best params: {'embed_dim': 100, 'eta': 0.001, 'hidden_dim': 100}\n", - "Best score: 0.547\n", + "Best params: {'embed_dim': 75, 'eta': 0.001, 'hidden_dim': 100}\n", + "Best score: 0.546\n", " precision recall f1-score support\n", "\n", - " negative 0.668 0.668 0.668 428\n", - " neutral 0.291 0.218 0.249 229\n", - " positive 0.667 0.752 0.707 444\n", + " negative 0.699 0.666 0.682 428\n", + " neutral 0.299 0.240 0.266 229\n", + " positive 0.662 0.759 0.707 444\n", "\n", - " accuracy 0.609 1101\n", - " macro avg 0.542 0.546 0.541 1101\n", - "weighted avg 0.589 0.609 0.597 1101\n", + " accuracy 0.615 1101\n", + " macro avg 0.553 0.555 0.552 1101\n", + "weighted avg 0.601 0.615 0.606 1101\n", "\n", - "CPU times: user 6h 7min 58s, sys: 22min 13s, total: 6h 30min 12s\n", - "Wall time: 3h 35min 2s\n" + "CPU times: user 39min 55s, sys: 39.9 s, total: 40min 35s\n", + "Wall time: 39min 53s\n" ] } ], @@ -982,26 +982,26 @@ "name": "stderr", "output_type": "stream", "text": [ - "Stopping after epoch 13. Validation score did not improve by tol=1e-05 for more than 10 epochs. Final error is 0.037477616686373956" + "Stopping after epoch 13. Validation score did not improve by tol=1e-05 for more than 10 epochs. Final error is 0.021834758925251663" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "Best params: {'embed_dim': 100, 'eta': 0.05}\n", + "Best params: {'embed_dim': 300, 'eta': 0.05}\n", "Best score: 0.784\n", " precision recall f1-score support\n", "\n", - " negative 0.779 0.814 0.796 912\n", - " positive 0.804 0.768 0.786 909\n", + " negative 0.827 0.779 0.802 912\n", + " positive 0.790 0.836 0.812 909\n", "\n", - " accuracy 0.791 1821\n", - " macro avg 0.791 0.791 0.791 1821\n", - "weighted avg 0.791 0.791 0.791 1821\n", + " accuracy 0.807 1821\n", + " macro avg 0.808 0.807 0.807 1821\n", + "weighted avg 0.808 0.807 0.807 1821\n", "\n", - "CPU times: user 21min 22s, sys: 1min 9s, total: 22min 31s\n", - "Wall time: 12min 1s\n" + "CPU times: user 42min 50s, sys: 28min 13s, total: 1h 11min 3s\n", + "Wall time: 17min 48s\n" ] } ], diff --git a/test/test_colors.py b/test/test_colors.py index 1491323..3cc34c3 100644 --- a/test/test_colors.py +++ b/test/test_colors.py @@ -5,7 +5,7 @@ import utils __author__ = "Christopher Potts" -__version__ = "CS224u, Stanford, Spring 2021" +__version__ = "CS224u, Stanford, Spring 2022" utils.fix_random_seeds() diff --git a/torch_model_base.py b/torch_model_base.py index b2b2bec..ac8f4c5 100644 --- a/torch_model_base.py +++ b/torch_model_base.py @@ -326,19 +326,10 @@ def fit(self, *args): dataset = self.build_dataset(*args) dataloader = self._build_dataloader(dataset, shuffle=True) - # Graph: - if not self.warm_start or not hasattr(self, "model"): - self.model = self.build_graph() - # This device move has to happen before the optimizer is built: - # https://pytorch.org/docs/master/optim.html#constructing-it - self.model.to(self.device) - self.optimizer = self.build_optimizer() - self.errors = [] - self.validation_scores = [] - self.no_improvement_count = 0 - self.best_error = np.inf - self.best_score = -np.inf - self.best_parameters = None + # Set up parameters needed to use the model. This is a separate + # function to support using pretrained models for prediction, + # where it might not be desirable to call `fit`. + self.initialize() # Make sure the model is where we want it: self.model.to(self.device) @@ -410,6 +401,26 @@ def fit(self, *args): return self + def initialize(self): + """ + Method called by `fit` to establish core attributes. To use a + pretrained model without calling `fit`, one can use this + method. + + """ + if not self.warm_start or not hasattr(self, "model"): + self.model = self.build_graph() + # This device move has to happen before the optimizer is built: + # https://pytorch.org/docs/master/optim.html#constructing-it + self.model.to(self.device) + self.optimizer = self.build_optimizer() + self.errors = [] + self.validation_scores = [] + self.no_improvement_count = 0 + self.best_error = np.inf + self.best_score = -np.inf + self.best_parameters = None + @staticmethod def _build_validation_split(*args, validation_fraction=0.2): """