diff --git a/tutorials/advanced_tutorials/Probing_Gender.ipynb b/tutorials/advanced_tutorials/Probing_Gender.ipynb index da366d20..bb71dbf0 100644 --- a/tutorials/advanced_tutorials/Probing_Gender.ipynb +++ b/tutorials/advanced_tutorials/Probing_Gender.ipynb @@ -18,7 +18,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -35,14 +35,14 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "try:\n", " # This library is our indicator that the required installs\n", " # need to be done.\n", - " import pyvene\n", + " import pyvene as pv\n", "\n", "except ModuleNotFoundError:\n", " !pip install git+https://github.com/stanfordnlp/pyvene.git" @@ -50,27 +50,11 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", - "from pyvene import (\n", - " embed_to_distrib,\n", - " top_vals,\n", - " format_token,\n", - " count_parameters,\n", - ")\n", - "from pyvene import (\n", - " IntervenableModel,\n", - " RepresentationConfig,\n", - " IntervenableConfig,\n", - " VanillaIntervention,\n", - " LowRankRotatedSpaceIntervention,\n", - " Intervention,\n", - " CollectIntervention,\n", - ")\n", - "\n", "from transformers import (\n", " AutoModelForCausalLM,\n", " AutoTokenizer,\n", @@ -79,6 +63,7 @@ "import torch\n", "import random\n", "from sklearn.linear_model import LogisticRegression\n", + "from sklearn.metrics import f1_score\n", "\n", "%config InlineBackend.figure_formats = ['svg']\n", "from plotnine import (\n", @@ -113,15 +98,7 @@ "cell_type": "code", "execution_count": 4, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Special tokens have been added in the vocabulary, make sure the associated word embeddings are fine-tuned or trained.\n" - ] - } - ], + "outputs": [], "source": [ "device = \"cuda:0\" if torch.cuda.is_available() else \"cpu\"\n", "model = \"EleutherAI/pythia-70m\" # \"EleutherAI/pythia-6.9B\"\n", @@ -397,7 +374,7 @@ { "data": { "text/plain": [ - "Example(base={'input_ids': tensor([[ 0, 40587, 7428, 984]]), 'attention_mask': tensor([[1, 1, 1, 1]])}, src={'input_ids': tensor([[ 0, 46961, 7428, 984]]), 'attention_mask': tensor([[1, 1, 1, 1]])}, base_label=703, src_label=344)" + "Example(base={'input_ids': tensor([[ 0, 37376, 7428, 984]]), 'attention_mask': tensor([[1, 1, 1, 1]])}, src={'input_ids': tensor([[ 0, 44305, 7428, 984]]), 'attention_mask': tensor([[1, 1, 1, 1]])}, base_label=344, src_label=703)" ] }, "execution_count": 6, @@ -446,8 +423,12 @@ "name": "stderr", "output_type": "stream", "text": [ - "100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 100/100 [00:01<00:00, 79.91it/s]\n", - "100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 50/50 [00:00<00:00, 98.78it/s]\n" + "huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\n", + "To disable this warning, you can either:\n", + "\t- Avoid using `tokenizers` before the fork if possible\n", + "\t- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)\n", + "100%|██████████| 100/100 [00:05<00:00, 17.51it/s]\n", + "100%|██████████| 50/50 [00:02<00:00, 19.85it/s]\n" ] } ], @@ -473,21 +454,15 @@ "metadata": {}, "outputs": [], "source": [ - "def intervention_config(model_type, intervention_type, layer, num_dims=1):\n", - " \"\"\"Generate intervention config.\"\"\"\n", - "\n", - " # init\n", - " config = IntervenableConfig(\n", - " representations=[\n", - " RepresentationConfig(\n", - " layer, # layer\n", - " intervention_type, # intervention type\n", - " low_rank_dimension=num_dims, # low rank dimension\n", - " ),\n", - " ],\n", - " intervention_types=[LowRankRotatedSpaceIntervention],\n", - " interventions=[None],\n", - " )\n", + "def intervention_config(intervention_site, layer, num_dims=1):\n", + " config = pv.IntervenableConfig([\n", + " {\n", + " \"layer\": layer,\n", + " \"component\": intervention_site,\n", + " \"intervention_type\": pv.LowRankRotatedSpaceIntervention,\n", + " \"low_rank_dimension\": num_dims,\n", + " }\n", + " ])\n", " return config" ] }, @@ -509,271 +484,3828 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# intervention settings\n", - "stats = []\n", - "num_layers = gpt.config.num_hidden_layers\n", - "\n", - "# loop over layers and positions\n", - "for layer in range(num_layers):\n", - " for position in range(4):\n", - " print(f\"layer: {layer}, position: {position}\")\n", - "\n", - " # set up intervenable model\n", - " config = intervention_config(type(gpt), \"block_output\", layer, 1)\n", - " intervenable = IntervenableModel(config, gpt)\n", - " intervenable.set_device(device)\n", - " intervenable.disable_model_gradients()\n", - "\n", - " # set up optimizer\n", - " optimizer_params = []\n", - " for k, v in intervenable.interventions.items():\n", - " try:\n", - " optimizer_params.append({\"params\": v[0].rotate_layer.parameters()})\n", - " except:\n", - " pass\n", - " optimizer = torch.optim.Adam(optimizer_params, lr=1e-3)\n", - " scheduler = get_linear_schedule_with_warmup(\n", - " optimizer,\n", - " num_warmup_steps=int(0.1 * total_steps),\n", - " num_training_steps=total_steps,\n", - " )\n", - "\n", - " # training loop\n", - " iterator = tqdm(trainset)\n", - " for example in iterator:\n", - " # forward pass\n", - " _, counterfactual_outputs = intervenable(\n", - " example.base,\n", - " [example.src],\n", - " {\"sources->base\": position},\n", - " )\n", - "\n", - " # loss\n", - " logits = counterfactual_outputs.logits[:, -1]\n", - " loss = calculate_loss(logits, torch.tensor([example.src_label]).to(device))\n", - " iterator.set_postfix({\"loss\": f\"{loss.item():.3f}\"})\n", - "\n", - " # backward\n", - " loss.backward()\n", - " optimizer.step()\n", - " scheduler.step()\n", - "\n", - " # eval\n", - " with torch.no_grad():\n", - " iia = 0\n", - " iterator = tqdm(evalset)\n", - " for example in iterator:\n", - " # forward\n", - " _, counterfactual_outputs = intervenable(\n", - " example.base,\n", - " [example.src],\n", - " {\"sources->base\": position},\n", - " )\n", - "\n", - " # calculate iia\n", - " logits = counterfactual_outputs.logits[0, -1]\n", - " if logits[example.src_label] > logits[example.base_label]:\n", - " iia += 1\n", - "\n", - " # stats\n", - " iia = iia / len(evalset)\n", - " stats.append({\"layer\": layer, \"position\": position, \"iia\": iia})\n", - " print(f\"iia: {iia:.3%}\")\n", - "df = pd.DataFrame(stats)\n", - "df.to_csv(f\"./tutorial_data/pyvene_gender_das.csv\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And this is the plot of IIA. In layers 2 and 3 it seems the gender is represented across positions 1-3, and entirely in position 3 in later layers." - ] - }, - { - "cell_type": "code", - "execution_count": 7, + "execution_count": 11, "metadata": {}, "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "layer: 0, position: 0\n" + ] + }, { "name": "stderr", "output_type": "stream", "text": [ - "/u/nlp/anaconda/main/anaconda3/envs/wuzhengx-bootleg/lib/python3.8/site-packages/plotnine/ggplot.py:587: PlotnineWarning: Saving 5 x 3 in image.\n", - "/u/nlp/anaconda/main/anaconda3/envs/wuzhengx-bootleg/lib/python3.8/site-packages/plotnine/ggplot.py:588: PlotnineWarning: Filename: ./tutorial_data/pyvene_gender_das.pdf\n" + "100%|██████████| 100/100 [00:09<00:00, 10.66it/s, loss=4.355]\n", + "100%|██████████| 50/50 [00:03<00:00, 13.26it/s]\n" ] }, { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAA+gAAAJYCAYAAADxHswlAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/OQEPoAAAACXBIWXMAAB7CAAAewgFu0HU+AACWVUlEQVR4nOzdd3wUdf7H8ffspjcg9N57KIIFBZGiyCEiih0UvVPPs6BnO+/wrKhYDsth+Xl6olIsiAh6Fo6qdOm9V0NJICGkt/n9wWXNkrK7yc7sJnk9fYzu7nznO5/Z3Yn7me93vl/DNE1TAAAAAAAgoByBDgAAAAAAAJCgAwAAAAAQFEjQAQAAAAAIAiToAAAAAAAEARJ0AAAAAACCAAk6AAAAAABBgAQdAAAAAIAgQIIOAAAAAEAQIEEHAAAAACAIkKADAAAAABAESNCrkVatWskwDBmGoSlTpgQ6nKDAe4KaZtGiRa7vvGEYgQ4n6KxYsUIOh0OGYei6664LdDjVwhdffOH6vj300EOBDgcAgCotJNABAABgB9M0NW7cOJmmKafTqQkTJgQ6pIA6ffq01qxZo127dik1NVW5ubmKjo5Ww4YN1bp1a3Xt2lWxsbEe67n22mvVq1cvrV27VpMnT9Yf//hHdezY0YYjAACg+qkRCfr+/fvVunVrS+p+6qmn9PTTT1tSN4JX8ZbJsWPHBqx1vvh377bbblOrVq0CEgf8b/bs2Vq/fr0kqWfPnho5cmRA46kOpk2bptWrV0uSbr755nKTyKefflrPPPNMmetDQkIUERGh+Ph4NW7cWO3bt9c555yjSy65RL179/ZbzDNnzizR0r9r1y61a9euwnUuWbJE//jHP/Ttt9+qoKCgzHIOh0MdO3bUoEGDNGLECA0ZMqTUcoZh6Omnn9aIESOUl5env/zlL5o9e3aF4wMAoCarEQk6UF0VTyAGDBhAgl6NzJ49Wx999JGkMxeBSNArp6CgwO18efTRRytVX35+vtLT05Wenq6DBw9q5cqVmjp1qqQzt9b88Y9/1J/+9CfVqlWrUvv58MMPS7w2ZcqUCrX+5+fna9y4cXrnnXe8Kl9YWKht27Zp27Ztmjlzpo4ePVpm2eHDh6tz587atm2bvv76a61Zs8avFyoAAKgpakSCHhoaqrZt23osd/z4cZ0+fdr13Jtt4uPjKxWbP+3fvz/QIQAIsAEDBsg0zUCHEXRmzJih3bt3S5IuvfRSdevWzaftW7ZsqZCQ3/6XWVhYqFOnTiktLU35+fluZffv36+//vWvev311/XOO+/o6quvrlDMR44c0Q8//FDi9Y8//ljPPvusHA7fhpG5/fbbXRcRipx77rm65JJL1KZNG0VFRenUqVM6fPiwVq1apVWrVik7O9urug3D0AMPPKC7775bkvTcc8/Rig4AQAXUiAS9adOmrh9m5bnttttcLVaSvNoGABD8Xn/9ddfjO+64w+ftFy1aVGYPlYMHD2rFihX68ccfNX36dGVlZUmSjh07pmuuuUavvfaaHnzwQZ/3+fHHH7u6oLdo0UKJiYnKz8/XoUOHNH/+fF122WVe1/Xll1+6Jedt2rTRJ598oosuuqjMbU6fPq1vv/1W77//vrZs2eJxHzfddJMeeughZWZmau7cudq7d6/atGnjdYwAAIBR3AEA1dzy5cu1Zs0aSVKtWrX8frtAixYtdP311+v999/XwYMH9fvf/95t/cMPP6w5c+b4XG/xsS3uuOMOt3vAfR334tVXX3U9jouL08KFC8tNziUpNjZWN954o/773/9q6dKlHvcRFxfnem8LCwu97koPAAB+UyNa0O106tQpLV68WImJiUpJSVGDBg106623KjQ0tERZ0zS1bds2bd26VYcPH1ZGRoZiYmLUoEEDnX/++V51sfe3/fv3a+XKlTp06JCcTqeaN2+uwYMHq06dOhWuMy8vT0uXLtXevXt1/PhxRUVFqWnTprrkkktUr169Cte7e/duLV++XImJiYqLi1OLFi00cOBARUVFVbhOO+Xn52vx4sXas2ePTpw4obp166pXr17q3bt3QKbHyszM1M8//6yDBw8qKSnJ9Z4OGDDAq5GcPSksLNTy5cu1e/duHT16VJGRkRo6dKg6dOjgh+h9j2XVqlXasWOHjh07ptDQUDVu3FgXX3yxmjZt6pd9bNu2TWvXrtXhw4cVGRmp1q1ba+DAgYqJifFL/VbIzMzUkiVLdODAAZ08eVK1a9d2nauVvZe6iBV/Yzz55JNPXI+vuOIKhYeHW7avevXq6YMPPlDPnj01btw4SWe+b7fccov279/v9XGuWLFC27dvdz0fM2aM2rVrp//85z+SpK+++kqnTp3y6nM5efKkVq5c6VZXixYtfDksr1vCr7nmGk2fPl3SmUH5XnrpJZ+74gMAUKOZcBk7dqwpybV4U27s2LGmaZrm0aNHzZtuuskMDw93q0OSmZKS4to2Ly/P/Oqrr8wbbrjBjI+PL1G2+NKxY0fzo48+MgsLC72Kv2XLlq5tP/zwQ5/K7dy50xwyZIhpGEaJOJxOp/mnP/3JTEtL8yqOIseOHTPvvvtuMy4urtTjczqd5pVXXmnu3LnTp3q3bt1qXnLJJaXWGRcXZz7yyCNmTk6OT++Jr4rvs+g7UJoPP/zQVa5ly5amaZpmYWGh+eqrr5qNGjUq9Rg6dOhg/vDDD2XW+dRTT5X7vSltKc+ePXvMG2+80YyIiCh12/DwcPPWW281jxw54vF9WbhwYYn9FhYWmpMmTTKbNWtWou7XXnvNXLp0qdtrCxYs8Lif4u655x7Xts2aNTMLCgrKLJuWlmY+/vjjZr169Uo9VsMwzP79+5u//PKLV/suvu3ChQtN0zTNlStXmhdeeGGp9UdGRppPPPGEmZubW2p9+/bt8/mzPft7Xdpn4Mnhw4fNW2+91YyMjCx1H6GhoebIkSO9Plft+hvjjfz8fLfPe8aMGV5td/Z5tm/fPp/3/fvf/96tjqeeesrrbe+66y7XdhdddJFpmqaZmZlpxsbGul7/v//7P6/qWr9+vVsc77zzjs/H4q2MjAwzLCzMta/58+dbti8AAKojEvRiKpqgr1mzxmzYsGGZP6CLJ+ibNm3y+Qf4jTfe6Eo4y1PRBP377793+9FX1tKnTx8zPT3dq/fyP//5j1d1FiWAc+bM8breshLJ4ssFF1xgnjp1KugS9JycHHP48OEe43c6neann35aap3+TNDff/99tx/T5S116tQxV65cWe77cnZymJubaw4bNqzMOl977TXTNE2zdevWrtf+8Ic/eHz/i+Tl5bklX48++miZZVevXl3mRZGzF4fD4VUSU3ybhQsXmh9++KFX7+eIESPM/Pz8EvUFIkGfN2+eGRMT49W+wsLCzOnTp3us046/Md5avny52z68udBkmv5J0JOSktz+XtWuXbvMizPFZWZmmrVq1XJt9/bbb7vWFf//T58+fbyK4+yLYK+//rrPx+KLvn37uvb18MMPW7ovAACqG7q4V1JKSopGjRqlY8eOKSIiQldeeaUuvPBCxcXF6ejRo5o7d26Z3ZVjYmLUr18/nXvuuWrUqJGioqJ04sQJrVq1SnPnznWNnvvpp5+qcePGmjRpkt/j37Ztm8aNG6fTp0+rQYMGGjVqlLp27arw8HBt27ZNU6dO1fHjxyWd6XL5xBNP6LXXXiu3ztmzZ+u6665zG9n44osv1qWXXqqmTZsqMzNTq1at0pdffqmsrCzl5ORo1KhRmjdvni655JIy6127dq2uvfZat1GFe/XqpZEjR6pJkyZKSkrS3LlztWzZMq1cuVL33HNPJd8d/7v33nv1zTffSJIGDhyoSy+9VI0aNdKpU6f0/fff68cff5R0ZkqoO++8U3379lWzZs3c6oiPj3fd/rBnzx7X602aNFFkZKTXsUyePFn333+/67nD4dCQIUPUv39/NWzYUGlpaVqyZInmzJmjgoICpaSk6LLLLtOqVavKnT+6uIcfftjVJffcc8/VFVdcoWbNmik9PV1r1651xTt69GjXtFFffvml3nrrLa+6If/www9KTk52PR89enSp5VasWKHLLrtM6enprtfOOeccDRs2TC1atFB+fr42bNigzz//XKmpqSosLNQ999yjuLg43XzzzV4d66JFi/T8888rPz9fLVu21DXXXKMOHTrIMAxt3LhRn3zyiWuWiDlz5mjy5Ml64IEH3OooPuNE8VklYmNj1aBBg1L3GxcX51V8pfn55581fPhw5eTkuF7r3bu3rrrqKtc59d1332nJkiWSpNzcXI0ZM0ZhYWEaNWqUV/uw4m+ML+bNm+d63LZtWzVq1MhvdXtSr1493Xzzzfr3v/8tSUpNTdUvv/yiCy+8sNztirqvS2e+E9dff71r3S233OIazHTFihXasWOHx/Oxfv36bs9//PHHEt89f+rXr5/rnvXi7z8AAPBCoK8QBJOKtKAXLT179jT37NnjcR+bNm0yu3btak6dOtXMyMgos1xiYqI5YMAAV/2GYZibN28ut+6KtKA7HA5TknnbbbeZp0+fLlH25MmT5rnnnusqHxoaaiYnJ5dZ98GDB83atWu7yjdp0sRcsmRJqWX37t1rdu3a1VW2TZs2Zb4n+fn5Zq9evdzejzfeeKPUsh999JEZEhLidnye3hNfFf/svW1BL4qlXr16ru7QZ/v444/dugD/+c9/9jqOsuoszS+//GKGhoa6tu3cubO5adOmUsuuXbvWbNq0qavshRdeWGY38rNbb6UzPSQ8tbpu27bNbZsvv/zSq+O46aabXNsk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DHFdyMnKynIbB8QKJ06c0B133KFx48a5XnM6nZo6dWqp0z4WHxwuKipKV155pc/7vPHGG12Pc3Nz3XqaSNLBgwf15z//2ee/x/v27XO7KBMdHe1Vwl28Z87ll1/u0z4BAKjpSNBtdNlll7kep6Sk6Pbbby/1x39OTo7+9re/6YUXXqgyI7gXefXVV11dIA8ePKjzzz/fY5f0wsJCLVu2THfccYdGjhxZapnrrrvO7d7NZ599Vm+99VapZadNm6Y///nPklTl3j9fFe9i/O6772rTpk1ebffuu++6Bldbu3atLrzwQrdWr9Lk5+frv//9r6677jrdd999FQ/aS8WnmTpx4oTuvfde1/OEhASvbxN54oknXK1+qamp6tevnz777DOPLcYbNmzQQw89pPPPP78C0Vde8c92z549evPNN/06j/fdd9/tdv/yww8/rA8++KDUsl9//bVuu+021/O6devq8ccf91ssVqpbt64uvvhi13Mrbn05dOiQvvjiC91xxx1q3ry52/toGIZef/11XXHFFSW2O3XqlL766ivX8+HDh1doSrLOnTurW7durudnjwifm5ur119/XW3atNFdd93lumWkPPPnz9cll1ziNof7uHHjyh2UUZK2bdvmGu/B4XBoxIgRvhwKAAA1HqO42+jcc8/VoEGDXIPFzZw5U6tWrdKNN96oDh06KC8vT9u3b9esWbN06NAhSdLTTz+tJ598MpBh+6Rly5aaMWOGrrrqKmVnZ+vgwYMaMmSIunbtqssuu0xt27ZVTEyMMjIydPz4cW3cuFHLly93teyUdU+x0+nUv/71L1188cXKzMyUaZq677779OGHH2rkyJFq0qSJkpKS9M033+jnn3+WdCbB++mnn3TgwAHbjt9uY8eO1XvvvSfpzCBo3bt3V5MmTVS3bl23ixPr16932653795699139Yc//EGFhYXatGmTzj//fJ1//vkaMGCAWrZsqaioKJ0+fVpHjhzRhg0btHz5cqWkpLj2a7X27dvr/PPPd7V47tmzx7XOm9bzIrVq1dKXX36pgQMHKiUlRSdPntSNN96ov/3tbxoyZIg6d+6suLg4ZWVlKTk5WZs3b9bKlStd35tAjUDdp08fdezYUTt27JAkPfDAAxo/frxatGjhdn/6s88+W6EkKCoqSh999JEuvfRS5eTkqKCgQHfccYfeffddXXXVVWrSpImSk5P13XffadGiRa7tHA6H/u///k8NGzas9DHaZfTo0a5W3dmzZ+uZZ57xuY4BAwaUGPMhLS1Np06dKvPCSaNGjfTOO++UeeHxs88+c5svvCLd24tvW3SBbt26ddq4cWOJqdoyMzP1r3/9S//617/UqFEjXXjhherevbvq16+v6Ohopaena9euXZo/f36JHki9evXS+PHjPcYxa9Ys1+NBgwapSZMmFT4mAABqJBMuY8eONSW5Fm/KjR071qd9HD582GzevLnbfspaxo4daxYWFrq9tnDhwjLrbtmypavchx9+WOlyxX344YeubVq2bOmx/PLly83GjRt7dZzFl0GDBpVb77fffmuGh4d7rKdPnz5mWlpahY7VG2d/TmXx9X0r4kvc48eP9/h+lGXOnDlmXFycz5/T73//+1LrW7hwoVf79dYbb7xRYt+GYZgHDhzwua4dO3aYHTt29PlY27RpU2ad3p6bxT311FOubS655JJyy65cudKMj48vN76zvx++fgY//vijGRMT49V7ERoaak6bNs1jnXb8jfHFqVOn3I5x69atHrcp/jn5urRq1cp88cUXzVOnTpW7jz59+ri2iY2NNbOysip8jLt373aL4cEHH3St279/vxkSElLh4xk6dKh58uRJr+Lo1q2ba7sZM2ZU+HgAAKipqnf/3yDUtGlT/fLLL7r++uvL7H7drl07TZkyRVOmTJFhGDZH6B99+vTRrl279Pzzz7vde1+ayMhIDRkyRO+9955bd8/SDBs2TGvXri3zPsi4uDg98sgjWrx4sWtwsOpuwoQJWrJkiW6//XZ16dJFcXFxXnftv/LKK7Vnzx49+uijql+/frll4+LidNVVV2n69Oll3l7gbzfeeGOJUa8vvvhitWjRwue6OnTooI0bN+rtt98uMXXf2UJDQ9W/f39NmjRJK1as8Hlf/nL++edr8+bNevrpp9WvXz/Vr19fYWFhft3HZZddpu3bt+uWW25RREREqWVCQ0M1cuRIbd68WTfffLNf92+HuLg4ty76ZXXl94XT6VR0dLSaNWum8847T6NHj9Y//vEPrVmzRvv27dPjjz+uuLi4Mrffvn2723frqquuKvP990bbtm3dRqyfNm2aa0C8li1b6tixY/rwww913XXXedX7ISQkRMOGDdPXX3+t7777zqs571evXu1qxW/a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2ZeLABU/Fu9s27ZNpnnmrv2EhIQyyxWt27p1q9d1F3f99derTp06rlHYR40apW+//bbM8kX7adiwoerXr19qmfr166tBgwYVjosEHQAAAACsZkPLs10qnPB7Wf+RI0dcj5s0aVJmuaJ1xcv7YvXq1SosLJTT6dSvv/6qWbNmafjw4br++utdLeWlxVVeTJWNiwQdAAAAACxmKFi6rQeuS7y3GXp6errrcVRUVJnlitb5cq93RESE7rnnHi1ZskRpaWk6deqUMjMztXnzZt1yyy2SpC+++EL33XdfmXGVF1NF4ypCgg4AAAAAFsvKypPnrut2dFu3r0v82cebl1cQuA/gfxo1aqS33npLF198sWJjY12vd+3aVR9//LEeeughSdL777+vHTt22B5fiOcivlmwYIHf6mLqNQAAAADVQVRU2JlW5Brk7OMNC/Uu/YyJiXE9zszMVFxcXKnlMjMzJckt0a6sZ599Vu+8846ysrL0zTffqGPHjiXiKtpvWSoTl98T9DfeeON/V0sqjwQdAAAAQHXhcNSwDP1sXh5+8Xu8ExMTy0zQExMTJck1F7k/REdHq2vXrvrll1+0d+/eUuMq2m9ZKhOX3xP0skazk6S0tDTl5ORIkpxOp+uNTktLU0HBme4OERERfr0CAgAAAAABZ5i+DGReo3Xq1EmGYcg0TW3ZskWdOnUqtdyWLVskSV26dLElrqL9HDt2TMnJyapXr16JMklJSTp+/HiF4/J7gv7++++X+vo333yjf//73+revbuuvfZadenSRaGhoZKk/Px8bd26VV988YW2bt2qq6++WldccYW/QwMAAACAgDBMQwYZuldiYmJ0/vnna+XKlfr+++81atSoEmUOHz7smsZs8ODBftt3RkaGK/Fv3bq127p+/fopLCxMubm5+uGHHzR69OgS2//444+SpPDwcPXr18/n/dsySNzatWv1/vvvq2/fvnr22WfVo0cPV3IuSSEhIerevbuee+459e3bV//617+0bt06O0IDAAAAAOv5eUC2SkyrXuGl0nH78HYVJb8zZszQoUOHSqx/+eWXZZqmmjRpooEDB3pdb9H86mV5+umnlZWVJcMwNHz4cLd1cXFxrtcmTZrk6gVeJD8/X5MmTZIkjRgxokI9w21J0L/66itJ0u9//3uP96ffdtttkqTZs2dbHBUAAAAA2MSQXzP0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qVOn6tZbb1WXLl0UHR2tiIgItWrVSjfffLN++umncre/7bbbPB57QkJChWKTbGpB/93vfqff/e53kqRff/1VmzZt0ubNm7V582alpKRo165d2rVrl7766is5HA61adNG3bp109ixY+0IDwAAAAAsFRbmqFEt6KUdq9Pp2xuwZcsWDRo0SMePH5ckxcbGKjU1VfPmzdO8efM0btw4vfHGGz7V2bt3b+3evdv1PCIiQk6nUwcOHNCBAwc0Y8YMPfLII3rllVfKrSciIkK1atUqdV29evV8iqk4W1rQi2vatKmGDh2qRx55RFOmTNE777yje+65R/3791edOnVUUFDgStYBAAAAoDowDIccDqPMJdAt3lYtxY/Rl3nQc3JyNGLECB0/flwJCQlav3690tLSlJaWpgkTJsgwDL355pv68MMPffoc8vLy1L17d7355pvavXu3srKylJ6erh07duiaa66RJL366qt69913y63nhhtu0NGjR0tdFi1a5FNMxdmeoJcIwOFwLVVtVEMAAAAA8IeiQeSq21JR7733nvbu3auoqCh9++236tGjhyQpKipK48eP1z333CNJeuKJJ5SXl+d1vR9//LE2bNig+++/X23btv3fe2+oQ4cO+uKLLzRgwABJ8tiCbhXbp1k7evSoWxf3EydOSDozx57T6VT79u3VrVs3devWze7QAAAAAMAiZo3q4l4aX45/6tSpkqSbbrqp1Gm5H3vsMb399ttKTEzUwoULNWTIEK/q7d+/f5nrHA6Hxo4dq0WLFmnv3r1KSUlRnTp1vA/aD2xJ0OfNm1dqQu5wONSuXTu3KdgiIyPtCAkAAAAAbOS/edBN38da8yurLzSkp6dr9erVkqShQ4eWWqZFixbq3Lmztm7dqvnz53udoHtS/P7x/Px8v9TpC1sS9MmTJ7vuQWjXrp3bFGsk5AAAAADgvereEr9t2zaZ/7sKUd6I6AkJCdq6dau2bt3qt30vXrxYktSwYcNyB3ubP3++2rdvr4MHDyoiIkLt2rXTsGHDdN9996lhw4YV3r9t96CbpqmwsDDFxMQoNjZWMTExCg8Pt2v3AAAAABAwgb4XPFgWbxw5csT1uEmTJmWWK1pXvHxlHD582DU4XNF0auWV3b9/v6Kjo5Wenq61a9dqwoQJ6tKli+bPn1/hGGxpQb/tttu0efNmbd26VevWrdP6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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "image/png": { - "height": 300, - "width": 500 - } - }, - "output_type": "display_data" + "name": "stdout", + "output_type": "stream", + "text": [ + "iia: 0.000%\n", + "layer: 0, position: 1\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 100/100 [00:09<00:00, 10.97it/s, loss=1.268]\n", + "100%|██████████| 50/50 [00:03<00:00, 13.35it/s]\n" + ] }, { "name": "stdout", "output_type": "stream", "text": [ - "\n" + "iia: 98.000%\n", + "layer: 0, position: 2\n" ] - } - ], - "source": [ - "df = pd.read_csv(f\"./tutorial_data/pyvene_gender_das.csv\")\n", - "df[\"layer\"] = df[\"layer\"].astype(int)\n", - "df[\"pos\"] = df[\"position\"].astype(int)\n", - "df[\"IIA\"] = df[\"iia\"].astype(float)\n", - "\n", - "custom_labels = [\"EOS\", \"\", \"walked\", \"because\"]\n", - "breaks = [0, 1, 2, 3]\n", - "\n", - "plot = (\n", - " ggplot(df, aes(x=\"layer\", y=\"pos\")) \n", - "\n", - " + geom_tile(aes(fill=\"IIA\"))\n", - " + scale_fill_cmap(\"Purples\") + xlab(\"layers\")\n", - " + scale_y_reverse(\n", - " limits = (-0.5, 3.5), \n", - " breaks=breaks, labels=custom_labels) \n", - " + theme(figure_size=(5, 3)) + ylab(\"\") \n", - " + theme(axis_text_y = element_text(angle = 90, hjust = 1))\n", - " + ggtitle(\"Trained Intervention (DAS)\")\n", - ")\n", - "ggsave(\n", - " plot, filename=f\"./tutorial_data/pyvene_gender_das.pdf\", dpi=200\n", - ")\n", - "print(plot)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Probing\n", - "\n", - "We'll define a dummy intervention `CollectActivation` to collect activations and train a simple probe." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "def probing_config(model_type, intervention_type, layer, num_dims=1):\n", - " \"\"\"Generate intervention config.\"\"\"\n", - "\n", - " # init\n", - " config = IntervenableConfig(\n", - " model_type=model_type,\n", - " representations=[\n", - " RepresentationConfig(\n", - " layer, # layer\n", - " intervention_type, # intervention type\n", - " ),\n", - " ],\n", - " intervention_types=[CollectIntervention],\n", - " interventions=[None],\n", - " )\n", - " return config" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This is the training loop." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# intervention settings\n", - "stats = []\n", - "num_layers = gpt.config.num_hidden_layers\n", - "\n", - "# loop over layers and positions\n", - "with torch.no_grad():\n", - " for layer in range(num_layers):\n", - " for position in range(4):\n", - " print(f\"layer: {layer}, position: {position}\")\n", - "\n", - " # set up intervenable model\n", - " config = probing_config(type(gpt), \"block_output\", layer, 1)\n", - " intervenable = IntervenableModel(config, gpt)\n", - " intervenable.set_device(device)\n", - " intervenable.disable_model_gradients()\n", - "\n", - " # training loop\n", - " activations, labels = [], []\n", - " iterator = tqdm(trainset)\n", - " for example in iterator:\n", - " # forward pass\n", - " base_outputs, _ = intervenable(\n", - " example.base,\n", - " unit_locations={\"base\": position},\n", - " )\n", - " base_activations = base_outputs[1][0]\n", - "\n", - " src_outputs, _ = intervenable(\n", - " example.src,\n", - " unit_locations={\"base\": position},\n", - " )\n", - " src_activations = src_outputs[1][0]\n", - " \n", - " # collect activation\n", - " activations.extend(\n", - " [base_activations.detach()[0].cpu().numpy(), src_activations.detach()[0].cpu().numpy()]\n", - " )\n", - " labels.extend([example.base_label, example.src_label])\n", - " \n", - " # train logistic regression\n", - " lr = LogisticRegression(random_state=42, max_iter=1000).fit(\n", - " activations, labels\n", - " )\n", - "\n", - " # eval\n", - " activations, labels = [], []\n", - " iterator = tqdm(evalset)\n", - " for example in iterator:\n", - " # forward pass\n", - " base_outputs, _ = intervenable(\n", - " example.base,\n", - " unit_locations={\"base\": position},\n", - " )\n", - " base_activations = base_outputs[1][0]\n", - "\n", - " src_outputs, _ = intervenable(\n", - " example.src,\n", - " unit_locations={\"base\": position},\n", - " )\n", - " src_activations = src_outputs[1][0]\n", - " \n", - " # collect activation\n", - " activations.extend(\n", - " [base_activations.detach()[0].cpu().numpy(), src_activations.detach()[0].cpu().numpy()]\n", - " )\n", - " labels.extend([example.base_label, example.src_label])\n", - "\n", - " # stats\n", - " acc = lr.score(activations, labels)\n", - " stats.append({\"layer\": layer, \"position\": position, \"acc\": acc})\n", - " print(f\"acc: {acc:.3%}\")\n", + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 100/100 [00:09<00:00, 10.93it/s, loss=4.130]\n", + "100%|██████████| 50/50 [00:03<00:00, 13.28it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "iia: 0.000%\n", + "layer: 0, position: 3\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 100/100 [00:09<00:00, 10.83it/s, loss=4.276]\n", + "100%|██████████| 50/50 [00:03<00:00, 13.28it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "iia: 0.000%\n", + "layer: 1, position: 0\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 100/100 [00:09<00:00, 10.94it/s, loss=4.355]\n", + "100%|██████████| 50/50 [00:03<00:00, 13.20it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "iia: 0.000%\n", + "layer: 1, position: 1\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 100/100 [00:09<00:00, 10.93it/s, loss=1.231]\n", + "100%|██████████| 50/50 [00:03<00:00, 13.20it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "iia: 100.000%\n", + "layer: 1, position: 2\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 100/100 [00:09<00:00, 10.94it/s, loss=4.422]\n", + "100%|██████████| 50/50 [00:03<00:00, 13.19it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "iia: 0.000%\n", + "layer: 1, position: 3\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 100/100 [00:09<00:00, 10.92it/s, loss=4.308]\n", + "100%|██████████| 50/50 [00:03<00:00, 13.13it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "iia: 0.000%\n", + "layer: 2, position: 0\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 100/100 [00:08<00:00, 11.26it/s, loss=4.355]\n", + "100%|██████████| 50/50 [00:03<00:00, 13.30it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "iia: 0.000%\n", + "layer: 2, position: 1\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 100/100 [00:08<00:00, 11.27it/s, loss=1.305]\n", + "100%|██████████| 50/50 [00:03<00:00, 12.93it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "iia: 98.000%\n", + "layer: 2, position: 2\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 100/100 [00:08<00:00, 11.28it/s, loss=1.938]\n", + "100%|██████████| 50/50 [00:03<00:00, 13.27it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "iia: 16.000%\n", + "layer: 2, position: 3\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 100/100 [00:08<00:00, 11.24it/s, loss=2.408]\n", + "100%|██████████| 50/50 [00:03<00:00, 13.02it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "iia: 10.000%\n", + "layer: 3, position: 0\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 100/100 [00:08<00:00, 11.40it/s, loss=4.355]\n", + "100%|██████████| 50/50 [00:03<00:00, 13.34it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "iia: 0.000%\n", + "layer: 3, position: 1\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 100/100 [00:08<00:00, 11.37it/s, loss=3.477]\n", + "100%|██████████| 50/50 [00:03<00:00, 13.22it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "iia: 52.000%\n", + "layer: 3, position: 2\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 100/100 [00:08<00:00, 11.34it/s, loss=2.225]\n", + "100%|██████████| 50/50 [00:03<00:00, 13.22it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "iia: 6.000%\n", + "layer: 3, position: 3\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 100/100 [00:08<00:00, 11.42it/s, loss=1.945]\n", + "100%|██████████| 50/50 [00:03<00:00, 13.32it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "iia: 10.000%\n", + "layer: 4, position: 0\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 100/100 [00:08<00:00, 11.59it/s, loss=4.355]\n", + "100%|██████████| 50/50 [00:03<00:00, 13.33it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "iia: 0.000%\n", + "layer: 4, position: 1\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 100/100 [00:08<00:00, 11.62it/s, loss=4.355]\n", + "100%|██████████| 50/50 [00:03<00:00, 13.38it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "iia: 0.000%\n", + "layer: 4, position: 2\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 100/100 [00:08<00:00, 11.67it/s, loss=4.034]\n", + "100%|██████████| 50/50 [00:03<00:00, 13.40it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "iia: 0.000%\n", + "layer: 4, position: 3\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 100/100 [00:08<00:00, 11.76it/s, loss=1.062]\n", + "100%|██████████| 50/50 [00:03<00:00, 13.25it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "iia: 98.000%\n", + "layer: 5, position: 0\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 100/100 [00:08<00:00, 11.70it/s, loss=4.355]\n", + "100%|██████████| 50/50 [00:03<00:00, 13.22it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "iia: 0.000%\n", + "layer: 5, position: 1\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 100/100 [00:08<00:00, 11.39it/s, loss=4.355]\n", + "100%|██████████| 50/50 [00:03<00:00, 12.83it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "iia: 0.000%\n", + "layer: 5, position: 2\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 100/100 [00:08<00:00, 11.81it/s, loss=4.355]\n", + "100%|██████████| 50/50 [00:03<00:00, 13.43it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "iia: 0.000%\n", + "layer: 5, position: 3\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 100/100 [00:08<00:00, 11.44it/s, loss=1.113]\n", + "100%|██████████| 50/50 [00:03<00:00, 13.33it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "iia: 98.000%\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "# intervention settings\n", + "stats = []\n", + "num_layers = gpt.config.num_hidden_layers\n", + "\n", + "# loop over layers and positions\n", + "for layer in range(num_layers):\n", + " for position in range(4):\n", + " print(f\"layer: {layer}, position: {position}\")\n", + "\n", + " # set up intervenable model\n", + " config = intervention_config(\"block_output\", layer, 1)\n", + " intervenable = pv.IntervenableModel(config, gpt)\n", + " intervenable.set_device(device)\n", + " intervenable.disable_model_gradients()\n", + "\n", + " # set up optimizer\n", + " optimizer_params = []\n", + " for k, v in intervenable.interventions.items():\n", + " try:\n", + " optimizer_params.append({\"params\": v[0].rotate_layer.parameters()})\n", + " except:\n", + " pass\n", + " optimizer = torch.optim.Adam(optimizer_params, lr=1e-3)\n", + " scheduler = get_linear_schedule_with_warmup(\n", + " optimizer,\n", + " num_warmup_steps=int(0.1 * total_steps),\n", + " num_training_steps=total_steps,\n", + " )\n", + "\n", + " # training loop\n", + " iterator = tqdm(trainset)\n", + " for example in iterator:\n", + " # forward pass\n", + " _, counterfactual_outputs = intervenable(\n", + " example.base,\n", + " [example.src],\n", + " {\"sources->base\": position},\n", + " )\n", + "\n", + " # loss\n", + " logits = counterfactual_outputs.logits[:, -1]\n", + " loss = calculate_loss(logits, torch.tensor([example.src_label]).to(device))\n", + " iterator.set_postfix({\"loss\": f\"{loss.item():.3f}\"})\n", + "\n", + " # backward\n", + " loss.backward()\n", + " optimizer.step()\n", + " scheduler.step()\n", + "\n", + " # eval\n", + " with torch.no_grad():\n", + " iia = 0\n", + " iterator = tqdm(evalset)\n", + " for example in iterator:\n", + " # forward\n", + " _, counterfactual_outputs = intervenable(\n", + " example.base,\n", + " [example.src],\n", + " {\"sources->base\": position},\n", + " )\n", + "\n", + " # calculate iia\n", + " logits = counterfactual_outputs.logits[0, -1]\n", + " if logits[example.src_label] > logits[example.base_label]:\n", + " iia += 1\n", + "\n", + " # stats\n", + " iia = iia / len(evalset)\n", + " stats.append({\"layer\": layer, \"position\": position, \"iia\": iia})\n", + " print(f\"iia: {iia:.3%}\")\n", + "df = pd.DataFrame(stats)\n", + "df.to_csv(f\"./tutorial_data/pyvene_gender_das.csv\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And this is the plot of IIA. In layers 2 and 3 it seems the gender is represented across positions 1-3, and entirely in position 3 in later layers." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/aryamanarora/opt/miniconda3/lib/python3.9/site-packages/plotnine/ggplot.py:718: PlotnineWarning: Saving 5 x 3 in image.\n", + "/Users/aryamanarora/opt/miniconda3/lib/python3.9/site-packages/plotnine/ggplot.py:719: PlotnineWarning: Filename: ./tutorial_data/pyvene_gender_das.pdf\n" + ] + }, + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " 2024-01-30T14:28:26.465251\n", + " image/svg+xml\n", + " \n", + " \n", + " Matplotlib v3.5.2, https://matplotlib.org/\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n" + ], + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "df = pd.read_csv(f\"./tutorial_data/pyvene_gender_das.csv\")\n", + "df[\"layer\"] = df[\"layer\"].astype(int)\n", + "df[\"pos\"] = df[\"position\"].astype(int)\n", + "df[\"IIA\"] = df[\"iia\"].astype(float)\n", + "\n", + "custom_labels = [\"EOS\", \"\", \"walked\", \"because\"]\n", + "breaks = [0, 1, 2, 3]\n", + "\n", + "plot = (\n", + " ggplot(df, aes(x=\"layer\", y=\"pos\")) \n", + " + geom_tile(aes(fill=\"IIA\"))\n", + " + scale_fill_cmap(\"Purples\") + xlab(\"layers\")\n", + " + scale_y_reverse(\n", + " limits = (-0.5, 3.5), \n", + " breaks=breaks, labels=custom_labels) \n", + " + theme(figure_size=(5, 3)) + ylab(\"\") \n", + " + theme(axis_text_y = element_text(angle = 90, hjust = 1))\n", + " + ggtitle(\"Trained Intervention (DAS)\")\n", + ")\n", + "ggsave(\n", + " plot, filename=f\"./tutorial_data/pyvene_gender_das.pdf\", dpi=200\n", + ")\n", + "print(plot)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Probing\n", + "\n", + "We'll define a dummy intervention `CollectActivation` to collect activations and train a simple probe." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "def probing_config(intervention_site, layer):\n", + " \"\"\"Generate intervention config.\"\"\"\n", + "\n", + " # init\n", + " config = pv.IntervenableConfig([{\n", + " \"layer\": layer,\n", + " \"component\": intervention_site,\n", + " \"intervention_type\": pv.CollectIntervention,\n", + " }])\n", + " return config" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This is the training loop." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "layer: 0, position: 0\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 100/100 [00:11<00:00, 8.98it/s]\n", + "100%|██████████| 50/50 [00:05<00:00, 9.12it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "acc: 50.000%, f1: 0.000\n", + "layer: 0, position: 1\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 100/100 [00:10<00:00, 9.12it/s]\n", + "100%|██████████| 50/50 [00:05<00:00, 9.12it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "acc: 100.000%, f1: 1.000\n", + "layer: 0, position: 2\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 100/100 [00:10<00:00, 9.12it/s]\n", + "100%|██████████| 50/50 [00:05<00:00, 9.24it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "acc: 99.000%, f1: 0.990\n", + "layer: 0, position: 3\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 100/100 [00:10<00:00, 9.23it/s]\n", + "100%|██████████| 50/50 [00:05<00:00, 9.34it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "acc: 88.000%, f1: 0.875\n", + "layer: 1, position: 0\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 100/100 [00:11<00:00, 9.09it/s]\n", + "100%|██████████| 50/50 [00:05<00:00, 8.95it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "acc: 50.000%, f1: 0.000\n", + "layer: 1, position: 1\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 100/100 [00:10<00:00, 9.13it/s]\n", + "100%|██████████| 50/50 [00:05<00:00, 9.28it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "acc: 100.000%, f1: 1.000\n", + "layer: 1, position: 2\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 100/100 [00:10<00:00, 9.45it/s]\n", + "100%|██████████| 50/50 [00:05<00:00, 9.35it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "acc: 97.000%, f1: 0.971\n", + "layer: 1, position: 3\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 100/100 [00:10<00:00, 9.50it/s]\n", + "100%|██████████| 50/50 [00:05<00:00, 9.53it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "acc: 96.000%, f1: 0.962\n", + "layer: 2, position: 0\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 100/100 [00:10<00:00, 9.33it/s]\n", + "100%|██████████| 50/50 [00:05<00:00, 9.19it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "acc: 50.000%, f1: 0.000\n", + "layer: 2, position: 1\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 100/100 [00:10<00:00, 9.59it/s]\n", + "100%|██████████| 50/50 [00:05<00:00, 9.85it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "acc: 100.000%, f1: 1.000\n", + "layer: 2, position: 2\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 100/100 [00:10<00:00, 9.86it/s]\n", + "100%|██████████| 50/50 [00:05<00:00, 9.76it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "acc: 100.000%, f1: 1.000\n", + "layer: 2, position: 3\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 100/100 [00:10<00:00, 9.92it/s]\n", + "100%|██████████| 50/50 [00:05<00:00, 9.84it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "acc: 100.000%, f1: 1.000\n", + "layer: 3, position: 0\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 100/100 [00:10<00:00, 9.82it/s]\n", + "100%|██████████| 50/50 [00:05<00:00, 9.85it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "acc: 50.000%, f1: 0.000\n", + "layer: 3, position: 1\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 100/100 [00:10<00:00, 9.84it/s]\n", + "100%|██████████| 50/50 [00:05<00:00, 9.80it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "acc: 100.000%, f1: 1.000\n", + "layer: 3, position: 2\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 100/100 [00:10<00:00, 9.89it/s]\n", + "100%|██████████| 50/50 [00:05<00:00, 9.91it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "acc: 100.000%, f1: 1.000\n", + "layer: 3, position: 3\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 100/100 [00:10<00:00, 9.92it/s]\n", + "100%|██████████| 50/50 [00:05<00:00, 9.72it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "acc: 100.000%, f1: 1.000\n", + "layer: 4, position: 0\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 100/100 [00:10<00:00, 9.81it/s]\n", + "100%|██████████| 50/50 [00:05<00:00, 9.82it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "acc: 50.000%, f1: 0.000\n", + "layer: 4, position: 1\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 100/100 [00:10<00:00, 9.32it/s]\n", + "100%|██████████| 50/50 [00:05<00:00, 8.99it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "acc: 100.000%, f1: 1.000\n", + "layer: 4, position: 2\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 100/100 [00:10<00:00, 9.29it/s]\n", + "100%|██████████| 50/50 [00:05<00:00, 9.74it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "acc: 100.000%, f1: 1.000\n", + "layer: 4, position: 3\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 100/100 [00:11<00:00, 8.88it/s]\n", + "100%|██████████| 50/50 [00:05<00:00, 8.88it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "acc: 100.000%, f1: 1.000\n", + "layer: 5, position: 0\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 100/100 [00:10<00:00, 9.12it/s]\n", + "100%|██████████| 50/50 [00:05<00:00, 9.51it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "acc: 50.000%, f1: 0.000\n", + "layer: 5, position: 1\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 100/100 [00:10<00:00, 9.46it/s]\n", + "100%|██████████| 50/50 [00:05<00:00, 9.20it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "acc: 100.000%, f1: 1.000\n", + "layer: 5, position: 2\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 100/100 [00:10<00:00, 9.31it/s]\n", + "100%|██████████| 50/50 [00:05<00:00, 8.73it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "acc: 100.000%, f1: 1.000\n", + "layer: 5, position: 3\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 100/100 [00:10<00:00, 9.19it/s]\n", + "100%|██████████| 50/50 [00:05<00:00, 9.43it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "acc: 100.000%, f1: 1.000\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "# intervention settings\n", + "stats = []\n", + "num_layers = gpt.config.num_hidden_layers\n", + "\n", + "# 344 = \" he\", 703 = \" she\"\n", + "label_mapping = {344: 0, 703: 1}\n", + "\n", + "# loop over layers and positions\n", + "with torch.no_grad():\n", + " for layer in range(num_layers):\n", + " for position in range(4):\n", + " print(f\"layer: {layer}, position: {position}\")\n", + "\n", + " # set up intervenable model\n", + " config = probing_config(\"block_output\", layer)\n", + " intervenable = pv.IntervenableModel(config, gpt)\n", + " intervenable.set_device(device)\n", + " intervenable.disable_model_gradients()\n", + "\n", + " # training loop\n", + " activations, labels = [], []\n", + " iterator = tqdm(trainset)\n", + " for example in iterator:\n", + " # forward pass\n", + " base_outputs, _ = intervenable(\n", + " example.base,\n", + " unit_locations={\"base\": position},\n", + " )\n", + " base_activations = base_outputs[1][0]\n", + "\n", + " src_outputs, _ = intervenable(\n", + " example.src,\n", + " unit_locations={\"base\": position},\n", + " )\n", + " src_activations = src_outputs[1][0]\n", + " \n", + " # collect activation\n", + " activations.extend(\n", + " [base_activations.detach()[0].cpu().numpy(), src_activations.detach()[0].cpu().numpy()]\n", + " )\n", + " labels.extend([example.base_label, example.src_label])\n", + " labels = [label_mapping[label] for label in labels]\n", + " \n", + " # train logistic regression\n", + " lr = LogisticRegression(random_state=42, max_iter=1000).fit(\n", + " activations, labels\n", + " )\n", + "\n", + " # eval\n", + " activations, labels = [], []\n", + " iterator = tqdm(evalset)\n", + " for example in iterator:\n", + " # forward pass\n", + " base_outputs, _ = intervenable(\n", + " example.base,\n", + " unit_locations={\"base\": position},\n", + " )\n", + " base_activations = base_outputs[1][0]\n", + "\n", + " src_outputs, _ = intervenable(\n", + " example.src,\n", + " unit_locations={\"base\": position},\n", + " )\n", + " src_activations = src_outputs[1][0]\n", + " \n", + " # collect activation\n", + " activations.extend(\n", + " [base_activations.detach()[0].cpu().numpy(), src_activations.detach()[0].cpu().numpy()]\n", + " )\n", + " labels.extend([example.base_label, example.src_label])\n", + " labels = [label_mapping[label] for label in labels]\n", + "\n", + " # stats\n", + " acc = lr.score(activations, labels)\n", + " f1 = f1_score(labels, lr.predict(activations))\n", + " stats.append({\"layer\": layer, \"position\": position, \"acc\": acc, \"f1\": f1})\n", + " print(f\"acc: {acc:.3%}, f1: {f1:.3f}\")\n", "df = pd.DataFrame(stats)\n", "df.to_csv(f\"./tutorial_data/pyvene_gender_probe.csv\")" ] @@ -787,30 +4319,2872 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 27, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "/u/nlp/anaconda/main/anaconda3/envs/wuzhengx-bootleg/lib/python3.8/site-packages/plotnine/ggplot.py:587: PlotnineWarning: Saving 5 x 3 in image.\n", - "/u/nlp/anaconda/main/anaconda3/envs/wuzhengx-bootleg/lib/python3.8/site-packages/plotnine/ggplot.py:588: PlotnineWarning: Filename: ./tutorial_data/pyvene_gender_probe.pdf\n" + "/Users/aryamanarora/opt/miniconda3/lib/python3.9/site-packages/plotnine/ggplot.py:718: PlotnineWarning: Saving 5 x 3 in image.\n", + "/Users/aryamanarora/opt/miniconda3/lib/python3.9/site-packages/plotnine/ggplot.py:719: PlotnineWarning: Filename: ./tutorial_data/pyvene_gender_probe.pdf\n" ] }, { "data": { - "image/png": "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5IjCw8N12WWX6ayzzlJMTIwOHz6suXPnyjCMcreNjo7Wueeeq759+6pp06aKjIzUsWPHtHr1as2dO1c5OTmSpI8//ljNmjXT1KlTvV7/li1bdNdddykjI0ONGzfWqFGj1K1bN4WFhWnLli2aMWOGa6Krn376SRMnTtTzzz9faZ9ffvmlrrrqKuXn57teGzhwoC688EI1b95cWVlZWr16tT7//HNlZ2crNzdXo0aN0vz583X++edX2O+6des0evRo189Fknr37u0atpyUlKS5c+dqxYoVWrVqlcaNG1fDn469ZWVl6fLLL9evv/6q8PBwjRgxQgMGDFC9evV04MABffrpp9q0aZOkU0OIb7jhBq1atUoOR8VTT+zYsUMDBw7U4cOHXa916tRJI0aMUPv27eVwOJSYmKhPPvnE1eapp55SdHS0/vOf/7hVd9u2bXXuueeqe/fuatCggQoLC7V37159//33WrNmjSQpJydHY8aMUfv27dWnTx+3+jVNU2PHjnX1ccEFF+iiiy5S06ZNlZKSouXLl/tluHTx88DpdFbadurUqXrzzTclSV26dNHIkSPVpk0b5ebmavPmzapXr56rrWmaGj16tL7++mvXa3Xr1tVVV12lM844QyEhIdq0aZM+/vhjHTt2TJK0bNkyXXTRRVq2bJnq1KnjVv3jxo3TypUrJUkDBgzQZZddpiZNmujIkSOaO3eufvrpJ0mnbim4/vrr1aRJk3Inzyte99VXX61Zs2a5XouOjtaIESN05plnuv638+uvv3bt95dfftGFF16o1atXKywszK26AQAAApKfPyCwlepcQS9aTj/9dPO3336rch8bN240u3XrZs6YMcPMzMyssN3BgwfNCy64wNW/YRjmpk2bKu27OlfQi4aWjh071szIyCjT9vjx42bfvn1LXCVLTk6usO+9e/ea9evXd7WPj483f/zxx3Lb7ty50+zWrZurbbt27Sr8meTn55u9e/cu8fN48cUXy2373nvvuYZRFx86W9uuoBcdW9++fV1Do4sr7yrlV199VWHfeXl5Zr9+/Vxt69SpY77++utmQUFBmbbp6enmX/7ylxK/FwkJCRX2PX78ePPaa681V61aVenPYd68eWZsbKyr3379+lXavvRVbUlmbGys+cMPP1S6XXVU5wp6UlJSidtGBg0aVGJ96SvoRb/bU6dOLffnXtxrr71WYruzzjrL3L9/f5l2x44dM4cNG1ai7YQJE9w6zqLfsZCQEHP69OkVti8+jL9Dhw5mdnZ2hf2/+OKLJWq58sorzaSkpHLbzpgxwwwNDXW1/de//lXpzwQAACDQEdCLqW5Ab9y4cYV/YJaWm5tb5R/eRU6cOGF27tzZtZ877rij0vbVCeiSzJEjR1ba77Zt20r8Af76669X2LZ4aKtfv765Y8eOSvs+dOhQiXvxX3755XLbzZw5s0TNEydOrLTfF154oUzwqW0BXb8PQa5syHJubq7Zvn17V/urr766wralA9+sWbMqrTk/P98cOHCgq/3o0aMrbFtZYCttwYIFJer4+eefK2xbOjQbhmEuWbLE7X15ojoBvXQYLR0wywvojz/+eJX95uTklLjHvm3btubx48crbJ+VlWX26tWrxIcvR44cces4JZkvvPBCpfWUPt9eeumlctslJyebkZGRrnYjRoyoco6NadOmudqHh4dX+gEhAABAoOMxa17wyCOPuD0beZ06dSodYlxcVFRUiWHD//vf/6pVX2VCQkL08ssvV9qmU6dOJYaer169utx2+/fv1+eff+76/sknn6xyJvqmTZtqwoQJru+nTZtWbrt33nnH9XXz5s1LbFOeO+64Q127dq20TW3wzDPPlBj2XFqdOnVKzCJe0XtnmqZefPFF1/dXXXWVRo0aVem+nU6nXnjhBdf3X331let2iNLCw8Mr7au4wYMHa9CgQa7vPfm9Hz16tM477zy32/vShg0b9NBDD5V47corr6x0m+bNm+vf//53lX1//vnnSk5Odn3/zDPPVPqkhYiICP3f//2f6/uTJ0/q7bffrnI/ktS1a1fdcccdlbYpfb4VP1+Le/PNN5WVlSVJioyM1FtvvVXhLUBFbrnlFvXs2VPSqVsf3n//fbfqBgAACEQE9BpyOp265pprfNb/kCFDXF/v2LFD6enpXu2/6L7wqgwYMMD19bZt28ptM2vWLNf9ttHR0frrX//qVg3XX3+96+uEhIQSwUM6da/1woULXd9fd911VQY+p9Opm266ya39B6q6detWGaKlku/drl27lJeXV6bNL7/8oq1bt7q+v/vuu92qoXfv3q5glpeXpx9//NGt7apS/Pd+7dq1bm9X/HfJHzIzM7Vu3To9+OCDOvvss0ucr5dffrn69etX6fZ/+ctfyn0kY2nz5s1zfd2oUSNdccUVVW4zcOBAdevWzfX9N998U+U2kvTXv/61ynvnS59vGzZs0L59+8q0+/jjj11fX3vttWrUqJFbNYwZM8b19YIFC9zaBgAAIBAR0Guoc+fONXpGeFWaNGni+to0TR08eNCr/ffv39+tdsWfHZ2amlpum+XLl7u+vuCCC9y+atqoUSO1adPG9X3RJF9F1q9fr4KCAtf3F110kVv9Dh061K12gap3795uTXpW/L0zTVNpaWll2hR/7+rVq6ezzjrL7TqKh87S7111Ff+9P3DggNvbeVJ3TQ0aNEiGYZRYoqOj1adPHz399NPKzs52te3evbvefffdKvt0t/7iIyGGDBni9uR3l1xyievrdevWlTivKuLueVS63c8//1zi+4yMDG3cuNH1/bBhw9zqV/LN7xgAAIAdMYt7DVU1hLsyq1ev1meffaa1a9fq119/VVpamjIzM2WaZoXblBeuaqJp06ZutYuKinJ9nZmZWW6bhIQE19ddunTxqI4mTZpo9+7dkk4NlS/u119/LfF98auAlencubOcTqdbISQQVee9k069f6VvySj+3nXq1Mnt2zCkkmG69HtXWlZWlr766it99913SkhI0P79+5WRkaHc3NwKt3H3dz4mJsbtW02sEhYWpptvvlmTJ09WdHR0le3d+d+TwsJC/fbbb67ve/To4XY9RUPFpVPvxYEDB9SqVasK2zudTnXu3Nmtvkufb6XP202bNqmwsND1vSf/G1H8d+zo0aPKy8tza6QBAABAoCGg11DdunU93ubXX3/VrbfeqiVLlni8bfFHjHmDJ/cGF6noA4SiRzlJ0rPPPqtnn322WjWVvkJf+nt3h8XWqVNH9erV0/Hjx6tVh91V572Tyn//ir93a9asqfK+4IpUNLpCkj744APdf//9SkpK8qhPd3/nq3Mu1kR8fLwiIiJc3xuGocjISNWrV08dO3ZU//79deWVV3r0oYE7x5CWllbiPXT3fCivbUpKSqUBvX79+m4H4dLnW0pKSon1xX/HJPc/aCtPamqqR8cNAAAQKAjoNeTpc5UTExN1/vnnl7nPWpLrj/vw8PASVzCLXy2r7Oq6v3nr6n7RJFJFil+xDwkJ8ehnHhkZWWsDujf56r0rMmXKFP3rX/8qd12DBg0UGRlZ4vnWGRkZrgnn3P2dt/oZ5x9++GGlz/uuDneOofQIlsjISLf7Lz2a4sSJE5W2L/4BhDuKn2+l+/bm6J+Kfs8AAAACHQHdQqZp6qabbnKFc8MwdP311+vaa69V37591bBhw3K38WS4sT9FRka6JsVq0KBBte/NL71d8VCRn5+v/Px8t8MYf8i7p3jIi4iIKHHfuifK2y4hIUEPPvig6/smTZro7rvv1rBhw9S1a9cSwbzIu+++6/Ykg8Gm9FB5T37HS4f7qobdF7+P3h3Fayndd+kPEtq0aVPl5HMVsfrDGAAAAKvwV46FfvrppxKTO7399ttVzjRe2ZBhu2nYsKEroI8bN05PPPGEV/qtX79+ie+TkpLUrFmzKrc7efKk1+/Zr62KfzjUp08fLV261Gt9v/LKK677kps2baq1a9dW+QFAIP3eWy0mJkYOh8N1P7cntwyUblvVh2ipqalu3+9d+nwr3XfpDyB/+OGHGs3hAQAAUBsFxqXZWqL4o8I6d+7s1mPAdu3a5cuSvOq0005zfe3JzNtV6dSpU4nvN2/e7NZ2W7durbUTxHmbr947qeTv/T333OPW1flA+r23msPhULt27VzfF5/gryrF20ZGRlb5iMWCgoISj9+rTOnzrfR5W/x3TPL+7xkAAEBtQEC3UPFHpPXq1cutbRYtWuSrcrzu/PPPd33tredhS9IZZ5xRYijs/Pnz3dru+++/91oNtV3x927Xrl3lPsO6umr7770/FH884oIFC5Sfn+/Wdt9++63r6z59+rg1xNzd86h0uzPPPLPE902aNCkR0qszSSYAAEBtR0C3UPHJrtyZmTo/P19vvPGGL0vyqlGjRrnul//tt99KhIGaiIyM1ODBg13ff/TRR5U+lks69Siq6dOne2X/weDMM88s8Sz6l19+2Wt9e/p7v2TJEm3atMlr+6+NLr30UtfXycnJ+uKLL6rcZvny5SV+rsX7qMy7775b4vFo5Sl9vvXq1UstWrQo0+6qq65yff3mm2/q5MmTbtUAAAAQLAjoFmrZsqXr6x9//LHKGZQfeeQRbd++3ddleU3Hjh115ZVXur6/7bbbdOTIEY/6qCjAFZ8wbP/+/Xr66acr7efVV191eyg8Tj3v+p///Kfr+xdeeMHjK5wVvXfFf+/nzZtXaR8ZGRm67bbbPNpvMBo1alSJx7f9+9//rvS+/ZycHN15552u7+vUqeP2JHybN2/Wq6++WmmbV155pcT59re//a3cdnfddZdrZvh9+/bprrvucquG4rz9qEkAAAA7IaBb6KKLLnJ9nZKSoptuuqncPzZzc3P14IMP6qmnngqYGdyLPPfcc2rQoIEkae/everXr1+VQ9ILCwu1YsUK3XzzzRo5cmS5ba666ir17t3b9f3jjz+uV155pdy2H374oe69915JCrifnz/deuutGjBggKRTE3796U9/0iuvvKK8vLxKt9u+fbseffTRCp+nXfz3/t1339Unn3xSbrudO3dqyJAh2rp1K+9bFerUqVNiEsZdu3bp0ksvLXE7QZGUlBSNGjVK69evd702fvx4t54jXvQ+3Hvvvfrggw/KbfPBBx/ovvvuc33foUMH3XLLLeW2bdSokaZMmeL6/o033tDo0aOrvB89PT1dH374oc466yx9/PHHVdYNAAAQqJjF3UJ9+/bV4MGDXZNmzZo1S6tXr9bVV1+tTp06KS8vT1u3btUXX3zhugf40Ucf1cMPP+zPsj3SunVrzZw5U5dffrlycnK0d+9eDR06VN26ddNFF12k9u3bKzo6WpmZmTp69KgSEhK0cuVK15X24vdCF+d0OvXmm29q4MCBysrKkmmauuOOO/Tuu+9q5MiRio+PV1JSkr7++mstW7ZMkjRmzBgtXbpUe/bs8ekxf/HFF659umvUqFF65plnfFRR9YSGhuqzzz7TOeeco7179yo7O1t33HGHnnzySQ0bNkw9evRQbGyscnNzdfz4cSUmJmrNmjXatm1bpf3ee++9ruHMBQUFuvrqq/Xmm2/q4osvVqNGjZSSkqIVK1Zo7ty5ys3NVXR0tMaNG1ciyKGsv//97/r6669doxJWrFihzp07689//rPOOOMMhYSEaNOmTfr4449dj3aUTt3O8NBDD7m1j5YtW+q8887TBx98oBtuuEGvvfaaLrvsMjVp0kRHjhzR3LlztXLlSlf70NBQvfnmmwoPD6+wzzvuuEPr16/XO++8I0n6/PPPNWfOHF144YU666yz1LRpU4WEhCg1NVW7d+/Whg0b9NNPP7mGw//973/3+GcFAAAQKAjoFnv//fd11llnuQL43r17KwwiN954oyZOnBhQAV2Shg4dqkWLFunKK6/UoUOHJJ0aJuvOkPPKJq3q3bu3PvvsM1155ZWue9DXrl2rtWvXlmk7YMAAvfrqq+rRo0c1j8J9GRkZ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oot09tlnq3HjxgoNDdXhw4eVkJCgb7/9VocPH3Ztm5KSovr165fpc/PmzRoxYoR27tzpem3AgAEaMmSIWrdurfr16+v48ePavXu3vv/+e61fv15FEfX555/XPffc4+FPIrCF+LsAAAAAAEDNvP32266vb7rpJr377rsqLCzU9OnTNXHixCq3f+ONN3TXXXe5vr/vvvs0ceJExcbGltu+sLBQn376qR577LESV+2L27dvnwYNGqSkpCRJUr9+/fTKK6+ob9++5bZ/+umnlZiYqMcff1yffPJJlTXXRn6/gp6amqqlS5fqwIEDCgkJUbt27XTOOecoLCzMa/vgCjoAAAAQmLiCXrWMjAw1a9ZMmZmZ6tixo37++Wc1bdpU2dnZateunXbs2CHDMCrcfsOGDerfv79r+Pk777yjm266ya195+Tk6O6779aUKVNUr1491+umaeqss87SqlWrJEkXX3yxZs+erYiICLf6nT17ttLT03XjjTe61b628NkV9JSUFH3xxRcyDEPXX3+9QkPLhtKffvpJzz//vHJzc0u8/uGHH+qhhx5SmzZtfFUeAAAAANQKn3zyiTIzMyVJ119/vWJiYnTFFVfoo48+0s6dO7V48WINGjSowu0feughVzi/5ZZb3A7nkhQeHq433nijzOtffPGFK5w3bdpUH374odvhXFKl97TXZj6bxX3Dhg2aM2eO9uzZU244P3DggJ577jnl5OTINE2FhoYqKipKpmkqOTlZkyZNKhPcAQAAAAAlFQ1vL7o4KqnElefiw99L2759u77++mtJUkhIiB555BGv1PT888+7vr733nvVsGFDr/Rb2/ksoG/cuFGGYWjgwIHlrv/000+Vl5enkJAQ3XPPPfr0009dV87Dw8OVnJysBQsW+Ko8AAAAAAh4iYmJ+umnnyRJ559/vmsU8oUXXqjmzZtLOnU1Oy0trdzt//e//7m+Lr5NTaSlpblqkhR0w9RrwmcBfffu3ZKkXr16lVlXUFCgn376SYZh6LLLLtOgQYNc90T07dtXo0aNkmmaWrNmja/KAwAAAICAV/zqePEg7HA4XFfTs7Oz9dFHH5W7/bJly1xfn3POOV6paeXKlSooKJAktW/fXk2aNPFKv8HAZwE9NTVVoaGhatSoUZl1O3fuVE5OjiRp8ODBZdYPGTJEkrRnzx5flQcAAAAAAS0vL08f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dGqyuIULF1pZGgAAAADYlr+HmNthcde0adO0c+dORUZGat68eerVq5ckKTIyUhMmTNC4ceMkSRMnTlReXp7b/T788MOSpDPPPFPvv/++mjVrJkmKiIjQnXfeqQcffFCSNGnSJKWkpHhQ8R8sDehFs7eXN7y9yMCBA+V0OvXrr79q//79FlYHAAAAAAh0M2bMkCRdc801atWqVZn148ePl2EYOnjwoNvznx0+fFjr16+XJN13330yjLIfGRS9npGRUe370S0L6Dt27NDevXsVFhams88+u8J2MTEx6t27t0zT5JnoAAAAACD/X722w+KOEydOaM2aNZKkYcOGldumVatW6tKliyS5nTn37Nnj+rpz587ltomJiVF8fLwkaf78+W5WXFJItbaqhjp16uiuu+5SbGyswsPDK21744036qyzzlK9evUsqg4AAAAA7KvocWMW79XNdtWfFM1d7h77li1bXJO0de/evcJ23bt3V2JiohITE93c/x8FFBQUVNguPz9f0qlJ6qrDsoDeqlWrcocXlKdly5Zq2bKljysCAAAAgMDg6X3Y3lE6eBsVvO577h77oUOHXF8XXc0uT9G64u0rUzzLbt68WX369CnT5tixYzpy5NTz2g8ePOhWv6VZ/pg1AAAAAIBnKp3F3bJ/RR8U+GvvVTtx4oTr68jIyArbFa3LyMhwq9+mTZu6JpubMmVKuVfRn376adfX7vZbGgEdAAAAAGzO3/d/+3uxg0ceeUTSqSvoI0aM0C+//KK8vDwdOHBADz/8sJ5//nmFhoZKkhyO6kVty4a4l/bTTz9p/fr1SkpK0smTJzVp0iTXupycHO3atUuGYVR4Az4AAAAAwLuMMl9UwizxX7YQHR3t+jorK0sxMTHltsvKypIk1a1b1+2+r7jiCj355JOaOHGivvnmG33zzTcl1vft21d9+vTRG2+8ofr163tevPwQ0A8fPqynn37aNQueaZplpqgPDQ3V1KlTlZSUpMmTJxPSAQAAAAQ1X08SV62ujZLb+jKou1tf8fvODx48WGFAL7pHvOhZ5u568MEHddFFF+n111/X6tWrlZ6erubNm2vUqFG68847dcstt0iSOnXq5FG/RSwN6FlZWXr44Yd15MgRxcbGqk+fPlq2bJlyc3NLtHM6nbr44ov1wQcfaOXKlQR0AAAAAEHN20O93b2n27M+SzK9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CJOSdvq7hBLi4uL8st+C76dL+XkVN6gNV5gri6YRdeUcdLXbXW3evFmDBw/W0aNHJUl169ZVVlaWCgoKJEl33XWXXnzxxWqVuX37dl122WXatm2bJCkkJETR0dFKTU11tdm3b59atGjhcd+OalUEAAAAALBOYcEfV9GLFofjj6X0ukBcKjuek9lu/6hyc3M1YsQIHT16VN27d9eGDRuUnp6u9PR0TZo0SYZh6KWXXtK7777r8dtw6NAhXXDBBdq2bZsGDBigBQsWKCcnRykpKcrKytKqVas0fvx4hYeHe9y35OfHrAEAAAAA3BAaVvkV9Nqm9ICA8Gi3N502bZp27typyMhIzZs3T61atZIkRUZGasKECTp06JBeeeUVTZw4UWPGjFFoaKjbfY8bN04HDx7UwIEDNX/+fIWFhbnWRUREqF+/furXr5/b/ZXGFXQAAAAAsDt/X9329+JwP7rOmDFDknTNNde4wnlx48ePl2EYOnjwoBYtWuR2v5s2bdKXX34pSXrttddKhHNvIaADAAAAgN35OyDbYXHDiRMntGbNGknSsGHDym3TqlUrdenSRZK0YMECt9+CouDfq1cvdevWze3tPBEUQ9wNw5DDg09cAAAAANiD0+n0dwn2YDhOLdVmx7nB3Qvdp5q6d+xbtmxxPd67e/fuFbbr3r27EhMTlZiY6HYJK1askCT17t1baWlpevLJJ/X5559r//79qlevnvr166dx48bpkksucbvP0oIioEdERCgyMtLfZQAAAADwEI9o/p0HV5Er6KDU92a5r3pT2Y8EarA3Nzc9dOiQ6+v4+PgK2xWtK96+Ktu3b3d93adPH/32228KCQlR3bp1lZycrHnz5mnevHm677779N///tftfosLioCenZ2t3Nxcf5cBAAAAwEMpKSn+LqEEv31gUOOAXqZDScVCtFn81epx9eWL1O/BEPcilV2kLVqXkZHhdglFv4vvvfeeHA6HXnjhBd1yyy2KjIzUoUOH9K9//UsffPCBpk6dqt69e+u6665zu+8iQRHQTdN0Pe8OAAAAQODg7/jfeT2gl+7/1H+Zrv8o8XK5yh0076sSfXnsbiosLHT997/+9S/dfffdrnXNmjXTe++9p8TERK1du1ZPPfVUtQK6327MTk1N1fbt27Vp0yZ/lQAAAAAAAcLxx33ovl6KPY/cdDhkGobM3z8g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DGycfxWLjY31dwmoxXwyxL1bt26VBnSrmaYZ8P/HEOj1B7uCggLewwDH+xe4OP9qB97DwMU5GPh4/wDr+CSgP/XUU77oFgAAAACAWivwxn0DAAAAAFALEdABAAAAALABAjoAAAAAADZAQAcAAAAAwAYI6AAAAAAA2AABHQAAAAAAGyCgAwAAAABgAwR0AAAAAABsgIAOAAAAAIANENABAAAAALABAjoAAAAAADZAQAcAAAAAwAYI6AAAAAAA2AABHQAAAAAAGyCgAwAAAABgAwR0AAAAAABswDBN0/R3ESjfjBkzlJmZqaioKI0ZM8bf5QBBh3MQ8C/OQcB/OP8A/yCg29gll1yio0ePqnHjxvrmm2/8XQ4QdDgHAf/iHAT8h/MP8A+GuAMAAAAAYAMEdAAAAAAAbICADgAAAACADRDQAQAAAACwAQI6AAAAAAA2QEAHAAAAAMAGQvxdACp27bXXup4/CcB6nIOAf3EOAv7D+Qf4B89BBwAAAADABhjiDgAAAACADRDQAQAAAACwAQI6AAAAAAA2QEAHAAAAAMAGmMXdhtLS0jRr1iytXr1ax44dU1hYmNq3b69LLrlEAwYM8Hd5QMA6ceKENm3apB07dui3337Tjh07lJaWJkl68skn1aNHjyr7WLlypb799lv99ttvys3NVVxcnM4880xdddVViomJ8fUhAAEtKSlJK1euVEJCgnbv3q3jx48rJCREjRo10umnn67LLrtMTZs2rbQPzkGg+nbs2KHVq1dr+/btOnjwoNLT05Wbm6u6deuqXbt2Ou+883T++efL4aj4Gh7nIOBbzOJuM3v37tWECRNcoSEiIkK5ubkqLCyUJF122WW65ZZb/FkiELAWLFigF198sdx17gT0119/Xd98840kyeFwKCwsTNnZ2ZKk+vXr68knn1TLli29WzRQSyQlJenmm29W8T87IiMjdfLkSeXn50uS6tSpo3vuuUfnnntuuX1wDgI18+qrr+q7775zfR8eHi5JysnJcb3WvXt3TZw4UZGRkWW25xwEfI8r6DaSl5enSZMmKS0tTa1bt9Z9992ntm3bKjc3V1999ZU+/PBDzZ07V23bttWFF17o73KBgBQbG6v27durQ4cOio+P19SpU93a7n//+5+++eYbGYah6667TpdffrnCwsK0a9cuTZ06VXv27NGkSZP08ssvKzQ01MdHAQSeog+ae/furcGDB+v0009XTEyMCgoKtGXLFk2bNk27d+/W1KlT1aJFC7Vp06bE9pyDQM2ddtppat68ubp27armzZu7Qnhqaqrmz5+vDz/8UJs2bdI777yjO+64o8S2nIOANbiCbiNff/21pk2bprCwML366qtq1KhRifVFn1o2aNBAb731lkJC+HwF8ERBQYGcTqfr+xMnTujaa6+VVPkV9Ly8PN18881KSUnRpZdeqr///e8l1h89elS33367cnNzddttt+mSSy7x3UEAASozM1NHjhxRu3btyl2fkpKiu+66S2lpaRoyZIjuvvtu1zrOQcAaM2bM0Keffqo6dero448/dv2tyTkIWIdJ4mxk8eLFkqTzzjuvTDiXpFGjRskwDB0/flwbN260uDog8BUP555ISEhQSkqKDMPQlVdeWWZ948aNdd5550n64zwGUFJUVFSF4Vw6NbqlT58+kqTffvutxDrOQcAaHTt2lCSdPHlSGRkZrtc5BwHrENBtIjs7W9u3b5d0avhfeRo1aqQWLVpIkn755RfLagOCXUJCgiSpZcuW5X54JklnnHGGJGnbtm0l7uUD4L6iCaYKCgpKvM45CFhj69atkk7dm16/fn3X65yDgHUI6Daxf/9+18Q5rVu3rrBd0bp9+/ZZUheAP843d85N0zS1f/9+S+oCaptNmzZJKnuucQ4CvpObm6v9+/frgw8+0OzZsyVJl156qQzDcLXhHASsw03MNnH8+HHX1w0aNKiwXdG6lJQUn9cE4JSi89Odc1Pi/ASq46efftKOHTskSUOGDCmxjnMQ8K7ic7AUFxISouHDh2vMmDElXuccBKxDQLeJ4kOBwsLCKmxXtK7okRYAfK/o/HTn3JSkrKwsn9cE1CZJSUl65ZVXJEn9+/d33YtehHMQ8C6Hw+Eawp6VlaWTJ0/KMAwNHz5cV1xxRZk5WzgHAesQ0AEAgN+cOHFCTzzxhNLS0tS0aVPddddd/i4JqPUiIyP1/vvvSzo1JP3o0aOaO3eu5s6dqwULFmjChAnq2rWrn6sEghP3oNtEeHi46+vc3NwK2xWti4iI8HlNAE4pOj/dOTcluZ4rC6By2dnZeuyxx7R79241aNBAjz/+uOrWrVumHecg4DuGYahJkya6+eabddNNNykjI0PPPvtsiXOKcxCwDgHdJorft1P8fvTSitbFxsb6vCYApxSdn+6cmxLnJ+CO3NxcPf7449q2bZvq1aunJ554Qk2bNi23LecgYI1hw4YpNDRUx44d09q1a12vcw4C1iGg20SLFi1cs2Xu3bu3wnZF61q2bGlJXQD+ON/cOTcNw3A9DhFA+XJzc/XEE09o8+bNio6O1uOPP17p/69xDgLWqFOnjmsUy6FDh1yvcw4C1iGg20RERIQ6duwoSVq3bl25bZKTk12PuejVq5dltQHBrmfPnpJO/fGRnJxcbpv169dLkk477bQSt6wAKCkvL09PPfWUEhISFBkZqUcffVRt27atdBvOQcAa2dnZSk9Pl1TydkrOQcA6BHQbueCCCyRJP/74o5KSksqs/+KLL2Sapho0aKAePXpYXB0QvHr27KnY2FiZpul6RmxxSUlJ+vHHHyX9cR4DKCs/P1+TJ0/W+vXrFR4erocfflidOnWqcjvOQaDmCgoKZJpmpW2++uor5efnS5K6devmep1zELAOAd1GLr74YjVt2lQ5OTl64okntGvXLkmnhgLOmjVL8+bNkySNGTNGISFMwA9UR3p6ums5ceKE6/XMzMwS64r+QJGk0NBQ1/Niv/76a82aNcs1Gc6uXbv0xBNPKCcnR82aNdNFF11k7QEBAaKgoEDPPfec1qxZozp16mjixIluzxLNOQjUXHJysu699159//33JS4Emaapffv26fXXX9fMmTMlSWeddZZat27tasM5CFjHMKv6KA2W2rt3ryZMmKC0tDRJp2bBzMnJUWFhoSRp+PDhuvXWW/1ZIhDQRowY4Va7J598ssxIlddff13ffPONJMnpdCosLMz1rNf69evrySefZH4IoAKbNm3Sgw8+KOnUH/tRUVGVti96BFRxnINA9R05ckS33HKL6/s6deooPDxcOTk5OnnypOv1M888Uw888EC5w9Q5BwHfI6DbUGpqqj7//HOtXr1aycnJCg8PV7t27XTppZdqwIAB/i4PCGg1CeiStHLlSn3zzTfauXOncnJyFBcXp379+mn06NGqV6+et8sFao2NGzdqwoQJbrefM2dOua9zDgLVk5eXp1WrVikhIUG//vqrUlJSlJ6ertDQUDVs2FCdOnXS+eefr969e1faD+cg4FsEdAAAAAAAbIB70AEAAAAAsAECOgAAAAAANkBA///27j8mq/L/4/jrFgQFCiYGDFNiksiYpZhj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\n", + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " 2024-01-30T14:45:13.447234\n", + " image/svg+xml\n", + " \n", + " \n", + " Matplotlib v3.5.2, https://matplotlib.org/\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n" + ], "text/plain": [ "
" ] }, - "metadata": { - "image/png": { - "height": 300, - "width": 500 - } - }, + "metadata": {}, "output_type": "display_data" }, { @@ -831,9 +7205,8 @@ "breaks = [0, 1, 2, 3]\n", "\n", "plot = (\n", - " ggplot(df, aes(x=\"layer\", y=\"pos\")) \n", - "\n", - " + geom_tile(aes(fill=\"ACC\"))\n", + " ggplot(df, aes(x=\"layer\", y=\"pos\", fill=\"ACC\")) \n", + " + geom_tile()\n", " + scale_fill_cmap(\"Reds\") + xlab(\"layers\")\n", " + scale_y_reverse(\n", " limits = (-0.5, 3.5), \n", @@ -872,7 +7245,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.12" + "version": "3.9.12" } }, "nbformat": 4,