From e1bf114a70d6eda61271ccb4f87fdd5e785cdbc2 Mon Sep 17 00:00:00 2001 From: Logan Born Date: Thu, 6 Apr 2023 15:07:17 -0600 Subject: [PATCH] Add visualization scripts. --- viz/Analysis and Visualization.ipynb | 351 +++++++++++++++++++++++++++ 1 file changed, 351 insertions(+) create mode 100644 viz/Analysis and Visualization.ipynb diff --git a/viz/Analysis and Visualization.ipynb b/viz/Analysis and Visualization.ipynb new file mode 100644 index 0000000..69bdacb --- /dev/null +++ b/viz/Analysis and Visualization.ipynb @@ -0,0 +1,351 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "7cb12db5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "fatal: destination path 'svcca' already exists and is not an empty directory.\r\n" + ] + } + ], + "source": [ + "!git clone https://github.com/google/svcca.git" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "4202a196", + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import sys\n", + "sys.path.append(\"./svcca\")\n", + "import cca_core\n", + "import pwcca\n", + "\n", + "import torch\n", + "import matplotlib.pyplot as plt\n", + "from collections import defaultdict\n", + "import numpy as np\n", + "\n", + "models = dict()\n", + "vocabs = dict()\n", + "\n", + "basedir = \"./\"\n", + "\n", + "# Load models\n", + "for expt in [\"iwslt14_dex_2keys_kl\", \"14_de_en_base\"]:\n", + " with open(f\"{basedir}/embedding_plots/{expt}.vocab\") as fp:\n", + " vocab = fp.read().strip().split(\"\\n\")\n", + " vocab = [line.split(\"\\t\")[0] for line in vocab]\n", + " vocabs[expt] = vocab\n", + " \n", + " model = torch.load(f\"{basedir}/embedding_plots/{expt}/checkpoint_best.pt\")\n", + " models[expt] = model['model']['encoder.embed_tokens.weight']\n", + " \n", + "# Load hidden states from file\n", + "embeds = defaultdict(lambda:defaultdict(dict))\n", + "ids = defaultdict(list)\n", + "for model in [\"iwslt14_dex_2keys_kl\", \"iwslt14_dex_2keys_kl_de1\", \"iwslt14_dex_2keys_kl_de2\", \"14_de_en_base\"]:\n", + " for layer in range(7):\n", + " for fnum in range(4):\n", + " fp = np.load(f\"{basedir}/hidden/{model}/{fnum}.npz\", allow_pickle=True) \n", + " es = fp[\"arr\"][layer].numpy()\n", + " for i, id in enumerate(fp[\"ids\"].tolist()):\n", + " embeds[model][layer][id] = es[:,i,:]\n", + " \n", + "# Compute layerwise PWCCA across model pairs\n", + "mats = dict()\n", + "ms = [\n", + " (\"base\", \"14_de_en_base\"),\n", + " (\"cipher\", \"iwslt14_dex_2keys_kl\"),\n", + " (\"de1\", \"iwslt14_dex_2keys_kl_de1\"),\n", + " (\"de2\", \"iwslt14_dex_2keys_kl_de2\"),\n", + "]\n", + "for i, (l1, m1) in enumerate(ms):\n", + " for j, (l2, m2) in enumerate(ms):\n", + " if j <= i or i >= 2:\n", + " continue\n", + " \n", + " mat = [[0 for _ in range(7)] for _ in range(7)]\n", + " shared_ids = [id for id in embeds[m1][0] if id in embeds[m2][0]]\n", + " for layer1 in range(7):\n", + " for layer2 in range(7):\n", + " X = np.concatenate([embeds[m1][layer1][id][0:15,:] for id in shared_ids]).T\n", + " Y = np.concatenate([embeds[m2][layer2][id][0:15,:] for id in shared_ids]).T\n", + " pwcca_mean, w, _ = pwcca.compute_pwcca(\n", + " X, \n", + " Y,\n", + " epsilon=1e-10\n", + " )\n", + " if layer1 == 0 and layer2 == 0:\n", + " rand_mean, w, _ = pwcca.compute_pwcca(\n", + " np.random.rand(*X.shape), \n", + " np.random.rand(*Y.shape),\n", + " epsilon=1e-10\n", + " )\n", + " mat[layer1][layer2] = pwcca_mean\n", + " mats[l1,l2] = np.array(mat)\n", + " \n", + "\n", + "# Plot CCA as heatmap\n", + "VMIN=0.435\n", + "VMAX=0.48\n", + "plt.figure(figsize=(5,4))\n", + "plt.subplot(1,3,1)\n", + "plt.ylabel(\"CipherDAug Layer\\nde-en\")\n", + "plt.xlabel(\"Baseline Layer\")\n", + "plt.imshow(mats[\"base\", \"cipher\"][1:,1:][::-1], \n", + " vmin=VMIN, vmax=VMAX\n", + ")\n", + "plt.xticks(range(6), range(1,7))\n", + "plt.yticks(range(6), range(6,0,-1))\n", + "plt.subplot(1,3,2)\n", + "plt.ylabel(\"ROT-1(de)-en\")\n", + "plt.xlabel(\"Baseline Layer\")\n", + "plt.imshow(mats[\"base\", \"de1\"][1:,1:][::-1], \n", + " vmin=VMIN, vmax=VMAX\n", + ")\n", + "plt.xticks(range(6), range(1,7))\n", + "plt.yticks(range(6), range(6,0,-1))\n", + "ax=plt.subplot(1,3,3)\n", + "plt.ylabel(\"ROT-2(de)-en\")\n", + "plt.xlabel(\"Baseline Layer\")\n", + "im=plt.imshow(mats[\"base\", \"de2\"][1:,1:][::-1], \n", + " vmin=VMIN, vmax=VMAX\n", + " )\n", + "plt.xticks(range(6), range(1,7))\n", + "plt.yticks(range(6), range(6,0,-1))\n", + "cax=ax.inset_axes([1.1,0,0.1,1], transform=ax.transAxes)\n", + "plt.colorbar(im, ax=ax, cax=cax)\n", + "plt.tight_layout()\n", + "plt.show()\n", + "\n", + "VMIN=0.51\n", + "VMAX=0.61\n", + "plt.figure(figsize=(5,4))\n", + "plt.subplot(1,2,1)\n", + "plt.xlabel(\"CipherDAug Layer\\nROT-1(de)-en\")\n", + "plt.ylabel(\"CipherDAug Layer\\nde-en\")\n", + "plt.imshow(mats[\"cipher\",\"de1\"][1:,1:][::-1], vmin=VMIN, vmax=VMAX)\n", + "plt.xticks(range(6), range(1,7))\n", + "plt.yticks(range(6), range(6,0,-1))\n", + "ax=plt.subplot(1,2,2)\n", + "plt.xlabel(\"CipherDAug Layer\\nROT-2(de)-en\")\n", + "plt.ylabel(\"de-en\")\n", + "im=plt.imshow(mats[\"cipher\",\"de2\"][1:,1:][::-1], vmin=VMIN, vmax=VMAX)\n", + "plt.xticks(range(6), range(1,7))\n", + "plt.yticks(range(6), range(6,0,-1))\n", + "cax=ax.inset_axes([1.1,0,0.1,1], transform=ax.transAxes)\n", + "plt.colorbar(im, ax=ax, cax=cax)\n", + "plt.tight_layout()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "f99d2328", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[(336, '▁hier'), (1865, '▁ist'), (1667, '▁es'), (9, '▁nöt'), (213, 'ig'), (9786, ','), (2215, '▁das'), (9786, ','), (624, '▁was'), (1836, '▁wir'), (105, '▁unter'), (6, '▁polit'), (1, 'ically'), (1, '▁correct'), (3, 'ness'), (57, '▁verstehen'), (9786, ','), (187, '▁immer'), (149, '▁wieder'), (16, '▁anzu'), (13, 'bringen'), (6696, '.')]\n", + "2061.681818181818\n", + "1\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[(336, '▁ijfs'), (1865, '▁jtu'), (1669, '▁ft'), (9, '▁oøu'), (233, 'jh'), (9786, ','), (2215, '▁ebt'), (9786, ','), (626, '▁xbt'), (1838, '▁xjs'), (116, '▁voufs'), (6, '▁qpmju'), (33, 'jd'), (66, 'bmm'), (158, 'z'), (74, '▁d'), (96, 'ps'), (87, 'sf'), (27, 'du'), (126, 'o'), (31, 'ftt'), (57, '▁wfstufifo'), (9786, ','), (188, '▁jnnfs'), (149, '▁xjfefs'), (19, '▁boßv'), (13, 'csjohfo'), (6696, '.')]\n", + "1646.107142857143\n", + "6\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[(336, '▁jkgt'), (1865, '▁kuv'), (1669, '▁gu'), (9, '▁pú'), (50, 'vki'), (9786, ','), (2216, '▁fcu'), (9786, ','), (624, '▁ycu'), (1837, '▁ykt'), (119, '▁wpvgt'), (6, '▁rqnkv'), (44, 'ke'), (49, 'cnn'), (137, 'ß'), (58, '▁e'), (118, 'qt'), (104, 't'), (6, 'gev'), (98, 'p'), (26, 'guu'), (57, '▁xgtuvgjgp'), (9786, ','), (187, '▁koogt'), (149, '▁ykgfgt'), (33, '▁cpàw'), (18, 'dtkpigp'), (6696, '.')]\n", + "1638.1785714285713\n", + "6\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==========\n", + "\n", + "\n" + ] + } + ], + "source": [ + "# Compare subword rarity between plaintext and rotated inputs:\n", + "\n", + "from collections import Counter\n", + "vocab_counts = np.load(f\"{basedir}/vocab_counts.npz\", allow_pickle=True)\n", + "\n", + "freqs = dict()\n", + "for key in vocab_counts:\n", + " freqs[key] = Counter(sum(vocab_counts[key], []))\n", + " \n", + "diffs = [\n", + " sum([freqs[\"de0\"][sw] for sw in s1[:-1]])/len(s1)\n", + " - sum([freqs[\"de2\"][sw] for sw in s2[:-1]])/len(s2)\n", + " for s1, s2 in zip(vocab_counts[\"de0\"],vocab_counts[\"de2\"])\n", + "]\n", + "\n", + "import matplotlib.pyplot as plt\n", + "nsents=1\n", + "for start in np.argsort(diffs)[::-1][:nsents]:\n", + " for j, key in enumerate([\"de0\", \"de1\", \"de2\"]):\n", + " fig=plt.figure(figsize=(6,1.25))\n", + " fig.suptitle(\n", + " (\" de\" if key==\"de0\" else \" ROT-1(de)\" if key==\"de1\" else \" ROT-2(de)\")\n", + " )\n", + " sentence = vocab_counts[key][start]\n", + " counts = [freqs[key][sw] for sw in sentence]\n", + " print(list(zip(counts,sentence)))\n", + " print(np.mean(counts))\n", + " print(np.min(counts))\n", + " ax=plt.subplot(1,2,1)\n", + " ax.yaxis.set_label_position(\"left\")\n", + " plt.ylabel(\"Freq.\")\n", + " if key == \"de2\":\n", + " plt.xlabel(\"Subword position in sentence\")\n", + " plt.bar(range(len(counts)), counts, color=\"#741b47\")\n", + " plt.xticks([],[])\n", + " ax.yaxis.tick_right()\n", + " ax.set_yscale(\"log\")\n", + " plt.yticks([1,100,10000],[\" $10^0$\",\" $10^2$\",\" $10^4$\"])\n", + " plt.ylim(1,15000)\n", + " ax=plt.subplot(1,2,2)\n", + " if key == \"de2\":\n", + " plt.xlabel(\"Subwords sorted by frequency\")\n", + " plt.bar(range(len(counts)), sorted(counts,reverse=True), color=\"#741b47\")\n", + " plt.xticks([],[])\n", + " plt.ylim(1,15000)\n", + " ax.set_yscale(\"log\")\n", + " plt.yticks([1,100,10000],[\"\",\"\",\"\"])\n", + " plt.tight_layout()\n", + " plt.show()\n", + " print(\"=\"*10)\n", + " print()\n", + " print()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "b1a419cb", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Avg. freq. of rarest subword in baseline: 8.08\n", + "Avg. freq. of rarest subword in de0 : 9.14\n", + "Avg. freq. of rarest subword in de1 : 9.76\n", + "Avg. freq. of rarest subword in de2 : 9.72\n" + ] + } + ], + "source": [ + "mins = defaultdict(list)\n", + "for key in vocab_counts:\n", + " for sentence in vocab_counts[key]:\n", + " counts = [freqs[key][sw] for sw in sentence]\n", + " mins[key].append(np.min(counts))\n", + " print(f\"Avg. freq. of rarest subword in {key:8}: {np.mean(mins[key]):.2f}\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.10.8" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}