{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"provenance": [],
"toc_visible": true
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
},
"language_info": {
"name": "python"
}
},
"cells": [
{
"cell_type": "markdown",
"source": [
"# Online Learning: Practical Session, \"Rock Paper Scissors\" (& possibly Lizard Spock and a Well if you are motivated or want to play)\n",
"\n",
"Teaching Assistant: Julien ZHOU, julien.zhou@inria.fr\n"
],
"metadata": {
"id": "-fkXm-1Q9QZz"
}
},
{
"cell_type": "code",
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"# Number of actions\n",
"M=3\n",
"names = [\"Rock\", \"Paper\", \"Scissors\"]\n",
"# Solutions only for M=3, the Lizard and Spock got lost somewhere in Chartreuse, and the Well is haunted.\n",
"p_init = np.array([1/M for i in range(M)])"
],
"metadata": {
"id": "p2c6VgHxECxw"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"---\n",
"## Setting\n",
"We consider the sequential version of the following repeated two-players, zero-sum game.\n",
"\n",
"Let $M\\in\\mathbb{N}$ be a number of actions, $L\\in[-1, 1]^{M\\times M}$ be a loss matrix, and $T\\in\\mathbb{N}^*$ be a time horizon. \\\\\n",
"At each round $t=1, \\dots, T$:\n",
"- The player chooses a distribution $p_t\\in \\Delta_M:=\\{p\\in[0, 1]^M,\\ \\sum_{i=1}^M p_i=1\\}$.\n",
"- The adversary chooses a distribution $q_t\\in\\Delta_M$.\n",
"- Actions $i_t \\sim p_t$ and $j_t\\sim q_t$ are sampled for the player and the adversary.\n",
"- The player incurr the loss $l_t=L(i_t, j_t)$ and the adversary $-L(i_t, j_t)$.\n",
"\n",
"BEWARE: The adversary choses its vector after the player, and can chose its distribution using the one of the player!"
],
"metadata": {
"id": "trcHY78F9948"
}
},
{
"cell_type": "markdown",
"source": [
"Let's assume that a win yields a loss $-1$, and a tie, $0$. What is the loss matrix $L$ of \"Rock, Paper, Scissors\"?\n",
"\n",
"\n",
"(If you are bored, change the first cell of this document and add the Lizard, Spock and/or the Well, but I have not done it myself. You can also change the matrix so that losing/wining with a particular action is more costly than others)"
],
"metadata": {
"id": "IUTW9GttFAl2"
}
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "u-MfeGQI70xp"
},
"outputs": [],
"source": [
"# Replace L with the right expression.\n",
"L = None # an np array of shape (M, M)"
]
},
{
"cell_type": "markdown",
"source": [
"---\n",
"## Full information feedback\n",
"\n",
"We assume that both the player and the adversary know $L$ in advance.\n",
"\n",
"Given a distribution $p\\in\\Delta_M$, implement the function returning an action (in $0, \\dots, M-1$ because python is $0$-indexed)."
],
"metadata": {
"id": "__2Y2kfOK7O-"
}
},
{
"cell_type": "code",
"source": [
"def sample_action(p):\n",
" # p: an np.array of shape (M,); vector of weights in Delta_M\n",
" # Returns: An integer in 0, ..., M-1; sampled according to p\n",
"\n",
" # Hint: you only need to sample a uniform distribution in [0, 1], use np.random.rand() only once.\n",
"\n",
" # ---\n",
" # ADD YOUR CODE HERE\n",
" # ---\n",
" return"
],
"metadata": {
"id": "EV5ytjBoKrHU"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"### Exponential Weighted Average\n",
"We assume that the player uses an Exponential Weighted Average (EWA) strategy with learning rate $\\eta>0$.\n",
"\n",
"We denote $p_t\\in\\Delta_M$ the distribution chosen by the player at round $t\\in1, \\dots, T$ and $l_t\\in[-1, 1]^M$ the loss vector of this round. For round $t+1$, the new distribution defined by this strategy is defined, for all $i\\in 1, \\dots, M$ as:\n",
"$$p_{t+1}(i) = \\frac{p_t(i)\\exp\\big(-\\eta l_t(i)\\big)}{\\sum_{j=1}^Mp_t(j)\\exp\\big(-\\eta l_t(j)\\big)}$$"
],
"metadata": {
"id": "yCBjsLWAR-My"
}
},
{
"cell_type": "code",
"source": [
"def EWA_update(eta, p, l):\n",
" # eta: learning rate\n",
" # p: an np.array of shape (M,); vector of weights in Delta_M; to be updated\n",
" # l: an np.array of shape (M,); vector of losses in [-1, 1]^M incurred by the player\n",
" # Returns: an np.array of shape (M,); p updated with the loss l\n",
"\n",
" # ---\n",
" # ADD YOUR CODE HERE\n",
" # ---\n",
" return"
],
"metadata": {
"id": "0WqKLjJZM_GA"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"#### Beating a fixed adversary\n",
"We assume that the adversary uses a fixed distribution vector : $q_{fixed}=(1/3, 1/6, 1/2)$, unknown to us. Let's see how EWA fares.\n",
"\n",
"BEWARE: There can be several types of adversary. We first look at a \"fixed\" adversary who does not change. But in the worst case, the adversary can be aware of the strategy of the player. An in-between is a \"player-like\" adversary who adapt its strategy taking into consideration its own past actions and losses. To account for all these possibilities, the adversary decision is implemented as a function taking in argument:\n",
"- a learning rate\n",
"- the vector player by the adversary in the round before,\n",
"- the loss incurred by him the round before,\n",
"- the current decision of the player.\n",
"\n",
"If the adversary needs to make an update using an incurred loss at round t (just like EWA), he does it in the round t+1 after the player chose its vector.\n"
],
"metadata": {
"id": "1ULcbdEXVOzl"
}
},
{
"cell_type": "code",
"source": [
"q_fixed = np.array([1/3, 1/6, 1/2])\n",
"\n",
"def fixed_adversary_update(eta_adv, q, l, p):\n",
" # eta_adv: learning rate for the adversary\n",
" # q: an np.array of shape (M,); vector of weights in Delta_M used in round t-1 by the adversary\n",
" # l: an np.array of shape (M,t); vector of losses in [-1, 1]^M incurred by the adversary\n",
" # p: an np.array of shape (M,); vector of weights in Delta_M used in round t by the player\n",
" # Returns: q_fixed\n",
"\n",
" return q_fixed"
],
"metadata": {
"id": "OxnxD7tRNG9B"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"Simulate an instance of the game for $T=100$ rounds and a learning rate $\\eta=1$. Plot the evolution of the weight vector. What seems to be the best strategy?"
],
"metadata": {
"id": "1bahBqAgm_EX"
}
},
{
"cell_type": "code",
"source": [
"def single_run(T, update_fct, eta, adversary_update, eta_adv):\n",
" # T: horizon\n",
" # update_fct: function (eta, p, l) -> p, updating p with the loss for the player\n",
" # eta: learning rate for the player\n",
" # adversary_update: function (eta_adv, q, l, p) -> q, updating q with the a loss for the adversary\n",
" # eta_adv: learning rate for the adversary\n",
" # Returns: {\"weigths_player\": np.array((T, M)), \"loss_player_logs\": np.array((T,)), \"weigths_adv\": np.array((T, M))}\n",
"\n",
" p = p_init\n",
" q = p_init\n",
" weights_player = np.zeros((T, M))\n",
" loss_player_logs = np.zeros((T,))\n",
" weights_adv = np.zeros((T, M))\n",
" loss_player = None # array(M,)\n",
" loss_adversary = None # array(M,)\n",
" for t in range(T):\n",
" # ---\n",
" # ADD YOUR CODE HERE\n",
" # See the setting\n",
" # ---\n",
" pass\n",
" return{\"weights_player\": weights_player,\n",
" \"loss_player_logs\": loss_player_logs,\n",
" \"weights_adv\": weights_adv}"
],
"metadata": {
"id": "WYrXUAYQNHsi"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"T=100\n",
"eta = 1\n",
"eta_adv = 1\n",
"\n",
"results = single_run(T, EWA_update, eta, fixed_adversary_update, eta_adv)"
],
"metadata": {
"id": "uPGcZfBSO93d"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"plt.title(\"Action weights over time against a fixed adversary\")\n",
"# ---\n",
"# ADD YOUR CODE HERE\n",
"# ---"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 469
},
"id": "5KA5cO4aovP_",
"outputId": "4d6d2dfc-2654-4fb6-8402-8dbde56f00e7"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"Text(0.5, 1.0, 'Action weights over time against a fixed adversary')"
]
},
"metadata": {},
"execution_count": 8
},
{
"output_type": "display_data",
"data": {
"text/plain": [
""
],
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAi4AAAGzCAYAAAAIWpzfAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA7f0lEQVR4nO3deVhV1eLG8ZdBzlERUFFwIEnMeSpUMkPTSEqjvDeVsiuoZXXTUrkNDilOaTZSiqI2WF5LzawszYn0NtnPcmjUyrkJEg1QVBDO+v3hw6kjoBzEYcP38zzneWSdtfZee6999nnd0/EwxhgBAABYgOfF7gAAAEBpEVwAAIBlEFwAAIBlEFwAAIBlEFwAAIBlEFwAAIBlEFwAAIBlEFwAAIBlEFwAAIBlEFwsYtCgQQoNDb3Y3Sh3GzdulIeHhzZu3FjmtsuWLSv/jlUC57LuK5p9+/bJw8NDCxYsuNhdKRfp6enq27evateuLQ8PDyUlJV208b5Q65btufIguJST2bNny8PDQxEREWWexm+//aaJEydq+/bt5dcxSJJef/11JSUlXexuXBSzZ8+uMF/IVvX9999r4sSJ2rdv3wWZ36hRo7RmzRqNGTNGCxcu1I033nhB5gtcCN4XuwMVxaJFixQaGqrNmzdr165datKkidvT+O233zRp0iSFhoaqffv2Lu/Nnz9fDoejnHp76ejatauOHz8uHx+f8zqf119/Xd9++61Gjhx5XudzKZo9e7YCAwM1aNAgl/ILte6toFGjRjp+/LiqVKlyXqb//fffa9KkSbruuusuyJHTDz/8ULfeeqseeughZ1nTpk0Zb1QIHHEpB3v37tVnn32mZ599VnXq1NGiRYvKfR5VqlSRzWYr9+lebJ6enrLb7fL0ZFMsK4fDoRMnTrjdjnX/Fw8PD9ntdnl5eV3srpSLP/74QwEBAS5ljPf5kZOTc97nYYzR8ePHz/t8rIItuBwsWrRINWvWVO/evdW3b98Sg0tmZqZGjRql0NBQ2Ww2NWzYUHFxccrIyNDGjRvVsWNHSdLgwYPl4eHhcl64uGtccnJy9J///EchISGy2Wxq1qyZnn76aZ3+g98eHh4aPny43nnnHbVu3Vo2m02tWrXS6tWrz7hcxhgFBgYqISHBWeZwOBQQECAvLy9lZmY6y2fMmCFvb28dPXrUWbZz50717dtXtWrVkt1uV4cOHbRixQqXeZR0Xjo5OVmNGzdW1apV1alTJ3388ce67rrrdN111xXpp8Ph0OOPP66GDRvKbrfr+uuv165du5zvX3fddVq5cqX279/vXK9/X5czZ85Uq1atVK1aNdWsWVMdOnTQ66+/fsZ1I536crjrrrsUFBQku92udu3a6dVXX3W+f/LkSdWqVUuDBw8u0jY7O1t2u93lf8S5ublKTExUkyZNZLPZFBISokceeUS5ubkubQvHc9GiRWrVqpVsNluJYxkaGqrvvvtO//vf/5zLXrgOi1v31113nVq3bq2vv/5a3bp1U7Vq1dSkSRPndUT/+9//FBERoapVq6pZs2Zav359kXn++uuvGjJkiIKCgpzb2ssvv3zW9SlJr7zyinr06KG6devKZrOpZcuWmjNnTpF6DodDEydOVP369VWtWjV1795d33//vUJDQ12OLB0+fFgPPfSQ2rRpI19fX/n5+emmm27SV1995TK94q7DGDRokHx9ffXrr7+qT58+8vX1VZ06dfTQQw+poKDApf3ixYsVHh6uGjVqyM/PT23atNHzzz8vSVqwYIH69esnSerevbtzHM50LcbXX3+tQYMGqXHjxrLb7QoODtaQIUN06NChM66/BQsWyMPDQ8YYJScnO+clFR3vHTt2qGrVqoqLi3OZxieffCIvLy89+uijzrLMzEyNHDnSua9p0qSJZsyYUeQocGZmpgYNGiR/f38FBAQoPj7eZT9xJqUdK0n65Zdf1KdPH1WvXl1169bVqFGjinxOhg8fLl9fXx07dqxI+zvuuEPBwcEu4/jBBx8oMjJS1atXV40aNdS7d2999913Lu0Kt4ndu3erV69eqlGjhu68805J0k8//aTbbrtNwcHBstvtatiwoW6//XZlZWU525d2+w4NDdXNN9+sNWvWqEOHDqpatarmzp2rbt26qV27dsWuv2bNmik6OvoMa7gCMThnzZs3N3fddZcxxpiPPvrISDKbN292qXPkyBHTunVr4+XlZYYOHWrmzJljpkyZYjp27Gi2bdtm0tLSzOTJk40kc88995iFCxeahQsXmt27dxtjjImPjzeNGjVyTs/hcJgePXoYDw8Pc/fdd5tZs2aZmJgYI8mMHDnSZd6STLt27Uy9evXMlClTTFJSkmncuLGpVq2aycjIOOOy3XLLLSY8PNz597Zt24wk4+npad5//31nee/evU2HDh2cf3/77bfG39/ftGzZ0syYMcPMmjXLdO3a1Xh4eJjly5c7623YsMFIMhs2bHCWzZ4920gykZGR5oUXXjAJCQmmVq1aJiwszHTr1q1I2yuvvNKEh4eb5557zkycONFUq1bNdOrUyVlv7dq1pn379iYwMNC5Xt9++21jjDHz5s0zkkzfvn3N3LlzzfPPP2/uuusu8+CDD55xvRw7dsy0aNHCVKlSxYwaNcq88MILJjIy0kgySUlJznpDhgwxAQEBJjc316X9q6++aiSZL774whhjTEFBgenZs6epVq2aGTlypJk7d64ZPny48fb2NrfeeqtLW0mmRYsWpk6dOmbSpEkmOTnZbNu2rdh+vv3226Zhw4amefPmzmVfu3Ztieu+W7dupn79+iYkJMQ8/PDDZubMmaZly5bGy8vLLF682AQHB5uJEyeapKQk06BBA+Pv72+ys7Od7dPS0kzDhg1NSEiImTx5spkzZ4655ZZbjCTz3HPPnXGdGmNMx44dzaBBg8xzzz1nZs6caXr27GkkmVmzZrnUe+SRR4wkExMTY2bNmmWGDh1qGjZsaAIDA018fLyz3hdffGHCwsLM6NGjzdy5c83kyZOd/f7111+d9fbu3WskmVdeecVZFh8fb+x2u2nVqpUZMmSImTNnjrntttuMJDN79mxnvbVr1xpJ5vrrrzfJyckmOTnZDB8+3PTr188YY8zu3bvNgw8+aCSZsWPHOschLS2txPXw9NNPm8jISDN58mQzb948M2LECFO1alXTqVMn43A4Smy3e/dus3DhQiPJ3HDDDc55GVP8eD/11FNGknn33XeNMcYcPXrUhIWFmZYtW5oTJ04YY4zJyckxbdu2NbVr1zZjx441KSkpJi4uznh4eJgRI0Y4p+VwOEzXrl2Np6enuf/++83MmTNNjx49TNu2bYus2+KUdqyOHTtmmjZtaux2u3nkkUdMUlKSCQ8Pd86ncPkK98VLly51mU9OTo6pXr26GTZsmLPstddeMx4eHubGG280M2fONDNmzDChoaEmICDA7N2711kvPj7e2Gw2ExYWZuLj401KSop57bXXTG5urrn88stN/fr1zdSpU82LL75oJk2aZDp27Gj27dvnbF/a7btRo0amSZMmpmbNmmb06NEmJSXFbNiwwcyfP99IMt98841L/c2bNxtJ5rXXXjvjOq4oCC7n6MsvvzSSzLp164wxpz68DRs2dPlAG2PMhAkTjCSXL+1ChTuiL774osQP+OnB5Z133jGSzNSpU13q9e3b13h4eJhdu3Y5yyQZHx8fl7KvvvrKSDIzZ8484/I99dRTxsvLy/nl9MILL5hGjRqZTp06mUcffdQYc+pLNyAgwIwaNcrZ7vrrrzdt2rRx7vwKl/Oaa64xV1xxhbPs9J1pbm6uqV27tunYsaM5efKks96CBQuMpGKDS4sWLVyCwfPPP1/kw927d2+X9Vfo1ltvNa1atTrjOihOUlKSkWT++9//Osvy8vJM586dja+vr3N9rVmzxkgy7733nkv7Xr16mcaNGzv/XrhwofH09DQff/yxS72UlBQjyXz66afOssLg+N1335Wqr61atXJZb4VKCi6SzOuvv+4s27lzp3Oen3/+ubO8cNn+vr3eddddpl69ekUC8e233278/f3NsWPHztjX4t6Pjo52WVdpaWnG29vb9OnTx6XexIkTjSSX4HLixAlTUFDgUm/v3r3GZrOZyZMnu5QVF1wkudQzxjiDcqERI0YYPz8/k5+fX+Jyvfnmm0XW9ZkUtx7eeOMNI8l89NFHZ20vyeWL2Zjix7ugoMBce+21JigoyGRkZJhhw4YZb29vZ6A2xpgpU6aY6tWrmx9//NFleqNHjzZeXl7mwIEDxpi/9klPPvmks05+fr4z0J8tuJR2rAo/e38PJDk5OaZJkyYuy+dwOEyDBg3Mbbfd5jLNpUuXuqzHI0eOmICAADN06FCXemlpacbf39+lvHCbGD16tEvdwv/Qvfnmm2dcxtJs38acCi6SzOrVq13KMzMzjd1ud+57Cz344IOmevXq5ujRo2ecf0XBqaJztGjRIgUFBal79+6STh3Gj42N1eLFi10OQ7711ltq166d/vGPfxSZRuGhXHesWrVKXl5eevDBB13K//Of/8gYow8++MClPCoqSmFhYc6/27ZtKz8/P+3Zs+eM84mMjFRBQYE+++wzSdLHH3+syMhIRUZG6uOPP5Ykffvtt8rMzFRkZKSkU4d8P/zwQ/Xv319HjhxRRkaGMjIydOjQIUVHR+unn37Sr7/+Wuz8vvzySx06dEhDhw6Vt/df147feeedqlmzZrFtBg8e7HLBYWE/zrZskhQQEKBffvlFX3zxxVnr/t2qVasUHBysO+64w1lWpUoVPfjggzp69Kj+97//SZJ69OihwMBALVmyxFnvzz//1Lp16xQbG+sse/PNN9WiRQs1b97cub4yMjLUo0cPSdKGDRtc5t+tWze1bNnSrT6Xlq+vr26//Xbn382aNVNAQIBatGjhctdc4b8L17MxRm+99ZZiYmJkjHFZjujoaGVlZWnr1q1nnHfVqlWd/87KylJGRoa6deumPXv2OA+5p6amKj8/X/fff79L2wceeKDI9Gw2m/OajoKCAh06dEi+vr5q1qzZWftS6L777nP5OzIy0mXbCggIUE5OjtatW1eq6ZXG39fDiRMnlJGRoauvvlqSSt3v0vD09NSCBQt09OhR3XTTTZo9e7bGjBmjDh06OOu8+eabioyMVM2aNV3GNCoqSgUFBfroo48knfpMeHt769///rezrZeXV7HjUpzSjtWqVatUr1499e3b11lWrVo13XPPPS7T8/DwUL9+/bRq1SqXU9hLlixRgwYNdO2110qS1q1bp8zMTN1xxx0uy+fl5aWIiIginz1JLssoSf7+/pKkNWvWFHtqqlBptu9Cl19+eZFTP/7+/rr11lv1xhtvOC8JKCgo0JIlS5ynzioDgss5KCgo0OLFi9W9e3ft3btXu3bt0q5duxQREaH09HSlpqY66+7evVutW7cut3nv379f9evXV40aNVzKW7Ro4Xz/7y677LIi06hZs6b+/PPPM87nqquuUrVq1ZwhpTC4dO3aVV9++aVOnDjhfK9wR7Br1y4ZYzR+/HjVqVPH5ZWYmCjp1PUhJS2XpCJ3ZXl7e5d4N8bpy1YYcM62bJL06KOPytfXV506ddIVV1yhYcOG6dNPPz1ru/379+uKK64ocqHj6evf29tbt912m959913nOfjly5fr5MmTLsHlp59+0nfffVdkfTVt2lRS0fV1+eWXn7WPZdWwYcMiYdrf318hISFFyqS/1vPBgweVmZmpefPmFVmOwut8Shr3Qp9++qmioqJUvXp1BQQEqE6dOho7dqwkOXfsJW0jtWrVKhJuHQ6HnnvuOV1xxRWy2WwKDAxUnTp19PXXXxf5oiiO3W5XnTp1XMpO/9zcf//9atq0qW666SY1bNhQQ4YMOev1Y2dz+PBhjRgxQkFBQapatarq1KnjHPPS9NsdYWFhmjhxor744gu1atVK48ePd3n/p59+0urVq4uMaVRUlKS/xnT//v2qV6+efH19Xdo3a9asVP0o7Vjt379fTZo0KbKNFjef2NhYHT9+3Hlt3dGjR7Vq1Sr169fP2f6nn36SdOo/Gacv49q1a4tss97e3mrYsKFL2eWXX66EhAS9+OKLCgwMVHR0tJKTk4uMVWm2779PszhxcXE6cOCAc7+7fv16paena+DAgcXWr4i4HfocfPjhh/r999+1ePFiLV68uMj7ixYtUs+ePS9Cz4oq6W4Jc9qFvKerUqWKIiIi9NFHH2nXrl1KS0tTZGSkgoKCdPLkSf3f//2fPv74YzVv3ty5gy+8YO+hhx4q8WKxstwuXpKyLpt0Kmj88MMPev/997V69Wq99dZbmj17tiZMmKBJkyaVS/9uv/12zZ07Vx988IH69OmjpUuXqnnz5i4X2TkcDrVp00bPPvtssdM4PTT8/X9u5a2k9Xm29Vw47v/6178UHx9fbN22bduWON/du3fr+uuvV/PmzfXss88qJCREPj4+WrVqlZ577rkyPQ5g2rRpGj9+vIYMGaIpU6aoVq1a8vT01MiRI0s1vdLcZVS3bl1t375da9as0QcffKAPPvhAr7zyiuLi4lwu1nZH//799dlnn+nhhx9W+/bt5evrK4fDoRtvvPG8PBZh7dq1kk49kuHQoUMKDg52vudwOHTDDTfokUceKbZtYbg+V+c6VsW5+uqrFRoaqqVLl2rAgAF67733dPz4cZf/NBROe+HChS7LXejvR34l1yNDf/fMM89o0KBBevfdd7V27Vo9+OCDmj59uj7//HM1bNjQ7e27pM94dHS0goKC9N///lddu3bVf//7XwUHBzuDZGVAcDkHixYtUt26dZWcnFzkveXLl+vtt99WSkqKqlatqrCwMH377bdnnJ47p4waNWqk9evX68iRIy5HXXbu3Ol8v7xERkZqxowZWr9+vQIDA9W8eXN5eHioVatW+vjjj/Xxxx/r5ptvdtZv3LixpFOhx90PU2G/d+3a5Tz9Jkn5+fnat2/fGb/4zuRM67Z69eqKjY1VbGys8vLy9M9//lOPP/64xowZI7vdXmI/v/76azkcDpedWHHrv2vXrqpXr56WLFmia6+9Vh9++KHGjRvnMr2wsDB99dVXuv7668t06vBMynt6JalTp45q1KihgoKCMu1E33vvPeXm5mrFihUuR9FOP1T/923k7/8rPXToUJGjbMuWLVP37t310ksvuZRnZmYqMDDQ7T6WxMfHRzExMYqJiZHD4dD999+vuXPnavz48cUeHTiTP//8U6mpqZo0aZImTJjgLC88MlDeUlJStG7dOj3++OOaPn267r33Xr377rvO98PCwnT06NGzjmmjRo2Umpqqo0ePuhx1+eGHH0rVj9KOVaNGjfTtt9/KGOOyXkuaT//+/fX8888rOztbS5YsUWhoqPO0W+HySacC6Ll++bdp00Zt2rTRY489ps8++0xdunRRSkqKpk6dWurt+2y8vLw0YMAALViwQDNmzNA777yjoUOHVphb+UuDU0VldPz4cS1fvlw333yz+vbtW+Q1fPhwHTlyxHmI8rbbbtNXX32lt99+u8i0Cv/HWnh+sjS3D/bq1UsFBQWaNWuWS/lzzz0nDw8P3XTTTee4hH+JjIxUbm6ukpKSdO211zp3FpGRkVq4cKF+++0353Ul0qkdwHXXXae5c+fq999/LzK9gwcPljivDh06qHbt2po/f77y8/Od5YsWLSrVqZ+SVK9evdhD7KffXurj46OWLVvKGKOTJ0+WOL1evXopLS3N5dqV/Px8zZw5U76+vurWrZuz3NPTU3379tV7772nhQsXKj8/3+V/fNKpneuvv/6q+fPnF5nX8ePHz+lZEdWrVy/1LannwsvLS7fddpveeuutYkP6mca9sL3keqQsKytLr7zyiku966+/Xt7e3kVuIz39s1A4zdOPvL355pslXmNVFqdvQ56ens6AXXh60J3PdnHrQdJ5efLz3r179fDDD+u2227T2LFj9fTTT2vFihV67bXXnHX69++vTZs2ac2aNUXaZ2ZmOj+nvXr1Un5+vsu4FBQUaObMmaXqS2nHqlevXvrtt99cfurj2LFjmjdvXrHTjY2NVW5url599VWtXr1a/fv3d3k/Ojpafn5+mjZtWrGf+bNtt9Kpxxv8fX8lnQoxnp6ezm2gtNt3aQwcOFB//vmn7r33Xh09elT/+te/3J6GlXHEpYxWrFihI0eO6JZbbin2/auvvtr5MLrY2Fg9/PDDWrZsmfr166chQ4YoPDxchw8f1ooVK5SSkqJ27dopLCxMAQEBSklJUY0aNVS9enVFREQUe64zJiZG3bt317hx47Rv3z61a9dOa9eu1bvvvquRI0e6XIh7rjp37ixvb2/98MMPLhfAde3a1bmT+ntwkU49h+Xaa69VmzZtNHToUDVu3Fjp6enatGmTfvnll2KfzSCdCg4TJ07UAw88oB49eqh///7at2+fFixYoLCwsDIfPQgPD9eSJUuUkJCgjh07ytfXVzExMerZs6eCg4PVpUsXBQUFaceOHZo1a5Z69+5d5Pqhv7vnnns0d+5cDRo0SFu2bFFoaKiWLVumTz/9VElJSUXaxsbGaubMmUpMTFSbNm2c18IUGjhwoJYuXar77rtPGzZsUJcuXVRQUKCdO3dq6dKlzuc5lHXZ58yZo6lTp6pJkyaqW7eu86Lf8vbEE09ow4YNioiI0NChQ9WyZUsdPnxYW7du1fr163X48OES2/bs2dN55KJwhzx//nzVrVvXJQAHBQVpxIgReuaZZ3TLLbfoxhtv1FdffaUPPvhAgYGBLtvIzTffrMmTJ2vw4MG65ppr9M0332jRokXOo4Ll4e6779bhw4fVo0cPNWzYUPv379fMmTPVvn175zi3b99eXl5emjFjhrKysmSz2ZzP8zidn5+funbtqieffFInT55UgwYNtHbtWu3du7fc+iyd+gIdMmSIqlat6vwc33vvvXrrrbc0YsQIRUVFqX79+nr44Ye1YsUK3XzzzRo0aJDCw8OVk5Ojb775RsuWLdO+ffsUGBiomJgYdenSRaNHj9a+ffvUsmVLLV++vNTX5JR2rIYOHapZs2YpLi5OW7ZsUb169bRw4UJVq1at2OleddVVatKkicaNG6fc3Nwi/2nw8/PTnDlzNHDgQF111VW6/fbbVadOHR04cEArV65Uly5dig3Ff/fhhx9q+PDh6tevn5o2bar8/HwtXLjQGeal0m/fpXHllVeqdevWzov6r7rqKrfaW94Fv4+pgoiJiTF2u93k5OSUWGfQoEGmSpUqzltDDx06ZIYPH24aNGhgfHx8TMOGDU18fLzLraPvvvuuadmypfH29na5hfD026GNOXUb36hRo0z9+vVNlSpVzBVXXGGeeuqpIs95UDG3Rhpz6pa7v986eiYdO3Y0ksz//d//Oct++eUXI8mEhIQU22b37t0mLi7OBAcHmypVqpgGDRqYm2++2SxbtsxZp7hbNI3567Zrm81mOnXqZD799FMTHh5ubrzxxiJtT78FsbhbW48ePWoGDBhgAgICjCTnupw7d67p2rWrqV27tvP5DA8//LDJyso66zpJT083gwcPNoGBgcbHx8e0adOmxFs+HQ6HCQkJKfYW9kJ5eXlmxowZplWrVsZms5maNWua8PBwM2nSJJf+lDSeJUlLSzO9e/c2NWrUcLmlvKTboYu7PbxRo0amd+/eRcqL60t6eroZNmyYCQkJMVWqVDHBwcHm+uuvN/PmzTtrX1esWGHatm1r7Ha7CQ0NNTNmzDAvv/yykeTyPI38/Hwzfvx4ExwcbKpWrWp69OhhduzYYWrXrm3uu+8+Z70TJ06Y//znP6ZevXqmatWqpkuXLmbTpk2mW7duLreIl3Q7dPXq1Yv0MTEx0fx917ls2TLTs2dPU7duXePj42Muu+wyc++995rff//dpd38+fNN48aNjZeX11lvjf7ll1/MP/7xDxMQEGD8/f1Nv379zG+//WYkmcTExLOux+LG5fTxLnxswFtvveVS78CBA8bPz8/06tXLWXbkyBEzZswY06RJE+Pj42MCAwPNNddcY55++mmTl5fnrHfo0CEzcOBA4+fnZ/z9/c3AgQOdtwqX5nbo0oyVMcbs37/f3HLLLaZatWomMDDQjBgxwqxevbrE9Tpu3DgjyTRp0qTE+W/YsMFER0cbf39/Y7fbTVhYmBk0aJD58ssvnXVK2ib27NljhgwZYsLCwozdbje1atUy3bt3N+vXr3epV9rtu6TP2989+eSTRpKZNm3aGetVRB7GlOIKRuAiczgcqlOnjv75z38WezoFyMzMVM2aNTV16tQi1xABFc3zzz+vUaNGad++fcXeNVqRcY0LLjknTpwocq77tdde0+HDh4t95D8qn+J+t6XwGhC2EVR0xhi99NJL6tatW6ULLRLXuOAS9Pnnn2vUqFHq16+fateura1bt+qll15S69atnb/5gsptyZIlWrBggXr16iVfX1998skneuONN9SzZ0916dLlYncPOC9ycnK0YsUKbdiwQd98843L3V+VCcEFl5zQ0FCFhITohRde0OHDh1WrVi3FxcXpiSeecHlCLiqvtm3bytvbW08++aSys7OdF+xOnTr1YncNOG8OHjyoAQMGKCAgQGPHji3x5pCKzu1rXD766CM99dRT2rJli37//Xe9/fbb6tOnzxnbbNy4UQkJCfruu+8UEhKixx57zOUXXAEAAErD7WtccnJy1K5du2IfulacvXv3qnfv3urevbu2b9+ukSNH6u677y72mQAAAABnck53FXl4eJz1iMujjz6qlStXujyQ6vbbb1dmZuY5/54HAACoXM77NS6bNm0q8hjl6OhojRw5ssQ2ubm5zqcNSqduhT18+LBq1659wR5fDgAAzo0xRkeOHFH9+vWL/Y2nsjjvwSUtLU1BQUEuZUFBQcrOztbx48eL/SGp6dOnl9sP3AEAgIvr559/LvKr2mV1Sd5VNGbMGCUkJDj/zsrK0mWXXaaff/5Zfn5+F7FnAACgtLKzsxUSEnLGn1Bx13kPLsHBwUpPT3cpS09Pl5+fX4k/222z2WSz2YqU+/n5EVwAALCY8rzM47w/Obdz585KTU11KVu3bp06d+58vmcNAAAqGLeDy9GjR7V9+3Zt375d0qnbnbdv364DBw5IOnWaJy4uzln/vvvu0549e/TII49o586dmj17tpYuXapRo0aVzxIAAIBKw+3g8uWXX+rKK6/UlVdeKUlKSEjQlVdeqQkTJkiSfv/9d2eIkaTLL79cK1eu1Lp169SuXTs988wzevHFFxUdHV1OiwAAACoLS/w6dHZ2tvz9/ZWVlcU1LgAAWMT5+P7m16EBAIBlEFwAAIBlEFwAAIBlEFwAAIBlEFwAAIBlEFwAAIBlEFwAAIBlEFwAAIBlEFwAAIBlEFwAAIBlEFwAAIBlEFwAAIBlEFwAAIBlEFwAAIBlEFwAAIBlEFwAAIBlEFwAAIBlEFwAAIBlEFwAAIBlEFwAAIBlEFwAAIBlEFwAAIBlEFwAAIBlEFwAAIBlEFwAAIBlEFwAAIBlEFwAAIBlEFwAAIBlEFwAAIBlEFwAAIBlEFwAAIBlEFwAAIBlEFwAAIBlEFwAAIBlEFwAAIBlEFwAAIBlEFwAAIBlEFwAAIBlEFwAAIBlEFwAAIBlEFwAAIBlEFwAAIBlEFwAAIBlEFwAAIBlEFwAAIBlEFwAAIBlEFwAAIBlEFwAAIBlEFwAAIBlEFwAAIBlEFwAAIBlEFwAAIBlEFwAAIBlEFwAAIBlEFwAAIBlEFwAAIBlEFwAAIBlEFwAAIBlEFwAAIBlEFwAAIBlEFwAAIBlEFwAAIBlEFwAAIBllCm4JCcnKzQ0VHa7XREREdq8efMZ6yclJalZs2aqWrWqQkJCNGrUKJ04caJMHQYAAJWX28FlyZIlSkhIUGJiorZu3ap27dopOjpaf/zxR7H1X3/9dY0ePVqJiYnasWOHXnrpJS1ZskRjx449584DAIDKxe3g8uyzz2ro0KEaPHiwWrZsqZSUFFWrVk0vv/xysfU/++wzdenSRQMGDFBoaKh69uypO+6446xHaQAAAE7nVnDJy8vTli1bFBUV9dcEPD0VFRWlTZs2Fdvmmmuu0ZYtW5xBZc+ePVq1apV69epV4nxyc3OVnZ3t8gIAAPB2p3JGRoYKCgoUFBTkUh4UFKSdO3cW22bAgAHKyMjQtddeK2OM8vPzdd99953xVNH06dM1adIkd7oGAAAqgfN+V9HGjRs1bdo0zZ49W1u3btXy5cu1cuVKTZkypcQ2Y8aMUVZWlvP1888/n+9uAgAAC3DriEtgYKC8vLyUnp7uUp6enq7g4OBi24wfP14DBw7U3XffLUlq06aNcnJydM8992jcuHHy9CyanWw2m2w2mztdAwAAlYBbR1x8fHwUHh6u1NRUZ5nD4VBqaqo6d+5cbJtjx44VCSdeXl6SJGOMu/0FAACVmFtHXCQpISFB8fHx6tChgzp16qSkpCTl5ORo8ODBkqS4uDg1aNBA06dPlyTFxMTo2Wef1ZVXXqmIiAjt2rVL48ePV0xMjDPAAAAAlIbbwSU2NlYHDx7UhAkTlJaWpvbt22v16tXOC3YPHDjgcoTlsccek4eHhx577DH9+uuvqlOnjmJiYvT444+X31IAAIBKwcNY4HxNdna2/P39lZWVJT8/v4vdHQAAUArn4/ub3yoCAACWQXABAACWQXABAACWQXABAACWQXABAACWQXABAACWQXABAACWQXABAACWQXABAACWQXABAACWQXABAACWQXABAACWQXABAACWQXABAACWQXABAACWQXABAACWQXABAACWQXABAACWQXABAACWQXABAACWQXABAACWQXABAACWQXABAACWQXABAACWQXABAACWQXABAACWQXABAACWQXABAACWQXABAACWQXABAACWQXABAACWQXABAACWQXABAACWQXABAACWQXABAACWQXABAACWQXABAACWQXABAACWQXABAACWQXABAACWQXABAACWQXABAACWQXABAACWQXABAACWQXABAACWQXABAACWQXABAACWQXABAACWQXABAACWQXABAACWQXABAACWQXABAACWQXABAACWQXABAACWQXABAACWQXABAACWQXABAACWQXABAACWQXABAACWQXABAACWQXABAACW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\n"
},
"metadata": {}
}
]
},
{
"cell_type": "markdown",
"source": [
"Repeat the experiment $n_{exp}=200$ times, for an horizon of $T=100$ rounds. Plot the average loss $\\bar{l}_t = \\frac{1}{t}\\sum_{s=1}^tL(i_s, j_s)$ with respect to time (averaged over the experiments). Comment."
],
"metadata": {
"id": "2IPoCKMA0Iuv"
}
},
{
"cell_type": "code",
"source": [
"def runs_experiment(T, update_fct, eta, adversary_update, eta_adv, n_exp):\n",
" # T: horizon\n",
" # update_fct: function (eta, p, l) -> p, updating p with the loss\n",
" # eta: learning rate\n",
" # adversary_update: function (eta_adv, q, l, p) -> q, updating q with the loss for the adversary\n",
" # eta_adv: learning rate for the adversary\n",
" # n_exp: number of runs\n",
" # Returns: {\"weigths_player\": np.array((n_exp, T, M)), \"loss_player_logs\": np.array((n_exp, T)), \"weigths_adv\": np.array((n_exp, T, M))}\n",
"\n",
" weights_player = np.zeros((n_exp, T, M))\n",
" loss_player_logs = np.zeros((n_exp, T))\n",
" weights_adv = np.zeros((n_exp, T, M))\n",
" for n in range(n_exp):\n",
" # ---\n",
" # ADD YOUR CODE HERE\n",
" # Run single experiments and log the results\n",
" # ---\n",
" pass\n",
" return{\"weights_player\": weights_player,\n",
" \"loss_player_logs\": loss_player_logs,\n",
" \"weights_adv\": weights_adv}"
],
"metadata": {
"id": "4PCHNgBX392z"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"T=100\n",
"eta = 1\n",
"eta_adv = 1\n",
"n_exp = 200\n",
"\n",
"results = runs_experiment(T, EWA_update, eta, fixed_adversary_update, eta_adv, n_exp)"
],
"metadata": {
"id": "aO4bO3ZeTW8o"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"plt.title(\"Average loss against a fixed adversary\")\n",
"# ---\n",
"# ADD YOUR CODE HERE\n",
"# ---"
],
"metadata": {
"id": "8pIEJ09aNx5s",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 469
},
"outputId": "92a67019-ad4a-4afb-da32-06961a80c59e"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"Text(0.5, 1.0, 'Average loss against a fixed adversary')"
]
},
"metadata": {},
"execution_count": 11
},
{
"output_type": "display_data",
"data": {
"text/plain": [
""
],
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAi4AAAGzCAYAAAAIWpzfAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA0Y0lEQVR4nO3deVyVZf7/8fcB5ODGogiikiRWuBQYKuKSWRSNjuWUI+aMotM6mmVMpWZKZomaOc64L2WN2aiZOk2aZqQ1U8xYKjPlOiYu9Q3cAgwNFK7fH/04dQSVQyhe8no+HufxkIvrvu/PfV/38by5t+MwxhgBAABYwKu6CwAAAKgoggsAALAGwQUAAFiD4AIAAKxBcAEAANYguAAAAGsQXAAAgDUILgAAwBoEFwAAYA2CC+CBiIgIDR48uLrLuGwMHjxYERER1V1GlVm8eLGioqJUq1YtBQYGSpJuvvlm3XzzzZe8lku1batr/YDKIrigjNmzZ8vhcCguLq66S0ENN3v2bL366quXZFm7du3S4MGDFRkZqQULFmj+/PmXZLkAPONT3QXg8rNkyRJFRERo8+bN2rt3r1q2bFndJeEytWDBApWUlFy0+c+ePVvBwcGX5CjXpk2bVFJSoj/96U9u+/x777130ZcNoOI44gI3WVlZ+uSTTzRt2jQ1atRIS5YsueQ1lJSU6Pvvv7/ky4XnatWqJafTWd1lVInDhw9LkusUUSlfX1/5+vpWQ0VXrjNnzqioqOiiL6egoOCiLwOXHsEFbpYsWaKgoCD16tVLffv2dQsup0+fVoMGDTRkyJAy0+Xn58vPz09PPPGEq62wsFCpqalq2bKlnE6nwsPD9dRTT6mwsNBtWofDoUceeURLlixRmzZt5HQ6tW7dOknS1KlT1blzZzVs2FC1a9dWbGysVqxYUWb5p06d0qOPPqrg4GDVr19fd955p77++ms5HA49++yzbn2//vpr/e53v1NoaKicTqfatGmjV155pdLbbN++ffr1r3+tBg0aqE6dOurUqZPWrFlTpt+MGTPUpk0b1alTR0FBQWrfvr3eeOMN1+9PnDihESNGKCIiQk6nUyEhIbrtttu0devW8y7/wIEDGjp0qK677jrVrl1bDRs21K9//Wvt37+/TN///ve/6t69u2rXrq1mzZrp+eef16JFi+RwONz6/+1vf1OvXr3UpEkTOZ1ORUZGasKECSouLnab39nXYezfv18Oh0NTp07V/PnzFRkZKafTqQ4dOujTTz91mzY7O1tDhgxRs2bN5HQ6FRYWprvuustVR0REhLZv364PP/xQDodDDofjgtdiVHR/OVtERIRSU1MlSY0aNXLbb86+BiQ5OVl+fn7auXOn2zwSExMVFBSk//u//3O1vfvuu+rWrZvq1q2r+vXrq1evXtq+fXuZ5a9evVpt27aVn5+f2rZtq1WrVl2w5lIVHStJrjGpXbu2OnbsqH/84x9uv8/JyZGPj4/Gjx9fZtrdu3fL4XBo5syZrrbc3FyNGDFC4eHhcjqdatmypSZPnux2FO6n+8T06dNd+8SOHTskXfh9UdH9+9VXX5XD4dCHH36ooUOHKiQkRM2aNdPGjRvlcDjK3aZvvPGGHA6HMjIyKraxcXkwwE9ERUWZ++67zxhjzEcffWQkmc2bN7t+/7vf/c4EBgaawsJCt+lee+01I8l8+umnxhhjiouLze23327q1KljRowYYebNm2ceeeQR4+PjY+666y63aSWZVq1amUaNGpnx48ebWbNmmW3bthljjGnWrJkZOnSomTlzppk2bZrp2LGjkWTeeecdt3n069fPSDIDBw40s2bNMv369TPR0dFGkklNTXX1y87ONs2aNTPh4eHmueeeM3PmzDF33nmnkWT++Mc/XnD7NG/e3CQnJ7vNLzQ01NSvX9+MGTPGTJs2zURHRxsvLy+zcuVKV7/58+cbSaZv375m3rx55k9/+pO57777zKOPPurqM2DAAOPr62tSUlLMwoULzeTJk03v3r3N66+/ft6a3nzzTRMdHW3GjRtn5s+fb55++mkTFBRkmjdvbgoKClz9vvrqK9OgQQPTsGFDM378eDN16lQTFRXl2k5ZWVmuvn369DH9+vUzL774opkzZ4759a9/bSSZJ554wm3ZycnJpnnz5q6fs7KyjCTTrl0707JlSzN58mQzZcoUExwcbJo1a2aKiopcfTt37mwCAgLMM888YxYuXGgmTpxoevToYT788ENjjDGrVq0yzZo1M1FRUWbx4sVm8eLF5r333jvvtqjo/nK2VatWmV/96ldGkpkzZ45ZvHix+c9//mOMMaZ79+6me/furr7ffvutadasmenQoYM5c+aMMcaYuXPnGklm8eLFrn5/+ctfjMPhMHfccYeZMWOGmTx5somIiDCBgYFu23r9+vXGy8vLtG3b1kybNs2MGTPGBAQEmDZt2rht23Op6FgtXLjQSDKdO3c2f/7zn82IESNMYGCgadGihdv63XLLLaZ169ZlljN+/Hjj7e1tsrOzjTHGFBQUmBtuuME0bNjQPP3002bu3Llm0KBBxuFwmMcee8w1Xek+0bp1a9OiRQszadIk88c//tEcOHCgQu+Liu7fixYtci2ne/fuZsaMGWbSpEmmpKTEhIeHm3vuuafMOvXs2dNERkZecBvj8kJwgctnn31mJJkNGzYYY4wpKSkxzZo1c/tPaP369UaS+fvf/+42bc+ePU2LFi1cPy9evNh4eXmZf/zjH279Sv+D//jjj11tkoyXl5fZvn17mZpOnjzp9nNRUZFp27atueWWW1xtW7ZsMZLMiBEj3PoOHjy4THC57777TFhYmDl69Khb3/79+5uAgIAyyzvb2cFlxIgRRpLbep44ccJcffXVJiIiwhQXFxtjjLnrrrtMmzZtzjvvgIAAM2zYsPP2KU95NWdkZBhJ5i9/+Yurbfjw4cbhcLhCoTHGHDt2zDRo0KBMcClvng899JCpU6eO+f77711t5wouDRs2NMePH3e1/+1vf3Pbb7799lsjybz44ovnXbc2bdq4faheSEX2l3NJTU01ksyRI0fc2s8OLsb8+D54/vnnzb59+0y9evVMnz59XL8/ceKECQwMNA888IDbdNnZ2SYgIMCtPSYmxoSFhZnc3FxX23vvvWckVSi4VGSsioqKTEhIiImJiXH7o6M0OPx0/ebNm2ckmc8//9xtnq1bt3bbjhMmTDB169Y1e/bsces3atQo4+3tbQ4ePGiM+XGf8Pf3N4cPH3brW5H3RUX379Lg0rVrV1egLDV69GjjdDrdtvHhw4eNj4+P2/8PsAOniuCyZMkShYaGqkePHpJ+OIWTlJSkpUuXug4733LLLQoODtayZctc03377bfasGGDkpKSXG1vvvmmWrVqpaioKB09etT1uuWWWyRJGzdudFt29+7d1bp16zI11a5d2205eXl56tatm9vpk9LTSkOHDnWbdvjw4W4/G2P01ltvqXfv3jLGuNWVmJiovLy8C56WOdvatWvVsWNHde3a1dVWr149Pfjgg9q/f7/rcHhgYKC++uqrMqdLfiowMFD//ve/3U41VMRPt9Hp06d17NgxtWzZUoGBgWW2U3x8vGJiYlxtDRo00G9+85vzzvPEiRM6evSounXrppMnT2rXrl0XrCkpKUlBQUGun7t16ybph9NqpfP39fXVpk2b9O2331Z8ZS+gIvtLVbj99tv10EMP6bnnntPdd98tPz8/zZs3z/X7DRs2KDc3V/fee6/bfubt7a24uDjX/v/NN98oMzNTycnJCggIcE1/2223lft+KE9Fxuqzzz7T4cOH9fDDD7tdrzN48GC35UrS3XffLR8fH7f3+BdffKEdO3aUeY9369ZNQUFBbuuYkJCg4uJiffTRR27zveeee9SoUSO3toq8Lyq6f5d64IEH5O3t7dY2aNAgFRYWup02XLZsmc6cOaPf/va351w2Lk8EF0iSiouLtXTpUvXo0UNZWVnau3ev9u7dq7i4OOXk5Cg9PV2S5OPjo3vuuUd/+9vfXNeqrFy5UqdPn3b7T+1///uftm/frkaNGrm9rr32Wkk/XghZ6uqrry63rnfeeUedOnWSn5+fGjRooEaNGmnOnDnKy8tz9Tlw4IC8vLzKzOPsu6GOHDmi3NxczZ8/v0xdpdftnF3XhRw4cEDXXXddmfZWrVq5fi9JI0eOVL169dSxY0ddc801GjZsmD7++GO3aaZMmaIvvvhC4eHh6tixo5599lnXB/35nDp1SuPGjXNdZxAcHKxGjRopNze3zHYq7w6x8tq2b9+uX/3qVwoICJC/v78aNWrk+g/+p/M8l6uuusrt59IQUxpSnE6nJk+erHfffVehoaG66aabNGXKFGVnZ19w3udTkf2lqkydOlUNGjRQZmam/vznPyskJMT1u//973+Sfgj6Z+9r7733nms/K90/rrnmmjLzL2+/Kk9Fxupcy6lVq5ZatGjh1hYcHKxbb71Vy5cvd7UtW7ZMPj4+uvvuu93Wcd26dWXWLyEhQVLF3uMVeV9UdP8+33KioqLUoUMHt2v2lixZok6dOnHXpIW4HRqSpA8++EDffPONli5dqqVLl5b5/ZIlS3T77bdLkvr376958+bp3XffVZ8+fbR8+XJFRUUpOjra1b+kpETXX3+9pk2bVu7ywsPD3X7+6V9Vpf7xj3/ozjvv1E033aTZs2crLCxMtWrV0qJFi9wu3quo0gsGf/vb3yo5ObncPjfccIPH862IVq1aaffu3XrnnXe0bt06vfXWW5o9e7bGjRvnuhCyX79+6tatm1atWqX33ntPL774oiZPnqyVK1fqF7/4xTnnPXz4cC1atEgjRoxQfHy8AgIC5HA41L9//0rdqpybm6vu3bvL399fzz33nCIjI+Xn56etW7dq5MiRFZrn2X/xljLGuP49YsQI9e7dW6tXr9b69es1duxYpaWl6YMPPlC7du08rruq95cL2bZtm+vD+fPPP9e9997r+l3pNlq8eLEaN25cZlofn6r5r7cqxqo8/fv315AhQ5SZmamYmBgtX75ct956q4KDg119SkpKdNttt+mpp54qdx6lf6SUKu89XpH3haf7d3nLkX446vLYY4/pq6++UmFhof71r3+5XWgMexBcIOmHYBISEqJZs2aV+d3KlSu1atUqzZ07V7Vr19ZNN92ksLAwLVu2TF27dtUHH3ygMWPGuE0TGRmp//znP7r11lvlcDgqVdNbb70lPz8/rV+/3u2W20WLFrn1a968uUpKSpSVleX2F+XevXvd+jVq1Ej169dXcXGx66/Cn6t58+bavXt3mfbSQ/TNmzd3tdWtW1dJSUlKSkpSUVGR7r77br3wwgsaPXq0/Pz8JElhYWEaOnSohg4dqsOHD+vGG2/UCy+8cN7gsmLFCiUnJ+ull15ytX3//ffKzc0tU+vZ20Qqu502bdqkY8eOaeXKlbrppptc7VlZWefZEpUTGRmpP/zhD/rDH/6g//3vf4qJidFLL72k119/XZI82ncqur9UhYKCAg0ZMkStW7dW586dNWXKFP3qV79Shw4dJP2wXpIUEhJy3n2tdP8oPULzU+XtV2er6Fj9dDmlp2ulH069ZGVluf3RIUl9+vTRQw895DpdtGfPHo0ePdqtT2RkpL777ruf/V660Puiovv3hfTv318pKSn661//qlOnTqlWrVpuR4lhD04VQadOndLKlSv1y1/+Un379i3zeuSRR3TixAm9/fbbkiQvLy/17dtXf//737V48WKdOXOmzH8A/fr109dff60FCxaUu7yKPF/B29tbDofD7bbO/fv3a/Xq1W79EhMTJf3wsLKfmjFjRpn53XPPPXrrrbf0xRdflFnekSNHLljT2Xr27KnNmze73U5ZUFCg+fPnKyIiwnWdwrFjx9ym8/X1VevWrWWM0enTp1VcXFzmsHdISIiaNGlS5vbxs3l7e7sdyZB+WPezb4dNTExURkaGMjMzXW3Hjx8v86ye0qMl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CC4AAMAaBBcAAGANggsAALBGpYLLrFmzFBERIT8/P8XFxWnz5s3n7Z+bm6thw4YpLCxMTqdT1157rdauXVupggEAQM3l4+kEy5YtU0pKiubOnau4uDhNnz5diYmJ2r17t0JCQsr0Lyoq0m233aaQkBCtWLFCTZs21YEDBxQYGFgV9QMAgBrEYYwxnkwQFxenDh06aObMmZKkkpIShYeHa/jw4Ro1alSZ/nPnztWLL76oXbt2qVatWpUqMj8/XwEBAcrLy5O/v3+l5gEAAC6ti/H57dGpoqKiIm3ZskUJCQk/zsDLSwkJCcrIyCh3mrffflvx8fEaNmyYQkND1bZtW02cOFHFxcXnXE5hYaHy8/PdXgAAAB4Fl6NHj6q4uFihoaFu7aGhocrOzi53mn379mnFihUqLi7W2rVrNXbsWL300kt6/vnnz7mctLQ0BQQEuF7h4eGelAkAAK5QF/2uopKSEoWEhGj+/PmKjY1VUlKSxowZo7lz555zmtGjRysvL8/1OnTo0MUuEwAAWMCji3ODg4Pl7e2tnJwct/acnBw1bty43GnCwsJUq1YteXt7u9patWql7OxsFRUVydfXt8w0TqdTTqfTk9IAAEAN4NERF19fX8XGxio9Pd3VVlJSovT0dMXHx5c7TZcuXbR3716VlJS42vbs2aOwsLByQwsAAMC5eHyqKCUlRQsWLNBrr72mnTt36ve//70KCgo0ZMgQSdKgQYM0evRoV//f//73On78uB577DHt2bNHa9as0cSJEzVs2LCqWwsAAFAjePwcl6SkJB05ckTjxo1Tdna2YmJitG7dOtcFuwcPHpSX1495KDw8XOvXr9fjjz+uG264QU2bNtVjjz2mkSNHVt1aAACAGsHj57hUB57jAgCAfar9OS4AAADVieACAACsQXABAADWILgAAABrEFwAAIA1CC4AAMAaBBcAAGANggsAALAGwQUAAFiD4AIAAKxBcAEAANYguAAAAGsQXAAAgDUILgAAwBoEFwAAYA2CCwAAsAbBBQAAWIPgAgAArEFwAQAA1iC4AAAAaxBcAACANQguAADAGgQXAABgDYILAACwBsEFAABYg+ACAACsQXABAADWILgAAABrEFwAAIA1CC4AAMAaBBcAAGANggsAALAGwQUAAFiD4AIAAKxBcAEAANYguAAAAGsQXAAAgDUILgAAwBoE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\n"
},
"metadata": {}
}
]
},
{
"cell_type": "markdown",
"source": [
"Repeat the simulations for different learning rates $\\eta\\in\\{0.01, 0.05, 0.5, 1\\}$. What are the best learning rate in practice and in theory?"
],
"metadata": {
"id": "XWPw2ibR0vi3"
}
},
{
"cell_type": "code",
"source": [
"T=100\n",
"eta_theory = None # Add the theoretical value here\n",
"eta_theory"
],
"metadata": {
"id": "Cq1EPVXBzUO5"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"def eta_experiments(T, update_fct, eta_list, adversary_update, eta_adv, n_exp):\n",
" # T: horizon\n",
" # update_fct: function (eta, p, l) -> p, updating p with the loss\n",
" # eta_list: list of learning rates to test\n",
" # adversary_update: function (eta_adv, q, p, l) -> q, updating q with the a loss for the adversary\n",
" # eta_adv: learning rate for the adversary\n",
" # n_exp: number of runs\n",
" # Returns: {\"weigths_player\": np.array((len(eta_list), n_exp, T, M)), \"incurred_loss\": np.array((len(eta_list), n_exp, T))}\n",
"\n",
" weights_player = np.zeros((len(eta_list), n_exp, T, M))\n",
" loss_player_logs = np.zeros((len(eta_list), n_exp, T))\n",
" for e in range(len(eta_list)):\n",
" eta = eta_list[e]\n",
" # ---\n",
" # ADD YOUR CODE HERE\n",
" # ---\n",
"\n",
" return{\"weights_player\": weights_player,\n",
" \"loss_player_logs\": loss_player_logs}"
],
"metadata": {
"id": "LkgV6c7Q1I8v"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"T=100\n",
"eta_list = [0.01, 0.03, 0.1, 0.3, 1]\n",
"eta_adv = 1\n",
"n_exp = 200\n",
"\n",
"results = eta_experiments(T, EWA_update, eta_list, fixed_adversary_update, eta_adv, n_exp)"
],
"metadata": {
"id": "c_w4CSRGWcXp"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"plt.title(\"Average loss with constant adversary\")\n",
"# ---\n",
"# ADD YOUR CODE HERE\n",
"# ---"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 469
},
"id": "TAiwTqJy1J6l",
"outputId": "ded8ed3f-dc8f-416f-cf3d-83a7d43a1983"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"Text(0.5, 1.0, 'Average loss with constant adversary')"
]
},
"metadata": {},
"execution_count": 15
},
{
"output_type": "display_data",
"data": {
"text/plain": [
""
],
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAi4AAAGzCAYAAAAIWpzfAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA0yklEQVR4nO3de1yUZf7/8TegzOAB0IRBFCWsPJ9CIQ/oaiS7mWblStl66pxWGr9KzRIPm5iV0ddDpGW1ZatZZm0apqyuZu7aam4HD2VS2gGQLUGtQJjr90cPZhsBZUjES1/Px2P+4OK65v7c9zXDvLlP42eMMQIAALCAf20XAAAAUFUEFwAAYA2CCwAAsAbBBQAAWIPgAgAArEFwAQAA1iC4AAAAaxBcAACANQguAADAGgQX4DeKjo7W6NGja7uM0+J3v/udfve731W5b4cOHWq2IJxW06ZNk5+fX22XAfwmBBdUycKFC+Xn56f4+PjaLgVn0Lfffqtp06Zp586dtV3KGfP+++9r2rRpOnz4cI0va9euXZo2bZq+/PLLGl8WcK4guKBKli5dqujoaG3btk379u2r7XJQQ9599129++67np+//fZbTZ8+/bwLLtOnTz9jwWX69OkEF8AHBBecUnZ2tt5//33NnTtXYWFhWrp06Rmvwe126+effz7jyz3fBAYGKjAwsLbLwDnEGKOffvqpxpdTUlKi4uLiGl8Oah/BBae0dOlSNWrUSAMHDtTQoUO9gsvx48fVuHFjjRkzpty4wsJCOZ1O3XfffZ62oqIipaam6qKLLpLD4VBUVJQeeOABFRUVeY318/PTXXfdpaVLl6p9+/ZyOBzKzMyUJD3++OPq2bOnLrjgAgUFBSk2NlavvfZaueX/9NNPuueee9SkSRM1bNhQgwcP1jfffCM/Pz9NmzbNq+8333yjm266SS6XSw6HQ+3bt9eSJUuqvc3279+vP/7xj2rcuLHq1aunyy67TKtXry7Xb968eWrfvr3q1aunRo0aqVu3bnrllVc8vz9y5IgmTJig6OhoORwOhYeH64orrtCOHTsqXfZHH30kPz8/vfXWW5627du3y8/PT5deeqlX3z/84Q9eh/9+fY7Lxo0b1b17d0nSmDFj5OfnJz8/P73wwgtez7Fr1y7169dP9erVU7NmzTRnzpwqb6eXX35ZcXFxnvXv06eP1x4f6ZfDlGWvgcjISI0bN67c3pCy822qUsvJtvm0adN0//33S5IuvPBCzzqX7RF5/vnn1b9/f4WHh8vhcKhdu3Z6+umnyy0jOjpaV111ld577z3FxcXJ6XQqJiZGf/nLXzx9XnjhBf3xj3+UJPXr18+zrI0bN1a6vT766CONHj1aMTExcjqdioiI0E033aT//ve/5fq+99576t69u5xOp1q1aqVnnnmmXJ8OHTqoX79+5drdbreaNWumoUOHerWlp6erffv2cjqdcrlcuv322/XDDz9UuO5r165Vt27dFBQU5Fn2unXr1Lt3b4WGhqpBgwZq3bq1HnzwQc/Y4uJiTZ06VbGxsQoJCVH9+vWVkJCgDRs2eC3jyy+/lJ+fnx5//HGlp6erVatWcjgc2rZtm+rXr6/x48eXW6evv/5aAQEBSktLq3T7whIGOIU2bdqYm2++2RhjzKZNm4wks23bNs/vb7rpJhMaGmqKioq8xr344otGkvnggw+MMcaUlpaaAQMGmHr16pkJEyaYZ555xtx1112mTp065uqrr/YaK8m0bdvWhIWFmenTp5sFCxaYDz/80BhjTPPmzc3YsWPN/Pnzzdy5c01cXJyRZN5++22v5xg2bJiRZEaMGGEWLFhghg0bZjp37mwkmdTUVE+/nJwc07x5cxMVFWVmzJhhnn76aTN48GAjyTz55JOn3D4tW7Y0o0aN8no+l8tlGjZsaKZMmWLmzp1rOnfubPz9/c3KlSs9/RYtWmQkmaFDh5pnnnnGPPXUU+bmm28299xzj6fP8OHDTWBgoElJSTHPPvusefTRR82gQYPMyy+/XGk9paWlJjQ01Py///f/PG1PPvmk8ff3N/7+/qagoMDTLzg42Nx3332efn379jV9+/b1rMeMGTOMJHPbbbeZl156ybz00kvmiy++8PSNjIw0UVFRZvz48WbhwoWmf//+RpJZs2bNKbfbtGnTjCTTs2dP89hjj5mnnnrKDB8+3EycONHTJzU11UgyiYmJZt68eeauu+4yAQEBpnv37qa4uNir7qrUcqpt/p///MfccMMNnrkvW+ejR48aY4zp3r27GT16tHnyySfNvHnzzIABA4wkM3/+fK91a9mypWndurVxuVzmwQcfNPPnzzeXXnqp8fPzM5988okxxpgvvvjC3HPPPUaSefDBBz3LysnJqXSbPf744yYhIcHMmDHDLFq0yIwfP94EBQWZuLg443a7Pf0++ugjExQUZFq0aGHS0tLMzJkzjcvlMp06dTK//rM/Y8YM4+/vb7777juv5fzjH/8wksyKFSs8bbfccoupU6eOufXWW01GRoaZOHGiqV+/frm5aNmypbnoootMo0aNzKRJk0xGRobZsGGD+eSTT0xgYKDp1q2beeqpp0xGRoa57777TJ8+fTxjDx06ZJo2bWpSUlLM008/bebMmWNat25t6tat63n/G2NMdna2kWTatWtnYmJizOzZs82TTz5pvvrqK3PjjTcal8tlSkpKvNZpzpw5xs/Pz3z11VeVbl/YgeCCk/r3v/9tJJl169YZY4xxu92mefPmZvz48Z4+a9euNZLM3/72N6+xV155pYmJifH8/NJLLxl/f3+zefNmr34ZGRlGktmyZYunTZLx9/c3n376abmafvzxR6+fi4uLTYcOHUz//v09bdu3bzeSzIQJE7z6jh49ulxwufnmm03Tpk1Nfn6+V9/rr7/ehISElFveiU4MLhMmTDCSvNbzyJEj5sILLzTR0dGmtLTUGGPM1Vdfbdq3b3/S5w4JCTHjxo07aZ+KDBw40MTFxXl+vvbaa821115rAgICzDvvvGOMMWbHjh1GknnzzTc9/X4dXIwx5oMPPjCSzPPPP19uGX379jWSzF/+8hdPW1FRkYmIiDDXXXfdSev7/PPPjb+/v7nmmms826NM2QdwXl6eCQwMNAMGDPDqM3/+fCPJLFmyxOdaqrLNH3vsMSPJZGdnl/tdRa+FpKQkr9e5Mb+8JiSZTZs2edry8vKMw+HwCpQrVqwwksyGDRtOWtPJlv/Xv/613LKGDBlinE6n14f0rl27TEBAgFdw2bt3r5Fk5s2b5/WcY8eONQ0aNPAsb/PmzUaSWbp0qVe/zMzMcu1l656ZmenV98knnzSSzKFDhypdv5KSknL/AP3www/G5XKZm266ydNWFlyCg4NNXl6eV/+yv0dlr/MynTp18nptw14cKsJJLV26VC6Xy7M72c/PT8nJyVq2bJlKS0slSf3791eTJk20fPlyz7gffvhB69atU3JysqdtxYoVatu2rdq0aaP8/HzPo3///pJUbndw37591a5du3I1BQUFeS2noKBACQkJXodPyg4rjR071mvs3Xff7fWzMUavv/66Bg0aJGOMV11JSUkqKCg46WGZiqxZs0ZxcXHq3bu3p61Bgwa67bbb9OWXX2rXrl2SpNDQUH399df64IMPKn2u0NBQ/etf/9K3337rUw1l2+PYsWOSfjlscOWVV6pLly7avHmzJGnz5s3y8/PzqtNXDRo00J/+9CfPz4GBgYqLi9P+/ftPOm7VqlVyu92aOnWq/P29/wyVXa67fv16FRcXa8KECV59br31VgUHB5c79FaVWqqyzU/m16+9goIC5efnq2/fvtq/f78KCgq8+rZr104JCQmen8PCwtS6detTbpuqLv/nn39Wfn6+LrvsMknyvE5LS0u1du1aDRkyRC1atPD0b9u2rZKSkrye75JLLlGXLl283rulpaV67bXXNGjQIM/yVqxYoZCQEF1xxRVe75HY2Fg1aNCg3Hv3wgsvLLes0NBQSdKbb74pt9td4foFBAR4zrFyu936/vvvVVJSom7dulX4PrzuuusUFhbm1ZaYmKjIyEivQ9qffPKJPvroI6/XB+xFcEGlSktLtWzZMvXr10/Z2dnat2+f9u3bp/j4eOXm5iorK0uSVKdOHV133XV68803PeeqrFy5UsePH/cKLp9//rk+/fRThYWFeT0uueQSSVJeXp7X8i+88MIK63r77bd12WWXyel0qnHjxgoLC9PTTz/t9cHx1Vdfyd/fv9xzXHTRRV4/Hzp0SIcPH9aiRYvK1VV23s6JdZ3KV199pdatW5drb9u2ref3kjRx4kQ1aNBAcXFxuvjiizVu3Dht2bLFa8ycOXP0ySefKCoqSnFxcZo2bVqVPvgSEhJUUlKirVu3au/evcrLy1NCQoL69OnjFVzatWunxo0b+7R+v9a8efNy9wVp1KhRufMeTvTFF1/I39+/wmBapmw7nbgtAwMDFRMT4/m9L7VUZZufzJYtW5SYmKj69esrNDRUYWFhnnM0Tgwuvw4NldXjq++//17jx4+Xy+VSUFCQwsLCPK/xsuUfOnRIP/30ky6++OJy4yt6XSYnJ2vLli365ptvJP1yblNeXl65925BQYHCw8PLvU+OHj1apfducnKyevXqpVtuuUUul0vXX3+9Xn311XIh5sUXX1SnTp3kdDp1wQUXKCwsTKtXry63fStbjr+/v2688UatWrVKP/74o6Rf/gFzOp2ec4pgN4ILKvX3v/9d3333nZYtW6aLL77Y8xg2bJgkef1Hc/311+vIkSN65513JEmvvvqq2rRpo86dO3v6uN1udezYUevWravwceLekV//d1lm8+bNGjx4sJxOpxYuXKg1a9Zo3bp1Gj58uIwxPq9j2R/NP/3pT5XW1atXL5+ftyratm2rvXv3atmyZerdu7def/119e7dW6mpqZ4+w4YN0/79+zVv3jxFRkbqscceU/v27T3buTLdunWT0+nUpk2btHnzZoWHh+uSSy5RQkKCtm3bpqKiIm3evNlrj0B1BAQEVNhenbn4rapSS1W2eWW++OILXX755crPz9fcuXO1evVqrVu3Tvfee68klfsAroltM2zYMC1evFh33HGHVq5cqXfffdezd7GyvRinkpycLGOMVqxYIemX925ISIh+//vfe/q43W6Fh4dX+h6ZMWOG13NW9N4NCgrSpk2btH79eo0YMUIfffSRkpOTdcUVV3j23r788ssaPXq0WrVqpeeee06ZmZlat26d+vfvX+H6VbQcSRo5cqSOHj2qVatWyRijV155RVdddZVCQkKqtY1wdqlT2wXg7LV06VKFh4drwYIF5X63cuVKvfHGG8rIyFBQUJD69Omjpk2bavny5erdu7f+/ve/a8qUKV5jWrVqpf/85z+6/PLLq333ztdff11Op1Nr166Vw+HwtD///PNe/Vq2bCm3263s7Gyv/zxPvAdNWFiYGjZsqNLSUiUmJlarphO1bNlSe/fuLde+Z88ez+/L1K9fX8nJyUpOTlZxcbGuvfZaPfLII5o8ebKcTqckqWnTpho7dqzGjh2rvLw8XXrppXrkkUf0hz/8odIayg6TbN68WS1atPAElISEBBUVFWnp0qXKzc1Vnz59TrouNXWX1VatWsntdmvXrl3q0qVLhX3KttPevXsVExPjaS8uLlZ2dna15+tU27yydf7b3/6moqIivfXWW157U048TOILX7bvDz/8oKysLE2fPl1Tp071tH/++ede/cLCwhQUFFSuXVKFr8sLL7xQcXFxWr58ue666y6tXLlSQ4YM8Xp/tWrVSuvXr1evXr0qDQtV4e/vr8svv1yXX3655s6dq1mzZmnKlCnasGGDEhMT9dprrykmJkYrV6702jZVCZa/1qFDB3Xt2lVLly5V8+bNdeDAAc2bN6/adePswh4XVOinn37SypUrddVVV2no0KHlHnfddZeOHDniueTW399fQ4cO1d/+9je99NJLKikp8drVLP3y3+I333yjxYsXV7i8svMxTiYgIEB+fn6e/9CkXy6NXLVqlVe/suPrCxcu9Go/8Y9XQECArrvuOr3++uv65JNPyi3v0KFDp6zpRFdeeaW2bdumrVu3etqOHTumRYsWKTo62nN45MRLWAMDA9WuXTsZY3T8+HGVlpaW2z0eHh6uyMjIcpePVyQhIUH/+te/tGHDBk9wadKkidq2batHH33U0+dk6tevL0mn/WZsQ4YMkb+/v2bMmFHuP+myPRKJiYkKDAzU//3f/3ntpXjuuedUUFCggQMH+rzcU21zqfJ1LtuD8utaCgoKyoVmX/iyfStaviSlp6eX65eUlKRVq1bpwIEDnvbdu3dr7dq1FT53cnKy/vnPf2rJkiXKz8+v8L1bWlqqmTNnlhtbUlJSpfq///77cm1lobXs9VzROv7rX//yei9V1YgRI/Tuu+8qPT1dF1xwwUmDPuzCHhdU6K233tKRI0c0ePDgCn9/2WWXeW5GV/ZHLjk5WfPmzVNqaqo6duzoOaejzIgRI/Tqq6/qjjvu0IYNG9SrVy+VlpZqz549evXVVz33fTiZgQMHau7cufr973+v4cOHKy8vTwsWLNBFF12kjz76yNMvNjZW1113ndLT0/Xf//5Xl112mf7xj3/os88+k+T9n+7s2bO1YcMGxcfH69Zbb1W7du30/fffa8eOHVq/fn2Ff3BPZtKkSfrrX/+qP/zhD7rnnnvUuHFjvfjii8rOztbrr7/uOdF0wIABioiIUK9eveRyubR7927Nnz9fAwcOVMOGDXX48GE1b95cQ4cOVefOndWgQQOtX79eH3zwgZ544olT1pGQkKBHHnlEBw8e9Aooffr00TPPPKPo6Gg1b978pM/RqlUrhYaGKiMjQw0bNlT9+vUVHx9f6flHVXXRRRdpypQpmjlzphISEnTttdfK4XDogw8+UGRkpNLS0hQWFqbJkydr+vTp+v3vf6/Bgwdr7969Wrhwobp3716tEy1Ptc2lX147kjRlyhRdf/31qlu3rgYNGqQBAwYoMDBQgwYN0u23366jR49q8eLFCg8P13fffVet7dClSxcFBATo0UcfVUFBgRwOh+c+MScKDg5Wnz59NGfOHB0/flzNmjXTu+++q+zs7HJ9p0+frszMTCUkJGjs2LEqKSnx3L/m1++TMsOGDdN9992n++67T40bNy63N6tv3766/fbblZaWpp07d2rAgAGqW7euPv/8c61YsUJPPfWU1z1fKjJjxgxt2rRJAwcOVMuWLZWXl6eFCxeqefPmnhPEr7rqKq1cuVLXXHONBg4cqOzsbGVkZKhdu3Y6evSoL5tWw4cP1wMPPKA33nhDd955p+rWrevTeJzFauFKJlhg0KBBxul0mmPHjlXaZ/To0aZu3bqey4jdbreJiooyksyf//znCscUFxebRx991LRv3944HA7TqFEjExsba6ZPn+65v4gxv1wOXdllwM8995y5+OKLjcPhMG3atDHPP/+8534fv3bs2DEzbtw407hxY9OgQQMzZMgQz+Wfs2fP9uqbm5trxo0bZ6KiokzdunVNRESEufzyy82iRYtOua1OvBzamF/u0TF06FATGhpqnE6niYuLK3efmWeeecb06dPHXHDBBcbhcJhWrVqZ+++/37MdioqKzP333286d+5sGjZsaOrXr286d+5sFi5ceMqajDGmsLDQBAQEmIYNG3rd0+Lll1/23N/mRCdeDm2MMW+++aZp166dqVOnjtel0X379q3w0uJRo0aZli1bVqnGJUuWmK5du3peC3379vVcel9m/vz5pk2bNqZu3brG5XKZO++80/zwww/l6q5KLafa5mVmzpxpmjVrZvz9/b0ujX7rrbdMp06djNPpNNHR0ebRRx81S5YsKXf5dMuWLc3AgQPL1VPR9l28eLGJiYnxXKp8skujv/76a3PNNdeY0NBQExISYv74xz+ab7/9ttwl/sb8ci+W2NhYExgYaGJiYkxGRkaF75MyvXr1MpLMLbfcUunyFy1aZGJjY01QUJBp2LCh6dixo3nggQfMt99+e8p1z8rKMldffbWJjIw0gYGBJjIy0txwww3ms88+8/Rxu91m1qxZpmXLlsbhcJiuXbuat99+u9w8ll0O/dhjj1VaqzG/3JJBknn//fdP2g928TOmFs6iA2rJzp071bVrV7388su68cYba7scADXommuu0ccff8z3q51jOMcF56yKvh8lPT1d/v7+pzwpFYDdvvvuO61evVojRoyo7VJwmnGOC85Zc+bM0fbt29WvXz/VqVNH77zzjt555x3ddtttioqKqu3yANSA7OxsbdmyRc8++6zq1q2r22+/vbZLwmlGcME5q2fPnlq3bp1mzpypo0ePqkWLFpo2bVq5y7QBnDv+8Y9/aMyY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D6ozFyeaOHGiIiMjy7044ZvqzMV7772n5557Tjt37jwDFZ4/qjMX+/fv19///nfdeOONWrNmjfbt26exY8fq+PHjSk1NPRNln5OqMxfDhw9Xfn6+evfuLWOMSkpKdMcdd+jBBx88EyXjVyr77C4sLNRPP/2koKCgKj1Pre9xwblj9uzZWrZsmd544w05nc7aLue8cuTIEY0YMUKLFy9WkyZNaruc857b7VZ4eLgWLVqk2NhYJScna8qUKcrIyKjt0s47Gzdu1KxZs7Rw4ULt2LFDK1eu1OrVqzVz5szaLg3VVOt7XJo0aaKAgADl5uZ6tefm5ioiIqLCMRERET71R9VUZy7KPP7445o9e7bWr1+vTp061WSZ5wVf5+KLL77Ql19+qUGDBnna3G63JKlOnTrau3evWrVqVbNFn6Oq875o2rSp6tatq4CAAE9b27ZtlZOTo+LiYgUGBtZozeeq6szFww8/rBEjRuiWW26RJHXs2FHHjh3TbbfdpilTpnh9KTBqVmWf3cHBwVXe2yKdBXtcAgMDFRsbq6ysLE+b2+1WVlaWevToUeGYHj16ePWXpHXr1lXaH1VTnbmQpDlz5mjmzJnKzMxUt27dzkSp5zxf56JNmzb6+OOPtXPnTs9j8ODB6tevn3bu3KmoqKgzWf45pTrvi169emnfvn2e8ChJn332mZo2bUpo+Q2qMxc//vhjuXBSFigN3zF8Rp22z27fzhuuGcuWLTMOh8O88MILZteuXea2224zoaGhJicnxxhjzIgRI8ykSZM8/bds2WLq1KljHn/8cbN7926TmprK5dCnia9zMXv2bBMYGGhee+01891333keR44cqa1VOGf4Ohcn4qqi08fXuThw4IBp2LChueuuu8zevXvN22+/bcLDw82f//zn2lqFc4avc5GammoaNmxo/vrXv5r9+/ebd99917Rq1coMGzastlbhnHHkyBHz4Ycfmg8//NBIMnPnzjUffvih+eqrr4wxxkyaNMmMGDHC07/scuj777/f7N692yxYsMDey6GNMWbevHmmRYsWJjAw0MTFxZl//vOfnt/17dvXjBo1yqv/q6++ai655BITGBho2rdvb1avXn2GKz53+TIXLVu2NJLKPVJTU8984ecgX98Xv0ZwOb18nYv333/fxMfHG4fDYWJiYswjjzxiSkpKznDV5yZf5uL48eNm2rRpplWrVsbpdJqoqCgzduxY88MPP5z5ws8xGzZsqPDvf9n2HzVqlOnbt2+5MV26dDGBgYEmJibGPP/88z4v188Y9pUBAAA71Po5LgAAAFVFcAEAANYguAAAAGsQXAAAgDUILgAAwBoEFwAAYA2CCwAAsAbBBQAAWIPgAgAArEFwAQAA1iC4AAAAa/x/q4Am1qy8l9kAAAAASUVORK5CYII=\n"
},
"metadata": {}
}
]
},
{
"cell_type": "markdown",
"source": [
"For each of these learning rate, plot the evolution of the weights for one of the runs."
],
"metadata": {
"id": "HcXJXFtEiCT_"
}
},
{
"cell_type": "code",
"source": [
"# ---\n",
"# ADD YOUR CODE HERE\n",
"# ---"
],
"metadata": {
"id": "rAQ_hiQgZCZ_"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"#### Adversarial adversary\n",
"\n",
"Now, repeat the experiments with an adversary always taking the worst possible action for the player (if several actions are possible, it samples one randomly). Comment."
],
"metadata": {
"id": "1nhOK7ERzHYv"
}
},
{
"cell_type": "code",
"source": [
"def adversarial_adversary_update(eta_adv, q, l, p):\n",
" # eta_adv: learning rate for the adversary\n",
" # q: an np.array of shape (M,); vector of weights in Delta_M used in round t-1 by the adversary\n",
" # l: an np.array of shape (M,t); vector of losses in [-1, 1]^M incurred by the adversary\n",
" # p: an np.array of shape (M,); vector of weights in Delta_M used in round t by the player\n",
" # Returns: q_adversarial\n",
"\n",
" # ---\n",
" # ADD YOUR CODE HERE\n",
" # ---\n",
" return"
],
"metadata": {
"id": "9XTIcUZ0EmbT"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"T=100\n",
"eta_list = [0.01, 0.03, 0.1, 0.3, 1]\n",
"eta_adv=1\n",
"n_exp = 200\n",
"\n",
"results = eta_experiments(T, EWA_update, eta_list, adversarial_adversary_update, eta_adv, n_exp)"
],
"metadata": {
"id": "i3404vyzJSPV"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"plt.title(\"Average loss with adversarial adversary\")\n",
"# ---\n",
"# ADD YOUR CODE HERE\n",
"# ---"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 469
},
"id": "PBnJh0PuJcwb",
"outputId": "d3e3ba51-1b8a-4162-8a84-3e787d2ecc76"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"Text(0.5, 1.0, 'Average loss with adversarial adversary')"
]
},
"metadata": {},
"execution_count": 19
},
{
"output_type": "display_data",
"data": {
"text/plain": [
""
],
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAi4AAAGzCAYAAAAIWpzfAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAwxElEQVR4nO3de1TU1d7H8Q+gDJoKGHLRUNI075cwEA0vRVJ6NCuLtOMtzeORymLVUdNAS8WszGeZl7SynhOFplbm3Uif8nIyb6fyVqalqaBkgmGBMvv5w+WcM4LKkIpb3q+15o/Z7P37fee3B+bD7zZexhgjAAAAC3iXdQEAAAAlRXABAADWILgAAABrEFwAAIA1CC4AAMAaBBcAAGANggsAALAGwQUAAFiD4AIAAKxBcAGKERERof79+5d1GZdEx44d1bFjxxL3bdq06eUt6AKupe1+PmPGjJGXl1epxnoyl39GeZgH2IvgUo5Nnz5dXl5eio6OLutScAUdOnRIY8aM0bZt28q6FADwGMGlHEtLS1NERIQ2btyoPXv2lHU5uExWrlyplStXup4fOnRIY8eOJbiUkdGjR+v3338v6zIAaxFcyql9+/Zp/fr1mjx5smrUqKG0tLQrXoPT6dQff/xxxddb3vj6+srX17esy7hq/fHHH3I6nZd9PXl5eZKkChUqyM/P77KvzzZXeh5gL4JLOZWWlqbAwEB17dpVPXv2dAsup06dUvXq1TVgwIAi43Jzc+Xn56enn37a1Zafn6+UlBTddNNNcjgcCg8P1z/+8Q/l5+e7jfXy8tJjjz2mtLQ0NWnSRA6HQ8uXL5ckvfzyy2rbtq2uv/56VapUSZGRkZo/f36R9f/+++964oknFBQUpKpVq6p79+46ePCgvLy8NGbMGLe+Bw8e1COPPKKQkBA5HA41adJEb731Vqm32d69e/XAAw+oevXqqly5stq0aaMlS5YU6Td16lQ1adJElStXVmBgoFq3bq333nvP9fMTJ07oySefVEREhBwOh4KDg3XnnXdqy5Yt5133119/LS8vLy1atMjVtnnzZnl5eemWW25x63v33Xe7Hf777/Mi1qxZo1tvvVWSNGDAAHl5ecnLy0tvv/222zJ27NihTp06qXLlyqpVq5YmTZpUom00Z84c3X777QoODpbD4VDjxo01Y8aMIv2MMRo3bpxuuOEGVa5cWZ06ddL27dvd+mzatEleXl565513ioxfsWKFvLy8tHjxYldbSeZ7zZo18vLyUnp6ukaPHq1atWqpcuXKys3N1alTpzR27FjVr19ffn5+uv7663Xbbbdp1apVrvFff/21+vfvr7p168rPz0+hoaF65JFH9Msvv7it5+x5LDt27FDv3r0VGBio2267ze1npdluJcU8nHG+eZgzZ468vLy0devWIq9pwoQJ8vHx0cGDB0u2sXHFVSjrAlA20tLSdN9998nX11e9evXSjBkz9NVXX+nWW29VxYoVde+992rhwoV6/fXX3f5b/+ijj5Sfn6+HHnpI0pm9Jt27d9fatWs1ePBgNWrUSN98841effVVfffdd/roo4/c1vvZZ59p3rx5euyxxxQUFKSIiAhJ0v/8z/+oe/fuevjhh1VQUKD09HQ98MADWrx4sbp27eoa379/f82bN099+vRRmzZt9H//939uPz8rKytLbdq0cYWlGjVqaNmyZRo4cKByc3P15JNPerS9srKy1LZtW508eVJPPPGErr/+er3zzjvq3r275s+fr3vvvVeSNHv2bD3xxBPq2bOnhg0bpj/++ENff/21vvzyS/Xu3VuSNGTIEM2fP1+PPfaYGjdurF9++UVr167Vzp07i4SQs5o2baqAgAB9/vnn6t69uyTpiy++kLe3t/79738rNzdX1apVk9Pp1Pr16zV48OBil9OoUSM9//zzSk5O1uDBgxUbGytJatu2ravPr7/+qrvuukv33XefHnzwQc2fP1/Dhw9Xs2bNdPfdd19wO82YMUNNmjRR9+7dVaFCBX3yyScaOnSonE6nEhMTXf2Sk5M1btw4denSRV26dNGWLVvUuXNnFRQUuPq0bt1adevW1bx589SvXz+39cydO1eBgYGKj493zY8n8/3CCy/I19dXTz/9tPLz8+Xr66sxY8YoNTVVgwYNUlRUlHJzc7Vp0yZt2bJFd955pyRp1apV2rt3rwYMGKDQ0FBt375ds2bN0vbt2/Wvf/2rSCB54IEHVL9+fU2YMEHGmD+93UqKebjwPPTs2VOJiYlKS0tTq1at3PqmpaWpY8eOqlWrlsfbHVeIQbmzadMmI8msWrXKGGOM0+k0N9xwgxk2bJirz4oVK4wk88knn7iN7dKli6lbt67r+T//+U/j7e1tvvjiC7d+M2fONJLMunXrXG2SjLe3t9m+fXuRmk6ePOn2vKCgwDRt2tTcfvvtrrbNmzcbSebJJ59069u/f38jyaSkpLjaBg4caMLCwkx2drZb34ceesj4+/sXWd+56tSpY/r16+d6/uSTTxpJbq/zxIkT5sYbbzQRERGmsLDQGGPMPffcY5o0aXLBZfv7+5vExMQL9ilO165dTVRUlOv5fffdZ+677z7j4+Njli1bZowxZsuWLUaS+fjjj139OnToYDp06OB6/tVXXxlJZs6cOUXW0aFDByPJ/O///q+rLT8/34SGhpr777//ojUWt13j4+Pd3jNHjhwxvr6+pmvXrsbpdLran332WSPJbbuPHDnSVKxY0Rw7dsytnoCAAPPII4+42ko636tXrzaSTN26dYvU2qJFC9O1a1ePX9/7779vJJnPP//c1ZaSkmIkmV69ehXpf/ZnF1vuudvNmKJz6UmdzIO7Xr16mZo1a7p+d435z+9Pcb8buHpwqKgcSktLU0hIiDp16iTpzCGchIQEpaenq7CwUJJ0++23KygoSHPnznWN+/XXX7Vq1SolJCS42j744AM1atRIDRs2VHZ2tutx++23S5JWr17ttu4OHTqocePGRWqqVKmS23pycnIUGxvrdvjk7GGloUOHuo19/PHH3Z4bY7RgwQJ169ZNxhi3uuLj45WTk3PBwzLFWbp0qaKioly7+yWpSpUqGjx4sH788Uft2LFDkhQQEKCff/5ZX3311XmXFRAQoC+//FKHDh3yqIaz2+PsMfq1a9eqS5cuatmypb744gtJZ/bCeHl5udXpqSpVquivf/2r67mvr6+ioqK0d+/ei47973nMyclRdna2OnTooL179yonJ0eS9Omnn6qgoECPP/6423/Gxe0FS0hI0KlTp7Rw4UJX28qVK3X8+HHX+7A0892vXz+3WqUz87J9+3Z9//33JXp9f/zxh7Kzs9WmTRtJKvY9NWTIkPMu63zLPd928wTz4K64eejbt68OHTrk9jcqLS1NlSpV0v3333/edaPsEVzKmcLCQqWnp6tTp07at2+f9uzZoz179ig6OlpZWVnKyMiQdOYEwvvvv18ff/yx61yVhQsX6tSpU27B5fvvv9f27dtVo0YNt0eDBg0kSUeOHHFb/4033lhsXYsXL1abNm3k5+en6tWrq0aNGpoxY4bbH+2ffvpJ3t7eRZZx0003uT0/evSojh8/rlmzZhWp6+x5O+fWdTE//fSTbr755iLtjRo1cv1ckoYPH64qVaooKipK9evXV2JiotatW+c2ZtKkSfr2228VHh6uqKgojRkzpkShIDY2VqdPn9aGDRu0e/duHTlyRLGxsWrfvr1bcGncuLGqV6/u0ev7bzfccEORXe2BgYH69ddfLzp23bp1iouL03XXXaeAgADVqFFDzz77rCS55vLstqpfv77b2Bo1aigwMNCtrUWLFmrYsKFbgJ47d66CgoJc4bg0813c+/D555/X8ePH1aBBAzVr1kzPPPOMvv76a7c+x44d07BhwxQSEqJKlSqpRo0armUVFzDO934/V0m2myeYB3fFrefOO+9UWFiY6/w+p9Op999/X/fcc4+qVq1apD+uHpzjUs589tlnOnz4sNLT05Wenl7k52lpaercubMk6aGHHtLrr7+uZcuWqUePHpo3b54aNmyoFi1auPo7nU41a9ZMkydPLnZ94eHhbs/P/e9KOvNh2717d7Vv317Tp09XWFiYKlasqDlz5rid1FpSZ69M+Otf/1rkmPxZzZs393i5JdGoUSPt3r1bixcv1vLly7VgwQJNnz5dycnJGjt2rCTpwQcfVGxsrD788EOtXLlSL730kl588UUtXLjwgueQtG7dWn5+fvr8889Vu3ZtBQcHq0GDBoqNjdX06dOVn5+vL774wnW+TWn5+PgU224ucI6GJP3www+644471LBhQ02ePFnh4eHy9fXV0qVL9eqrr5b6ipGEhASNHz9e2dnZqlq1qhYtWqRevXqpQoUzf75KM9/FvQ/bt2+vH374QR9//LFWrlypN954Q6+++qpmzpypQYMGSTozd+vXr9czzzyjli1bqkqVKnI6nbrrrruKfX3Fredcl3q7MQ8lmwcfHx/17t1bs2fP1vTp07Vu3TodOnTIbW8jrk4El3ImLS1NwcHBmjZtWpGfLVy4UB9++KFmzpypSpUqqX379goLC9PcuXN122236bPPPtOoUaPcxtSrV0///ve/dccdd5T6bqALFiyQn5+fVqxYIYfD4WqfM2eOW786derI6XRq3759bv8lnnsPmho1aqhq1aoqLCxUXFxcqWo6V506dbR79+4i7bt27XL9/KzrrrtOCQkJSkhIUEFBge677z6NHz9eI0eOdF0GGxYWpqFDh2ro0KE6cuSIbrnlFo0fP/6CweXsIZsvvvhCtWvXdp1YGxsbq/z8fKWlpSkrK0vt27e/4Gsp7TxdzCeffKL8/HwtWrRItWvXdrWfe7jw7Lb6/vvvVbduXVf70aNHi92rk5CQoLFjx2rBggUKCQlRbm6u6+Rw6dLO99mr6QYMGKDffvtN7du315gxYzRo0CD9+uuvysjI0NixY5WcnOwac6FDGiVR0u12qZfHPJw5XPTKK6/ok08+0bJly1SjRg3Xica4enGoqBz5/ffftXDhQv3lL39Rz549izwee+wxnThxwnXJrbe3t3r27KlPPvlE//znP3X69Gm3w0TSmf98Dh48qNmzZxe7vpLcM8HHx0deXl6u82sk6ccffyxyRdLZPyjTp093a586dWqR5d1///1asGCBvv322yLrO3r06EVrOleXLl20ceNGbdiwwdWWl5enWbNmKSIiwnXezrmXY/r6+qpx48YyxujUqVMqLCwssis7ODhYNWvWLHL5eHFiY2P15ZdfavXq1a7gEhQUpEaNGunFF1909bmQ6667TpJ0/Pjxi67PE2f31Pz3npmcnJwiATQuLk4VK1bU1KlT3fpOmTKl2OU2atRIzZo109y5czV37lyFhYW5hbNLNd/nzl2VKlV00003uealuNd3obpLqqTb7VIvj3k4sweoefPmeuONN7RgwQI99NBDrj1IuHoxQ+XIokWLdOLECdfltOdq06aN62Z0ZwNKQkKCpk6dqpSUFDVr1sx1TsdZffr00bx58zRkyBCtXr1a7dq1U2FhoXbt2qV58+ZpxYoVat269QXr6tq1qyZPnqy77rpLvXv31pEjRzRt2jTddNNNbse2IyMjdf/992vKlCn65ZdfXJdDf/fdd5Lc9yRMnDhRq1evVnR0tB599FE1btxYx44d05YtW/Tpp5/q2LFjHm27ESNG6P3339fdd9+tJ554QtWrV9c777yjffv2acGCBfL2PvM/QOfOnRUaGqp27dopJCREO3fu1GuvvaauXbuqatWqOn78uG644Qb17NlTLVq0UJUqVfTpp5/qq6++0iuvvHLROmJjYzV+/HgdOHDALaC0b99er7/+uiIiInTDDTdccBn16tVTQECAZs6cqapVq+q6665TdHR0ic/HOJ/OnTvL19dX3bp109/+9jf99ttvmj17toKDg3X48GFXvxo1aujpp59Wamqq/vKXv6hLly7aunWrli1bpqCgoGKXnZCQoOTkZPn5+WngwIGu7X3WpZjvxo0bq2PHjoqMjFT16tW1adMm12XrklStWjW1b99ekyZN0qlTp1SrVi2tXLlS+/bt+xNbreTb7VIvj3k4o2/fvq77UnGYyBJlcCUTyki3bt2Mn5+fycvLO2+f/v37m4oVK7ouZ3Q6nSY8PNxIMuPGjSt2TEFBgXnxxRdNkyZNjMPhMIGBgSYyMtKMHTvW5OTkuPpJOu9lwG+++aapX7++cTgcpmHDhmbOnDnFXjaal5dnEhMTTfXq1U2VKlVMjx49zO7du40kM3HiRLe+WVlZJjEx0YSHh5uKFSua0NBQc8cdd5hZs2ZddFudezm0Mcb88MMPpmfPniYgIMD4+fmZqKgos3jxYrc+r7/+umnfvr25/vrrjcPhMPXq1TPPPPOMazvk5+ebZ555xrRo0cJUrVrVXHfddaZFixZm+vTpF63JGGNyc3ONj4+PqVq1qjl9+rSr/d133zWSTJ8+fYqMKe4S2o8//tg0btzYVKhQwe3yzw4dOhR7OXe/fv1MnTp1LlrfokWLTPPmzY2fn5+JiIgwL774onnrrbeMJLNv3z5Xv8LCQjN27FgTFhZmKlWqZDp27Gi+/fbbYre7McZ8//33RpKRZNauXVvsuksy32cvw/3ggw+KjB83bpyJiooyAQEBplKlSqZhw4Zm/PjxpqCgwNXn559/Nvfee68JCAgw/v7+5oEHHjCHDh0qcjn+2ffu0aNHi6ynuPd1SbdbSS+HZh7OuNA8nHX48GHj4+NjGjRocIEtiquJlzEXOeMOuMpt27ZNrVq10rvvvquHH364rMsBYJHs7GyFhYUpOTlZzz33XFmXgxLgHBdYpbgvp5syZYq8vb0velIqAJzr7bffVmFhofr06VPWpaCEOMcFVpk0aZI2b96sTp06qUKFClq2bJmWLVumwYMHF7n0GgDO57PPPtOOHTs0fvx49ejRw/X1I7j6cagIVlm1apXGjh2rHTt26LffflPt2rXVp08fjRo1iqsBAJRYx44dtX79erVr107vvvsu301kEY+Dy+eff66XXnpJmzdv1uHDh/Xhhx+qR48eFxyzZs0aJSUlafv27QoPD9fo0aPVv3//P1E2AAAojzw+xyUvL08tWrQo9gZmxdm3b5+6du2qTp06adu2bXryySc1aNAgrVixwuNiAQBA+fanDhV5eXlddI/L8OHDtWTJErcbEj300EM6fvy460vzAAAASuKynxSwYcOGIrd/jo+PL/YbSM/Kz893u4uo0+nUsWPHdP3111+225UDAIBLyxijEydOqGbNmkVuWFhalz24ZGZmKiQkxK3t7Pdc/P7778V++VVqaqrrC+kAAIDdDhw4cNG7epfUVXkZxsiRI5WUlOR6npOTo9q1a+vAgQOqVq1aGVYGAABKKjc3V+Hh4apateolW+ZlDy6hoaHKyspya8vKylK1atXO+5XvDofD7VuCz6pWrRrBBQAAy1zK0zwu+51zY2JilJGR4da2atUqxcTEXO5VAwCAa4zHweW3337Ttm3btG3bNklnLnfetm2b9u/fL+nMYZ6+ffu6+g8ZMkR79+7VP/7xD+3atUvTp0/XvHnz9NRTT12aVwAAAMoNj4PLpk2b1KpVK7Vq1UqSlJSUpFatWik5OVmSdPjwYVeIkaQbb7xRS5Ys0apVq9SiRQu98soreuONNxQfH3+JXgIAACgvrLjlf25urvz9/ZWTk8M5LgAAWOJyfH7z7dAAAMAaBBcAAGANggsAALAGwQUAAFiD4AIAAKxBcAEAANYguAAAAGsQXAAAgDUILgAAwBoEFwAAYA2CCwAAsAbBBQAAWIPgAgAArEFwAQAA1iC4AAAAaxBcAACANQguAADAGgQXAABgDYILAACwBsEFAABYg+ACAACsQXABAADWILgAAABrEFwAAIA1CC4AAMAaBBcAAGANggsAALAGwQUAAFiD4AIAAKxBcAEAANYguAAAAGsQXAAAgDUILgAAwBoEFwAAYA2CCwAAsAbBBQAAWIPgAgAArEFwAQAA1iC4AAAAaxBcAACANQguAADAGgQXAABgDYILAACwBsEFAABYg+ACAACsQXABAADWILgAAABrEFwAAIA1CC4AAMAaBBcAAGANggsAALAGwQUAAFiD4AIAAKxBcAEAANYguAAAAGsQXAAAgDUILgAAwBoEFwAAYA2CCwAAsAbBBQAAWIPgAgAArEFwAQAA1iC4AAAAa5QquEybNk0RERHy8/NTdHS0Nm7ceMH+U6ZM0c0336xKlSopPDxcTz31lP74449SFQwAAMovj4PL3LlzlZSUpJSUFG3ZskUtWrRQfHy8jhw5Umz/9957TyNGjFBKSop27typN998U3PnztWzzz77p4sHAADli8fBZfLkyXr00Uc1YMAANW7cWDNnzlTlypX11ltvFdt//fr1ateunXr37q2IiAh17txZvXr1uuheGgAAgHN5FFwKCgq0efNmxcXF/WcB3t6Ki4vThg0bih3Ttm1bbd682RVU9u7dq6VLl6pLly7nXU9+fr5yc3PdHgAAABU86Zydna3CwkKFhIS4tYeEhGjXrl3Fjundu7eys7N12223yRij06dPa8iQIRc8VJSamqqxY8d6UhoAACgHLvtVRWvWrNGECRM0ffp0bdmyRQsXLtSSJUv0wgsvnHfMyJEjlZOT43ocOHDgcpcJAAAs4NEel6CgIPn4+CgrK8utPSsrS6GhocWOee6559SnTx8NGjRIktSsWTPl5eVp8ODBGjVqlLy9i2Ynh8Mhh8PhSWkAAKAc8GiPi6+vryIjI5WRkeFqczqdysjIUExMTLFjTp48WSSc+Pj4SJKMMZ7WCwAAyjGP9rhIUlJSkvr166fWrVsrKipKU6ZMUV5engYMGCBJ6tu3r2rVqqXU1FRJUrdu3TR58mS1atVK0dHR2rNnj5577jl169bNFWAAAABKwuPgkpCQoKNHjyo5OVmZmZlq2bKlli9f7jphd//+/W57WEaPHi0vLy+NHj1aBw8eVI0aNdStWzeNHz/+0r0KAABQLngZC47X5Obmyt/fXzk5OapWrVpZlwMAAErgcnx+811FAADAGgQXAABgDYILAACwBsEFAABYg+ACAACsQXABAADWILgAAABrEFwAAIA1CC4AAMAaBBcAAGANggsAALAGwQUAAFiD4AIAAKxBcAEAANYguAAAAGsQXAAAgDUILgAAwBoEFwAAYA2CCwAAsAbBBQAAWIPgAgAArEFwAQAA1iC4AAAAaxBcAACANQguAADAGgQXAABgDYILAACwBsEFAABYg+ACAACsQXABAADWILgAAABrEFwAAIA1CC4AAMAaBBcAAGANggsAALAGwQUAAFiD4AIAAKxBcAEAANYguAAAAGsQXAAAgDUILgAAwBoEFwAAYA2CCwAAsAbBBQAAWIPgAgAArEFwAQAA1iC4AAAAaxBcAACANQguAADAGgQXAABgDYILAACwBsEFAABYg+ACAACsQXABAADWILgAAABrEFwAAIA1CC4AAMAaBBcAAGANggsAALAGwQUAAFiD4AIAAKxBcAEAANYguAAAAGuUKrhMmzZNERER8vPzU3R0tDZu3HjB/sePH1diYqLCwsLkcDjUoEEDLV26tFQFAwCA8quCpwPmzp2rpKQkzZw5U9HR0ZoyZYri4+O1e/duBQcHF+lfUFCgO++8U8HBwZo/f75q1aqln376SQEBAZeifgAAUI54GWOMJwOio6N166236rXXXpMkOZ1OhYeH6/HHH9eIESOK9J85c6Zeeukl7dq1SxUrVixVkbm5ufL391dOTo6qVatWqmUAAIAr63J8fnt0qKigoECbN29WXFzcfxbg7a24uDht2LCh2DGLFi1STEyMEhMTFRISoqZNm2rChAkqLCw873ry8/OVm5vr9gAAAPAouGRnZ6uwsFAhISFu7SEhIcrMzCx2zN69ezV//nwVFhZq6dKleu655/TKK69o3Lhx511Pamqq/P39XY/w8HBPygQAANeoy35VkdPpVHBwsGbNmqXIyEglJCRo1KhRmjlz5nnHjBw5Ujk5Oa7HgQMHLneZAADAAh6dnBsUFCQfHx9lZWW5tWdlZSk0NLTYMWFhYapYsaJ8fHxcbY0aNVJmZqYKCgrk6+tbZIzD4ZDD4fCkNAAAUA54tMfF19dXkZGRysjIcLU5nU5lZGQoJiam2DHt2rXTnj175HQ6XW3fffedwsLCig0tAAAA5+PxoaKkpCTNnj1b77zzjnbu3Km///3vysvL04ABAyRJffv21ciRI139//73v+vYsWMaNmyYvvvuOy1ZskQTJkxQYmLipXsVAACgXPD4Pi4JCQk6evSokpOTlZmZqZYtW2r58uWuE3b3798vb+//5KHw8HCtWLFCTz31lJo3b65atWpp2LBhGj58+KV7FQAAoFzw+D4uZYH7uAAAYJ8yv48LAABAWSK4AAAAaxBcAACANQguAADAGgQXAABgDYILAACwBsEFAABYg+ACAACsQXABAADWILgAAABrEFwAAIA1CC4AAMAaBBcAAGANggsAALAGwQUAAFiD4AIAAKxBcAEAANYguAAAAGsQXAAAgDUILgAAwBoEFwAAYA2CCwAAsAbBBQAAWIPgAgAArEFwAQAA1iC4AAAAaxBcAACANQguAADAGgQXAABgDYILAACwBsEFAABYg+ACAACsQXABAADWILgAAABrEFwAAIA1CC4AAMAaBBcAAGANggsAALAGwQUAAFiD4AIAAKxBcAEAANYguAAAAGsQXAAA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\n"
},
"metadata": {}
}
]
},
{
"cell_type": "code",
"source": [
"# ---\n",
"# ADD YOUR CODE HERE\n",
"# ---"
],
"metadata": {
"id": "JxX0M8YvqtoK"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"### Online Gradient Descent\n",
"Now let's implement Online Gradient Descent (OGD), to eventually have it play against EWA.\n",
"\n",
"For a learning rate $\\eta>0$, we remind that the update of OGD proceeds as:\n",
"$$p_{t+1} = \\Pi_{\\Delta_M}\\big(p_t-\\eta\\nabla l(p_t)\\big)$$\n",
"where:\n",
"- $\\Pi_{\\Delta_M}$ denotes the projection on the unit simplex in dimension $M$,\n",
"- $l:x\\in\\Delta_M\\mapsto \\big(x(i)L(i,j)\\big)_{j\\in 1,\\dots,M}\\in[-1, 1]^M$."
],
"metadata": {
"id": "o2zyFDA49rWw"
}
},
{
"cell_type": "markdown",
"source": [
"#### Projection on the unit simplex\n",
"\n",
"Here is a simple algorithm to implement (Source at the end of the document).\n",
"\n",
"Let $x=\\big(x(i)\\big)\\in\\mathbb{R}^M$,\n",
"- Sort the coordinates of x into $y_1\\geq y_2\\geq\\dots\\geq y_M$,\n",
"- Find\n",
"$$ \\rho=\\max\\Big\\{j\\in 1,\\dots,M:\\ y_j-\\frac{1}{j}\\big(\\sum_{r=1}^jy_r-1\\big)>0\\Big\\},$$\n",
"- Define $z = \\frac{1}{\\rho}\\big(\\sum_{r=1}^jy_r-1\\big)$,\n",
"- Return, for all $i=1, \\dots,M$\n",
"$$\\big(\\Pi_{\\Delta_M}(x)\\big)(i) = \\max\\big\\{x(i)-z, 0\\big\\}$$\n"
],
"metadata": {
"id": "rPJC-TFSop1J"
}
},
{
"cell_type": "code",
"source": [
"# Projection on the simplex.\n",
"def proj_simplex(p):\n",
" # p: vector in R^M\n",
" # Returns: a vector in Delta_M\n",
"\n",
" # ---\n",
" # ADD YOUR CODE HERE\n",
" # ---\n",
" return"
],
"metadata": {
"id": "_3IP4I6A2hir"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"#### OGD Implementation\n",
"We can now implement OGD easily."
],
"metadata": {
"id": "UXu7T8ewwowu"
}
},
{
"cell_type": "code",
"source": [
"def OGD_update(eta, p, l, q=None):\n",
" # eta: learning rate\n",
" # p: an np.array of shape (M,); vector of weights in Delta_M; to be updated\n",
" # l: an np.array of shape (M,); vector of losses in [-1, 1]^M\n",
" # q: weights used by the player, (when OGD is used as the adversary)\n",
" # Returns: an np.array of shape (M,); p updated with the loss l\n",
"\n",
" if l is None:\n",
" # Case for the first round when OGD is used as an adversary\n",
" # ---\n",
" # ADD YOUR CODE HERE\n",
" # ---\n",
" pass\n",
" else:\n",
" # ---\n",
" # ADD YOUR CODE HERE\n",
" # ---\n",
" pass\n",
" return"
],
"metadata": {
"id": "pYawwCJz3lY_"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"#### Experiments\n",
"Repeat the same experiments"
],
"metadata": {
"id": "UM4o7wmBswv-"
}
},
{
"cell_type": "code",
"source": [
"T=100\n",
"eta_list = [0.01, 0.03, 0.1, 0.3, 1]\n",
"eta_adv = 1\n",
"n_exp = 200\n",
"\n",
"results = eta_experiments(T, OGD_update, eta_list, fixed_adversary_update, eta_adv, n_exp)"
],
"metadata": {
"id": "H_eLGOVnuAkP"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"plt.title(\"Average loss with fixed adversary\")\n",
"# ---\n",
"# ADD YOUR CODE HERE\n",
"# ---"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 469
},
"id": "G1USdPc2sF7E",
"outputId": "a57dedf7-cf1d-4e4b-a8ee-c9552c25cddf"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"Text(0.5, 1.0, 'Average loss with fixed adversary')"
]
},
"metadata": {},
"execution_count": 24
},
{
"output_type": "display_data",
"data": {
"text/plain": [
""
],
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAi4AAAGzCAYAAAAIWpzfAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAyoklEQVR4nO3de1iU1d7G8RsQBhVEDTmoY6QdUDMtDEJTs0h2muZbbilL0UwrzUredmqaZAfRDmavYh5Ks6KtZXbULCMtK3YWSicPeSrNAjUTjAyUWe8fXcxuBJUhERd8P9c1f8xiref5zawH5uY5jY8xxggAAMACvtVdAAAAQEURXAAAgDUILgAAwBoEFwAAYA2CCwAAsAbBBQAAWIPgAgAArEFwAQAA1iC4AAAAaxBcgGoUFRWlwYMHV3cZJ8Vll12myy67rMJ9zz///Eqv68iRI7r33nvldDrl6+urvn37SpJ8fHz0wAMPVHq5lXWq5rG6Xh9wOiG4oMrNmjVLPj4+iouLq+5ScAr99NNPeuCBB5STk3PSlz1//nw99thj6tevnxYuXKjRo0ef9HUAOD3Vqe4CUPNlZGQoKipKa9eu1datW3X22WdXd0moAu+9957H859++kmTJk1SVFSUOnTocFLX9cEHH6hZs2Z68sknPdoPHTqkOnX4swbUZOxxQZXasWOHPv30U02bNk1NmjRRRkbGKa/B5XLpjz/+OOXrrW0CAgIUEBBwSta1Z88eNWzYsEx7YGAgweUkKywsrFHrgf0ILqhSGRkZatSokXr16qV+/fp5BJfDhw+rcePGGjJkSJlxBQUFCgwM1D333ONuKyoqUmpqqs4++2w5HA45nU7de++9Kioq8hjr4+OjO+64QxkZGWrbtq0cDodWrFghSXr88cfVqVMnnXHGGapbt65iYmK0ZMmSMus/dOiQ7rzzToWGhio4OFh9+vTR7t27yz3HYPfu3br55psVHh4uh8Ohtm3bav78+ZV+z7Zv365//vOfaty4serVq6dLLrlEy5YtK9NvxowZatu2rerVq6dGjRqpY8eOeumll9w/P3jwoO6++25FRUXJ4XAoLCxMV155pdatW3fMdX/11Vfy8fHRm2++6W7Lzs6Wj4+PLrroIo++V111lcfhv7+e47J69WpdfPHFkqQhQ4bIx8dHPj4+eu655zyWsWHDBnXv3l316tVTs2bN9Oijjx73vfn+++/l4+OjVatW6dtvv3Uvd/Xq1ZI8zwE5dOiQoqOjFR0drUOHDrmXsX//fkVGRqpTp04qKSmR9Ge4nT59utq2bavAwECFh4fr1ltv1a+//uqxfmOMHn74YTVv3lz16tVT9+7d9e233x635r+q6PZXVFSk0aNHq0mTJu7t78cff/Tos2TJEvn4+OjDDz8sM37OnDny8fHRN998427btGmT+vXrp8aNGyswMFAdO3b0mGdJeu6559zLHDFihMLCwtS8eXNJFdue1qxZo3/+859q0aKF+3d09OjRHu+/JA0ePFhBQUHatm2bevbsqeDgYN14441KTU2Vv7+/9u7dW+Y1DR8+XA0bNuSfEEgGqELR0dFm6NChxhhjPvroIyPJrF271v3zm2++2TRs2NAUFRV5jFu4cKGRZD7//HNjjDElJSWmR48epl69eubuu+82c+bMMXfccYepU6eOueaaazzGSjKtW7c2TZo0MZMmTTLp6elm/fr1xhhjmjdvbkaMGGFmzpxppk2bZmJjY40k8/bbb3sso3///kaSGThwoElPTzf9+/c37du3N5JMamqqu19ubq5p3ry5cTqd5sEHHzRPP/206dOnj5FknnzyyRO+P2eeeaZJTk72WF54eLgJDg4248ePN9OmTTPt27c3vr6+ZunSpe5+c+fONZJMv379zJw5c8xTTz1lhg4dau688053nwEDBpiAgACTkpJinnnmGTN16lTTu3dv8+KLLx6znpKSEtOwYUPzv//7v+62J5980vj6+hpfX1+Tn5/v7tegQQNzzz33uPt169bNdOvWzf06HnzwQSPJDB8+3LzwwgvmhRdeMNu2bXP3bdq0qXE6neauu+4ys2bNMpdffrmRZJYvX37M+n777TfzwgsvmOjoaNO8eXP3cnNzc40xpsz8/Oc//zF+fn5m9OjR7rbrr7/e1K1b12zevNnddsstt5g6deqYYcOGmdmzZ5sxY8aY+vXrm4svvtgUFxe7+02YMMFIMj179jQzZ840N998s2natKkJDQ31mMdjqej2d9NNNxlJZsCAAWbmzJnm2muvNRdccIHH6/v9999NUFCQGTFiRJn1dO/e3bRt29b9/JtvvjEhISGmTZs2ZurUqWbmzJmma9euxsfHx2O7WrBggZFk2rRpY7p162ZmzJhhpkyZYoyp2PY0atQo07NnTzN58mQzZ84cM3ToUOPn52f69evnUV9ycrJxOBymVatWJjk52cyePds8//zzZsuWLUaSmTFjhkf/oqIi06hRI3PzzTef8D1GzUdwQZX54osvjCSzcuVKY4wxLpfLNG/e3Nx1113uPu+++66RZN566y2PsT179jQtW7Z0P3/hhReMr6+vWbNmjUe/2bNnG0nmk08+cbdJMr6+vubbb78tU9Pvv//u8by4uNicf/755vLLL3e3ZWdnG0nm7rvv9ug7ePDgMh+MQ4cONZGRkWbfvn0efa+//noTEhJSZn1HOzq43H333UaSx+s8ePCgOeuss0xUVJQpKSkxxhhzzTXXeHwwlSckJMSMHDnyuH3K06tXLxMbG+t+fu2115prr73W+Pn5mXfeeccYY8y6deuMJPPGG2+4+/01uBhjzOeff24kmQULFpRZR7du3Ywk8/zzz7vbioqKTEREhLnuuutOWGO3bt3Kff1Hz48xxowbN874+vqajz76yLzyyitGkpk+fbr752vWrDGSTEZGhse4FStWeLTv2bPHBAQEmF69ehmXy+Xud9999xlJFQouFdn+cnJyjKQygWTAgAFlXt8NN9xgwsLCzJEjR9xtP//8s/H19TUPPvigu+2KK64w7dq1M3/88Ye7zeVymU6dOplzzjnH3VYaXC699FKPZRpTse2pvO09LS3N+Pj4mB9++MHdlpycbCSZsWPHlukfHx9v4uLiPNqWLl1qJJlVq1Ydd/2oHThUhCqTkZGh8PBwde/eXdKfu/GTkpK0aNEi9y76yy+/XKGhoVq8eLF73K+//qqVK1cqKSnJ3fbKK6+odevWio6O1r59+9yPyy+/XJK0atUqj3V369ZNbdq0KVNT3bp1PdaTn5+vLl26eOzuLj2sNGLECI+xo0aN8nhujNGrr76q3r17yxjjUVdiYqLy8/OPe1imPMuXL1dsbKwuvfRSd1tQUJCGDx+u77//Xhs2bJAkNWzYUD/++KM+//zzYy6rYcOG+uyzz/TTTz95VUPp+1F6zsHHH3+snj17qkOHDlqzZo2kPw8J+Pj4eNTpraCgIN10003u5wEBAYqNjdX27dsrvczyPPDAA2rbtq2Sk5M1YsQIdevWTXfeeaf756+88opCQkJ05ZVXesxhTEyMgoKC3NvW+++/r+LiYo0aNUo+Pj7u8XfffXeFa6nI9rd8+XJJ8qjxWOtJSkrSnj173IfKpD8PIblcLvfvz/79+/XBBx+of//+OnjwoPv1/fLLL0pMTNSWLVu0e/duj+UOGzZMfn5+Hm0V2Z7++voKCwu1b98+derUScYYrV+/vkz/22+/vUzboEGD9Nlnn2nbtm3utoyMDDmdTnXr1u2Y60btQXBBlSgpKdGiRYvUvXt37dixQ1u3btXWrVsVFxenvLw8ZWZmSpLq1Kmj6667Tm+88Yb7XJWlS5fq8OHDHsFly5Yt+vbbb9WkSROPx7nnnivpz5M1/+qss84qt663335bl1xyiQIDA9W4cWM1adJETz/9tPLz8919fvjhB/n6+pZZxtFXQ+3du1cHDhzQ3Llzy9RVet7O0XWdyA8//KDzzjuvTHvr1q3dP5ekMWPGKCgoSLGxsTrnnHM0cuRIffLJJx5jHn30UX3zzTdyOp2KjY3VAw88UKFQ0KVLFx05ckRZWVnavHmz9uzZoy5duqhr164ewaVNmzZq3LixV6/vr5o3b+4RACSpUaNGZc4r+bsCAgI0f/587dixQwcPHtSCBQs81rtlyxbl5+crLCyszDz+9ttv7jksfe/POeccj+U3adJEjRo1qlAt3mx/rVq18hhb3nbxj3/8QyEhIR7Bf/HixerQoYP7d2Pr1q0yxuj+++8v8/pSU1MlVez3pyLb086dOzV48GA1btxYQUFBatKkiTts/PU1Sn/+7peeP/NXSUlJcjgc7vPh8vPz9fbbb+vGG28ss72gduL0e1SJDz74QD///LMWLVqkRYsWlfl5RkaGevToIUm6/vrrNWfOHL3zzjvq27evXn75ZUVHR6t9+/bu/i6XS+3atdO0adPKXZ/T6fR4/tf//EqtWbNGffr0UdeuXTVr1ixFRkbK399fCxYs8DiptaJcLpck6aabblJycnK5fS644AKvl1sRrVu31ubNm/X2229rxYoVevXVVzVr1ixNnDhRkyZNkiT1799fXbp00Wuvvab33ntPjz32mKZOnaqlS5fqqquuOuayO3bsqMDAQH300Udq0aKFwsLCdO6556pLly6aNWuWioqKtGbNGv3P//zP33oNR/9HX8oY87eWW553331XkvTHH39oy5YtHh/MLpdLYWFhx7zirUmTJielhpO9/UmSw+FQ37599dprr2nWrFnKy8vTJ598osmTJ7v7lG6n99xzjxITE8tdztGhvLzfnxNtTyUlJbryyiu1f/9+jRkzRtHR0apfv752796twYMHu+v4a+2+vmX/d27UqJGuvvpqZWRkaOLEiVqyZImKioo89s6hdiO4oEpkZGQoLCxM6enpZX62dOlSvfbaa5o9e7bq1q2rrl27KjIyUosXL9all16qDz74QOPHj/cY06pVK3355Ze64oorKv1f16uvvqrAwEC9++67cjgc7vYFCxZ49DvzzDPlcrm0Y8cOj/+ut27d6tGv9IqPkpISJSQkVKqmo5155pnavHlzmfZNmza5f16qfv36SkpKUlJSkoqLi3XttdfqkUce0bhx4xQYGChJioyM1IgRIzRixAjt2bNHF110kR555JHjBpfSQzZr1qxRixYt1KVLF0l/7okpKipSRkaG8vLy1LVr1+O+ltPlv+OvvvpKDz74oIYMGaKcnBzdcsst+vrrrxUSEiLpz23r/fffV+fOncv9wC5V+t5v2bJFLVu2dLfv3bu3QnuJvN3+tm3b5rGXpbztQvpzD8XChQuVmZmpjRs3yhjjsbeytFZ/f/+/vZ0eb3v6+uuv9d1332nhwoUaNGiQe8zKlSu9Xs+gQYN0zTXX6PPPP1dGRoYuvPBCtW3b9m/VjpqDQ0U46Q4dOqSlS5fq6quvVr9+/co87rjjDh08eNB9Kaavr6/69eunt956Sy+88IKOHDni8YdX+vO/vd27d2vevHnlrq8i94Dw8/OTj4+P+/wa6c/La19//XWPfqX/lc6aNcujfcaMGWWWd9111+nVV1/1uOy0VHmXdJ5Iz549tXbtWmVlZbnbCgsLNXfuXEVFRbnP2/nll188xgUEBKhNmzYyxujw4cMqKSkps2s+LCxMTZs2LXP5eHm6dOmizz77TKtWrXIHl9DQULVu3VpTp0519zme+vXrS5IOHDhwwvVVlcOHD2vw4MFq2rSpnnrqKT333HPKy8vzuNNu//79VVJSooceeqjM+CNHjrjrT0hIkL+/v2bMmOGxV2j69OkVqqWi219pqPy///s/j/ZjrSchIUGNGzfW4sWLtXjxYsXGxnrsUQoLC9Nll12mOXPm6Oeffy4zviLbaUW2p9I9aH99b4wxeuqpp064/KNdddVVCg0N1dSpU/Xhhx+ytwUe2OOCk+7NN9/UwYMH1adPn3J/fskll7hvRlcaUJKSkjRjxgylpqaqXbt27nM6Sg0cOFAvv/yybrvtNq1atUqdO3dWSUmJNm3apJdfflnvvvuuOnbseNy6evXqpWnTpukf//iHBgwYoD179ig9PV1nn322vvrqK3e/mJgYXXfddZo+fbp++eUXXXLJJfrwww/13XffSfLckzBlyhStWrVKcXFxGjZsmNq0aaP9+/dr3bp1ev/997V//36v3ruxY8fq3//+t6666irdeeedaty4sRYuXKgdO3bo1Vdfde9a79GjhyIiItS5c2eFh4dr48aNmjlzpnr16qXg4GAdOHBAzZs3V79+/dS+fXsFBQXp/fff1+eff64nnnjihHV06dJFjzzyiHbt2uURULp27ao5c+YoKiqq3PMT/qpVq1Zq2LChZs+ereDgYNWvX19xcXHHPP+oKjz88MPKyclRZmamgoODdcEFF2jixImaMGGC+vXrp549e6pbt2669dZblZaWppycHPXo0UP+/v7asmWLXnnlFT311FPq16+fmjRponvuuUdpaWm6+uqr1bNnT61fv17vvPOOQkNDT1hLRbe/Dh066IYbbtCsWbOUn5+vTp06KTMzs8wev1L+/v669tprtWjRIhUWFurxxx8v0yc9PV2XXnqp2rVrp2HDhqlly5bKy8tTVlaWfvzxR3355ZfHrf3gwYMn3J6io6PVqlUr3XPPPdq9e7caNGigV199tVLnLPn7++v666/XzJkz5efnpxtuuMHrZaAGq67LmVBz9e7d2wQGBprCwsJj9hk8eLDx9/d3X0bscrmM0+k0kszDDz9c7pji4mIzdepU07ZtW+NwOEyjRo1MTEyMmTRpkvv+Isb8eUnssS7bfPbZZ80555xjHA6HiY6ONgsWLDCpqanm6F+FwsJCM3LkSNO4cWMTFBRk+vbtazZv3mwkue9rUSovL8+MHDnSOJ1O4+/vbyIiIswVV1xh5s6de8L36ujLoY0xZtu2baZfv36mYcOGJjAw0MTGxpa5z8ecOXNM165dzRlnnOG+H8a//vUv9/tQVFRk/vWvf5n27dub4OBgU79+fdO+fXsza9asE9ZkjDEFBQXGz8/PBAcHe1wW++KLL7rvb3O0oy+HNsaYN954w7Rp08bUqVPH49LoY13OnJycbM4888wT1leRy6Gzs7NNnTp1zKhRozz6HDlyxFx88cWmadOm5tdff3W3z50718TExJi6deua4OBg065dO3Pvvfean376yd2npKTETJo0yURGRpq6deuayy67zHzzzTflzmN5Krr9HTp0yNx5553mjDPOMPXr1ze9e/c2u3btKvdyb2OMWblypZFkfHx8zK5du8pd97Zt28ygQYNMRESE8ff3N82aNTNXX321WbJkibtP6eXQpfdPKlXR7WnDhg0mISHBBAUFmdDQUDNs2DDz5ZdflrksPjk52dSvX/+479XatWuNJNOjR4/j9kPt42NMFZwJB9RAOTk5uvDCC/Xiiy/qxhtvrO5ygBrtyy+/VIcOHfT8889r4MCB1V0OTiOc4wKU4+hblEt/nmPg6+t7wpNSAfx98+bNU1BQkK699trqLgWnGc5xAcrx6KOPKjs7W927d1edOnX0zjvv6J133tHw4cPLXHoN4OR56623tGHDBs2dO1d33HGH+yRvoBSHioByrFy5UpMmTdKGDRv022+/qUWLFho4cKDGjx/Ptw8DVSgqKkp5eXlKTEzUCy+8oODg4OouCacZr4PLRx99pMcee0zZ2dn6+eef9dprr6lv377HHbN69WqlpKTo22+/ldPp1IQJEzR48OC/UTYAAKiNvD7HpbCwUO3bty/3xmLl2bFjh3r16qXu3bsrJydHd999t2655Rb3nSwBAAAq6m8dKvLx8TnhHpcxY8Zo2bJlHjfouv7663XgwAH3l9kBAABURJUfrM/Kyipzm+nExMTjfqNqUVGRx909XS6X9u/frzPOOOO0uY04AAA4PmOMDh48qKZNm5b73VSVUeXBJTc3V+Hh4R5t4eHhKigo0KFDh8r9bpC0tDT3F8UBAAC77dq164R3266o0/LyiHHjxiklJcX9PD8/Xy1atNCuXbvUoEGDaqwMAABUVEFBgZxO50m9OqzKg0tERITy8vI82vLy8tSgQYNjfhOrw+Hw+PbUUg0aNCC4AABgmZN5mkeV3zk3Pj5emZmZHm0rV65UfHx8Va8aAADUMF4Hl99++005OTnKycmR9Oflzjk5Odq5c6ekPw/zDBo0yN3/tttu0/bt23Xvvfdq06ZNmjVrll5++WWPr5UHAACoCK+DyxdffKELL7xQF154oSQpJSVFF154oSZOnChJ+vnnn90hRpLOOussLVu2TCtXrlT79u31xBNP6JlnnlFiYuJJegkAAKC2sOKW/wUFBQoJCVF+fj7nuAAAYImq+Pzm26EBAIA1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LlZAQECZMQ6HQw6Hw5vSAABALeDVHpeAgADFxMQoMzPT3eZyuZSZman4+Phyx3Tu3Flbt26Vy+Vyt3333XeKjIwsN7QAAAAci9eHilJSUjRv3jwtXLhQGzdu1O23367CwkINGTJEkjRo0CCNGzfO3f/222/X/v37ddddd+m7777TsmXLNHnyZI0cOfLkvQoAAFAreH0fl6SkJO3du1cTJ05Ubm6uOnTooBUrVrhP2N25c6d8ff+bh5xOp959912NHj1aF1xwgZo1a6a77rpLY8aMOXmvAgAA1Ape38elOnAfFwAA7FPt93EBAACoTgQXAABgDYILAACwBsEFAABYg+ACAACsQXABAADWILgAAABrEFwAAIA1CC4AAMAaBBcAAGANggsAALAGwQUAAFiD4AIAAKxBcAEAANYguAAAAGsQXAAAgDUILgAAwBoEFwAAYA2CCwAAsAbBBQAAWIPgAgAArEFwAQAA1iC4AAAAaxBcAACANQguAADAGgQXAABgDYILAACwBsEFAABYg+ACAACsQXABAADWILgAAABrEFwAAIA1CC4AAMAaBBcAAGANggsAALAGwQUAAFiD4AIAAKxBcAEAANYguAAAAGsQXAAAgDUILgAAwBoEFwAAYA2CCwAAsAbBBQAAWIPgAgAArEFwAQAA1iC4AAAAaxBcAACANQguAADAGgQXAABgDYILAACwBsEFAABYg+ACAACsQXABAADWILgAAABrEFwAAIA1CC4AAMAaBBcAAGANggsAALAGwQUAAFiD4AIAAKxBcAEAANYguAAAAGtUKrikp6crKipKgYGBiouL09q1ays0btGiRfLx8VHfvn0rs1oAAFDLeR1cFi9erJSUFKWmpmrdunVq3769EhMTtWfPnuOO+/7773XPPfeoS5culS4WAADUbl4Hl2nTpmnYsGEaMmSI2rRpo9mzZ6tevXqaP3/+MceUlJToxhtv1KRJk9SyZcsTrqOoqEgFBQUeDwAAAK+CS3FxsbKzs5WQkPDfBfj6KiEhQVlZWccc9+CDDyosLExDhw6t0HrS0tIUEhLifjidTm/KBAAANZRXwWXfvn0qKSlReHi4R3t4eLhyc3PLHfPxxx/r2Wef1bx58yq8nnHjxik/P9/92LVrlzdlAgCAGqpOVS784MGDGjhwoObNm6fQ0NAKj3M4HHI4HFVYGQAAsJFX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\n"
},
"metadata": {}
}
]
},
{
"cell_type": "code",
"source": [
"# ---\n",
"# ADD YOUR CODE HERE\n",
"# ---"
],
"metadata": {
"id": "VUx9tC52sLCN"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"T=100\n",
"eta_list = [0.01, 0.03, 0.1, 0.3, 1]\n",
"eta_adv = 1\n",
"n_exp = 200\n",
"\n",
"results = eta_experiments(T, OGD_update, eta_list, adversarial_adversary_update, eta_adv, n_exp)"
],
"metadata": {
"id": "WoRO8rPRsQK9"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"plt.title(\"Average loss with adversarial adversary\")\n",
"# ---\n",
"# ADD YOUR CODE HERE\n",
"# ---"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 469
},
"id": "QDtAVPLDsVlK",
"outputId": "8c514066-4d76-4244-86c1-808545e12c86"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"Text(0.5, 1.0, 'Average loss with adversarial adversary')"
]
},
"metadata": {},
"execution_count": 27
},
{
"output_type": "display_data",
"data": {
"text/plain": [
""
],
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAi4AAAGzCAYAAAAIWpzfAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAwxElEQVR4nO3de1TU1d7H8Q+gDJoKGHLRUNI075cwEA0vRVJ6NCuLtOMtzeORymLVUdNAS8WszGeZl7SynhOFplbm3Uif8nIyb6fyVqalqaBkgmGBMvv5w+WcM4LKkIpb3q+15o/Z7P37fee3B+bD7zZexhgjAAAAC3iXdQEAAAAlRXABAADWILgAAABrEFwAAIA1CC4AAMAaBBcAAGANggsAALAGwQUAAFiD4AIAAKxBcAGKERERof79+5d1GZdEx44d1bFjxxL3bdq06eUt6AKupe1+PmPGjJGXl1epxnoyl39GeZgH2IvgUo5Nnz5dXl5eio6OLutScAUdOnRIY8aM0bZt28q6FADwGMGlHEtLS1NERIQ2btyoPXv2lHU5uExWrlyplStXup4fOnRIY8eOJbiUkdGjR+v3338v6zIAaxFcyql9+/Zp/fr1mjx5smrUqKG0tLQrXoPT6dQff/xxxddb3vj6+srX17esy7hq/fHHH3I6nZd9PXl5eZKkChUqyM/P77KvzzZXeh5gL4JLOZWWlqbAwEB17dpVPXv2dAsup06dUvXq1TVgwIAi43Jzc+Xn56enn37a1Zafn6+UlBTddNNNcjgcCg8P1z/+8Q/l5+e7jfXy8tJjjz2mtLQ0NWnSRA6HQ8uXL5ckvfzyy2rbtq2uv/56VapUSZGRkZo/f36R9f/+++964oknFBQUpKpVq6p79+46ePCgvLy8NGbMGLe+Bw8e1COPPKKQkBA5HA41adJEb731Vqm32d69e/XAAw+oevXqqly5stq0aaMlS5YU6Td16lQ1adJElStXVmBgoFq3bq333nvP9fMTJ07oySefVEREhBwOh4KDg3XnnXdqy5Yt5133119/LS8vLy1atMjVtnnzZnl5eemWW25x63v33Xe7Hf777/Mi1qxZo1tvvVWSNGDAAHl5ecnLy0tvv/222zJ27NihTp06qXLlyqpVq5YmTZpUom00Z84c3X777QoODpbD4VDjxo01Y8aMIv2MMRo3bpxuuOEGVa5cWZ06ddL27dvd+mzatEleXl565513ioxfsWKFvLy8tHjxYldbSeZ7zZo18vLyUnp6ukaPHq1atWqpcuXKys3N1alTpzR27FjVr19ffn5+uv7663Xbbbdp1apVrvFff/21+vfvr7p168rPz0+hoaF65JFH9Msvv7it5+x5LDt27FDv3r0VGBio2267ze1npdluJcU8nHG+eZgzZ468vLy0devWIq9pwoQJ8vHx0cGDB0u2sXHFVSjrAlA20tLSdN9998nX11e9evXSjBkz9NVXX+nWW29VxYoVde+992rhwoV6/fXX3f5b/+ijj5Sfn6+HHnpI0pm9Jt27d9fatWs1ePBgNWrUSN98841effVVfffdd/roo4/c1vvZZ59p3rx5euyxxxQUFKSIiAhJ0v/8z/+oe/fuevjhh1VQUKD09HQ98MADWrx4sbp27eoa379/f82bN099+vRRmzZt9H//939uPz8rKytLbdq0cYWlGjVqaNmyZRo4cKByc3P15JNPerS9srKy1LZtW508eVJPPPGErr/+er3zzjvq3r275s+fr3vvvVeSNHv2bD3xxBPq2bOnhg0bpj/++ENff/21vvzyS/Xu3VuSNGTIEM2fP1+PPfaYGjdurF9++UVr167Vzp07i4SQs5o2baqAgAB9/vnn6t69uyTpiy++kLe3t/79738rNzdX1apVk9Pp1Pr16zV48OBil9OoUSM9//zzSk5O1uDBgxUbGytJatu2ravPr7/+qrvuukv33XefHnzwQc2fP1/Dhw9Xs2bNdPfdd19wO82YMUNNmjRR9+7dVaFCBX3yyScaOnSonE6nEhMTXf2Sk5M1btw4denSRV26dNGWLVvUuXNnFRQUuPq0bt1adevW1bx589SvXz+39cydO1eBgYGKj493zY8n8/3CCy/I19dXTz/9tPLz8+Xr66sxY8YoNTVVgwYNUlRUlHJzc7Vp0yZt2bJFd955pyRp1apV2rt3rwYMGKDQ0FBt375ds2bN0vbt2/Wvf/2rSCB54IEHVL9+fU2YMEHGmD+93UqKebjwPPTs2VOJiYlKS0tTq1at3PqmpaWpY8eOqlWrlsfbHVeIQbmzadMmI8msWrXKGGOM0+k0N9xwgxk2bJirz4oVK4wk88knn7iN7dKli6lbt67r+T//+U/j7e1tvvjiC7d+M2fONJLMunXrXG2SjLe3t9m+fXuRmk6ePOn2vKCgwDRt2tTcfvvtrrbNmzcbSebJJ59069u/f38jyaSkpLjaBg4caMLCwkx2drZb34ceesj4+/sXWd+56tSpY/r16+d6/uSTTxpJbq/zxIkT5sYbbzQRERGmsLDQGGPMPffcY5o0aXLBZfv7+5vExMQL9ilO165dTVRUlOv5fffdZ+677z7j4+Njli1bZowxZsuWLUaS+fjjj139OnToYDp06OB6/tVXXxlJZs6cOUXW0aFDByPJ/O///q+rLT8/34SGhpr777//ojUWt13j4+Pd3jNHjhwxvr6+pmvXrsbpdLran332WSPJbbuPHDnSVKxY0Rw7dsytnoCAAPPII4+42ko636tXrzaSTN26dYvU2qJFC9O1a1ePX9/7779vJJnPP//c1ZaSkmIkmV69ehXpf/ZnF1vuudvNmKJz6UmdzIO7Xr16mZo1a7p+d435z+9Pcb8buHpwqKgcSktLU0hIiDp16iTpzCGchIQEpaenq7CwUJJ0++23KygoSHPnznWN+/XXX7Vq1SolJCS42j744AM1atRIDRs2VHZ2tutx++23S5JWr17ttu4OHTqocePGRWqqVKmS23pycnIUGxvrdvjk7GGloUOHuo19/PHH3Z4bY7RgwQJ169ZNxhi3uuLj45WTk3PBwzLFWbp0qaKioly7+yWpSpUqGjx4sH788Uft2LFDkhQQEKCff/5ZX3311XmXFRAQoC+//FKHDh3yqIaz2+PsMfq1a9eqS5cuatmypb744gtJZ/bCeHl5udXpqSpVquivf/2r67mvr6+ioqK0d+/ei47973nMyclRdna2OnTooL179yonJ0eS9Omnn6qgoECPP/6423/Gxe0FS0hI0KlTp7Rw4UJX28qVK3X8+HHX+7A0892vXz+3WqUz87J9+3Z9//33JXp9f/zxh7Kzs9WmTRtJKvY9NWTIkPMu63zLPd928wTz4K64eejbt68OHTrk9jcqLS1NlSpV0v3333/edaPsEVzKmcLCQqWnp6tTp07at2+f9uzZoz179ig6OlpZWVnKyMiQdOYEwvvvv18ff/yx61yVhQsX6tSpU27B5fvvv9f27dtVo0YNt0eDBg0kSUeOHHFb/4033lhsXYsXL1abNm3k5+en6tWrq0aNGpoxY4bbH+2ffvpJ3t7eRZZx0003uT0/evSojh8/rlmzZhWp6+x5O+fWdTE//fSTbr755iLtjRo1cv1ckoYPH64qVaooKipK9evXV2JiotatW+c2ZtKkSfr2228VHh6uqKgojRkzpkShIDY2VqdPn9aGDRu0e/duHTlyRLGxsWrfvr1bcGncuLGqV6/u0ev7bzfccEORXe2BgYH69ddfLzp23bp1iouL03XXXaeAgADVqFFDzz77rCS55vLstqpfv77b2Bo1aigwMNCtrUWLFmrYsKFbgJ47d66CgoJc4bg0813c+/D555/X8ePH1aBBAzVr1kzPPPOMvv76a7c+x44d07BhwxQSEqJKlSqpRo0armUVFzDO934/V0m2myeYB3fFrefOO+9UWFiY6/w+p9Op999/X/fcc4+qVq1apD+uHpzjUs589tlnOnz4sNLT05Wenl7k52lpaercubMk6aGHHtLrr7+uZcuWqUePHpo3b54aNmyoFi1auPo7nU41a9ZMkydPLnZ94eHhbs/P/e9KOvNh2717d7Vv317Tp09XWFiYKlasqDlz5rid1FpSZ69M+Otf/1rkmPxZzZs393i5JdGoUSPt3r1bixcv1vLly7VgwQJNnz5dycnJGjt2rCTpwQcfVGxsrD788EOtXLlSL730kl588UUtXLjwgueQtG7dWn5+fvr8889Vu3ZtBQcHq0GDBoqNjdX06dOVn5+vL774wnW+TWn5+PgU224ucI6GJP3www+644471LBhQ02ePFnh4eHy9fXV0qVL9eqrr5b6ipGEhASNHz9e2dnZqlq1qhYtWqRevXqpQoUzf75KM9/FvQ/bt2+vH374QR9//LFWrlypN954Q6+++qpmzpypQYMGSTozd+vXr9czzzyjli1bqkqVKnI6nbrrrruKfX3Fredcl3q7MQ8lmwcfHx/17t1bs2fP1vTp07Vu3TodOnTIbW8jrk4El3ImLS1NwcHBmjZtWpGfLVy4UB9++KFmzpypSpUqqX379goLC9PcuXN122236bPPPtOoUaPcxtSrV0///ve/dccdd5T6bqALFiyQn5+fVqxYIYfD4WqfM2eOW786derI6XRq3759bv8lnnsPmho1aqhq1aoqLCxUXFxcqWo6V506dbR79+4i7bt27XL9/KzrrrtOCQkJSkhIUEFBge677z6NHz9eI0eOdF0GGxYWpqFDh2ro0KE6cuSIbrnlFo0fP/6CweXsIZsvvvhCtWvXdp1YGxsbq/z8fKWlpSkrK0vt27e/4Gsp7TxdzCeffKL8/HwtWrRItWvXdrWfe7jw7Lb6/vvvVbduXVf70aNHi92rk5CQoLFjx2rBggUKCQlRbm6u6+Rw6dLO99mr6QYMGKDffvtN7du315gxYzRo0CD9+uuvysjI0NixY5WcnOwac6FDGiVR0u12qZfHPJw5XPTKK6/ok08+0bJly1SjRg3Xica4enGoqBz5/ffftXDhQv3lL39Rz549izwee+wxnThxwnXJrbe3t3r27KlPPvlE//znP3X69Gm3w0TSmf98Dh48qNmzZxe7vpLcM8HHx0deXl6u82sk6ccffyxyRdLZPyjTp093a586dWqR5d1///1asGCBvv322yLrO3r06EVrOleXLl20ceNGbdiwwdWWl5enWbNmKSIiwnXezrmXY/r6+qpx48YyxujUqVMqLCwssis7ODhYNWvWLHL5eHFiY2P15ZdfavXq1a7gEhQUpEaNGunFF1909bmQ6667TpJ0/Pjxi67PE2f31Pz3npmcnJwiATQuLk4VK1bU1KlT3fpOmTKl2OU2atRIzZo109y5czV37lyFhYW5hbNLNd/nzl2VKlV00003uealuNd3obpLqqTb7VIvj3k4sweoefPmeuONN7RgwQI99NBDrj1IuHoxQ+XIokWLdOLECdfltOdq06aN62Z0ZwNKQkKCpk6dqpSUFDVr1sx1TsdZffr00bx58zRkyBCtXr1a7dq1U2FhoXbt2qV58+ZpxYoVat269QXr6tq1qyZPnqy77rpLvXv31pEjRzRt2jTddNNNbse2IyMjdf/992vKlCn65ZdfXJdDf/fdd5Lc9yRMnDhRq1evVnR0tB599FE1btxYx44d05YtW/Tpp5/q2LFjHm27ESNG6P3339fdd9+tJ554QtWrV9c777yjffv2acGCBfL2PvM/QOfOnRUaGqp27dopJCREO3fu1GuvvaauXbuqatWqOn78uG644Qb17NlTLVq0UJUqVfTpp5/qq6++0iuvvHLROmJjYzV+/HgdOHDALaC0b99er7/+uiIiInTDDTdccBn16tVTQECAZs6cqapVq+q6665TdHR0ic/HOJ/OnTvL19dX3bp109/+9jf99ttvmj17toKDg3X48GFXvxo1aujpp59Wamqq/vKXv6hLly7aunWrli1bpqCgoGKXnZCQoOTkZPn5+WngwIGu7X3WpZjvxo0bq2PHjoqMjFT16tW1adMm12XrklStWjW1b99ekyZN0qlTp1SrVi2tXLlS+/bt+xNbreTb7VIvj3k4o2/fvq77UnGYyBJlcCUTyki3bt2Mn5+fycvLO2+f/v37m4oVK7ouZ3Q6nSY8PNxIMuPGjSt2TEFBgXnxxRdNkyZNjMPhMIGBgSYyMtKMHTvW5OTkuPpJOu9lwG+++aapX7++cTgcpmHDhmbOnDnFXjaal5dnEhMTTfXq1U2VKlVMjx49zO7du40kM3HiRLe+WVlZJjEx0YSHh5uKFSua0NBQc8cdd5hZs2ZddFudezm0Mcb88MMPpmfPniYgIMD4+fmZqKgos3jxYrc+r7/+umnfvr25/vrrjcPhMPXq1TPPPPOMazvk5+ebZ555xrRo0cJUrVrVXHfddaZFixZm+vTpF63JGGNyc3ONj4+PqVq1qjl9+rSr/d133zWSTJ8+fYqMKe4S2o8//tg0btzYVKhQwe3yzw4dOhR7OXe/fv1MnTp1LlrfokWLTPPmzY2fn5+JiIgwL774onnrrbeMJLNv3z5Xv8LCQjN27FgTFhZmKlWqZDp27Gi+/fbbYre7McZ8//33RpKRZNauXVvsuksy32cvw/3ggw+KjB83bpyJiooyAQEBplKlSqZhw4Zm/PjxpqCgwNXn559/Nvfee68JCAgw/v7+5oEHHjCHDh0qcjn+2ffu0aNHi6ynuPd1SbdbSS+HZh7OuNA8nHX48GHj4+NjGjRocIEtiquJlzEXOeMOuMpt27ZNrVq10rvvvquHH364rMsBYJHs7GyFhYUpOTlZzz33XFmXgxLgHBdYpbgvp5syZYq8vb0velIqAJzr7bffVmFhofr06VPWpaCEOMcFVpk0aZI2b96sTp06qUKFClq2bJmWLVumwYMHF7n0GgDO57PPPtOOHTs0fvx49ejRw/X1I7j6cagIVlm1apXGjh2rHTt26LffflPt2rXVp08fjRo1iqsBAJRYx44dtX79erVr107vvvsu301kEY+Dy+eff66XXnpJmzdv1uHDh/Xhhx+qR48eFxyzZs0aJSUlafv27QoPD9fo0aPVv3//P1E2AAAojzw+xyUvL08tWrQo9gZmxdm3b5+6du2qTp06adu2bXryySc1aNAgrVixwuNiAQBA+fanDhV5eXlddI/L8OHDtWTJErcbEj300EM6fvy460vzAAAASuKynxSwYcOGIrd/jo+PL/YbSM/Kz893u4uo0+nUsWPHdP3111+225UDAIBLyxijEydOqGbNmkVuWFhalz24ZGZmKiQkxK3t7Pdc/P7778V++VVqaqrrC+kAAIDdDhw4cNG7epfUVXkZxsiRI5WUlOR6npOTo9q1a+vAgQOqVq1aGVYGAABKKjc3V+Hh4apateolW+ZlDy6hoaHKyspya8vKylK1atXO+5XvDofD7VuCz6pWrRrBBQAAy1zK0zwu+51zY2JilJGR4da2atUqxcTEXO5VAwCAa4zHweW3337Ttm3btG3bNklnLnfetm2b9u/fL+nMYZ6+ffu6+g8ZMkR79+7VP/7xD+3atUvTp0/XvHnz9NRTT12aVwAAAMoNj4PLpk2b1KpVK7Vq1UqSlJSUpFatWik5OVmSdPjwYVeIkaQbb7xRS5Ys0apVq9SiRQu98soreuONNxQfH3+JXgIAACgvrLjlf25urvz9/ZWTk8M5LgAAWOJyfH7z7dAAAMAaBBcAAGANggsAALAGwQUAAFiD4AIAAKxBcAEAANYguAAAAGsQXAAAgDUILgAAwBoEFwAAYA2CCwAAsAbBBQAAWIPgAgAArEFwAQAA1iC4AAAAaxBcAACANQguAADAGgQXAABgDYILAACwBsEFAABYg+ACAACsQXABAADWILgAAABrEFwAAIA1CC4AAMAaBBcAAGANggsAALAGwQUAAFiD4AIAAKxBcAEAANYguAAAAGsQXAAAgDUILgAAwBoEFwAAYA2CCwAAsAbBBQAAWIPgAgAArEFwAQAA1iC4AAAAaxBcAACANQguAADAGgQXAABgDYILAACwBsEFAABYg+ACAACsQXABAADWILgAAABrEFwAAIA1CC4AAMAaBBcAAGANggsAALAGwQUAAFiD4AIAAKxBcAEAANYguAAAAGsQXAAAgDUILgAAwBoEFwAAYA2CCwAAsAbBBQAAWIPgAgAArEFwAQAA1iC4AAAAa5QquEybNk0RERHy8/NTdHS0Nm7ceMH+U6ZM0c0336xKlSopPDxcTz31lP74449SFQwAAMovj4PL3LlzlZSUpJSUFG3ZskUtWrRQfHy8jhw5Umz/9957TyNGjFBKSop27typN998U3PnztWzzz77p4sHAADli8fBZfLkyXr00Uc1YMAANW7cWDNnzlTlypX11ltvFdt//fr1ateunXr37q2IiAh17txZvXr1uuheGgAAgHN5FFwKCgq0efNmxcXF/WcB3t6Ki4vThg0bih3Ttm1bbd682RVU9u7dq6VLl6pLly7nXU9+fr5yc3PdHgAAABU86Zydna3CwkKFhIS4tYeEhGjXrl3Fjundu7eys7N12223yRij06dPa8iQIRc8VJSamqqxY8d6UhoAACgHLvtVRWvWrNGECRM0ffp0bdmyRQsXLtSSJUv0wgsvnHfMyJEjlZOT43ocOHDgcpcJAAAs4NEel6CgIPn4+CgrK8utPSsrS6GhocWOee6559SnTx8NGjRIktSsWTPl5eVp8ODBGjVqlLy9i2Ynh8Mhh8PhSWkAAKAc8GiPi6+vryIjI5WRkeFqczqdysjIUExMTLFjTp48WSSc+Pj4SJKMMZ7WCwAAyjGP9rhIUlJSkvr166fWrVsrKipKU6ZMUV5engYMGCBJ6tu3r2rVqqXU1FRJUrdu3TR58mS1atVK0dHR2rNnj5577jl169bNFWAAAABKwuPgkpCQoKNHjyo5OVmZmZlq2bKlli9f7jphd//+/W57WEaPHi0vLy+NHj1aBw8eVI0aNdStWzeNHz/+0r0KAABQLngZC47X5Obmyt/fXzk5OapWrVpZlwMAAErgcnx+811FAADAGgQXAABgDYILAACwBsEFAABYg+ACAACsQXABAADWILgAAABrEFwAAIA1CC4AAMAaBBcAAGANggsAALAGwQUAAFiD4AIAAKxBcAEAANYguAAAAGsQXAAAgDUILgAAwBoEFwAAYA2CCwAAsAbBBQAAWIPgAgAArEFwAQAA1iC4AAAAaxBcAACANQguAADAGgQXAABgDYILAACwBsEFAABYg+ACAACsQXABAADWILgAAABrEFwAAIA1CC4AAMAaBBcAAGANggsAALAGwQUAAFiD4AIAAKxBcAEAANYguAAAAGsQXAAAgDUILgAAwBoEFwAAYA2CCwAAsAbBBQAAWIPgAgAArEFwAQAA1iC4AAAAaxBcAACANQguAADAGgQXAABgDYILAACwBsEFAABYg+ACAACsQXABAADWILgAAABrEFwAAIA1CC4AAMAaBBcAAGANggsAALAGwQUAAFiD4AIAAKxBcAEAANYguAAAAGuUKrhMmzZNERER8vPzU3R0tDZu3HjB/sePH1diYqLCwsLkcDjUoEEDLV26tFQFAwCA8quCpwPmzp2rpKQkzZw5U9HR0ZoyZYri4+O1e/duBQcHF+lfUFCgO++8U8HBwZo/f75q1aqln376SQEBAZeifgAAUI54GWOMJwOio6N166236rXXXpMkOZ1OhYeH6/HHH9eIESOK9J85c6Zeeukl7dq1SxUrVixVkbm5ufL391dOTo6qVatWqmUAAIAr63J8fnt0qKigoECbN29WXFzcfxbg7a24uDht2LCh2DGLFi1STEyMEhMTFRISoqZNm2rChAkqLCw873ry8/OVm5vr9gAAAPAouGRnZ6uwsFAhISFu7SEhIcrMzCx2zN69ezV//nwVFhZq6dKleu655/TKK69o3Lhx511Pamqq/P39XY/w8HBPygQAANeoy35VkdPpVHBwsGbNmqXIyEglJCRo1KhRmjlz5nnHjBw5Ujk5Oa7HgQMHLneZAADAAh6dnBsUFCQfHx9lZWW5tWdlZSk0NLTYMWFhYapYsaJ8fHxcbY0aNVJmZqYKCgrk6+tbZIzD4ZDD4fCkNAAAUA54tMfF19dXkZGRysjIcLU5nU5lZGQoJiam2DHt2rXTnj175HQ6XW3fffedwsLCig0tAAAA5+PxoaKkpCTNnj1b77zzjnbu3Km///3vysvL04ABAyRJffv21ciRI139//73v+vYsWMaNmyYvvvuOy1ZskQTJkxQYmLipXsVAACgXPD4Pi4JCQk6evSokpOTlZmZqZYtW2r58uWuE3b3798vb+//5KHw8HCtWLFCTz31lJo3b65atWpp2LBhGj58+KV7FQAAoFzw+D4uZYH7uAAAYJ8yv48LAABAWSK4AAAAaxBcAACANQguAADAGgQXAABgDYILAACwBsEFAABYg+ACAACsQXABAADWILgAAABrEFwAAIA1CC4AAMAaBBcAAGANggsAALAGwQUAAFiD4AIAAKxBcAEAANYguAAAAGsQXAAAgDUILgAAwBoEFwAAYA2CCwAAsAbBBQAAWIPgAgAArEFwAQAA1iC4AAAAaxBcAACANQguAADAGgQXAABgDYILAACwBsEFAABYg+ACAACsQXABAADWILgAAABrEFwAAIA1CC4AAMAaBBcAAGANggsAALAGwQUAAFiD4AIAAKxBcAEAANYguAAAAGsQXAAA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\n"
},
"metadata": {}
}
]
},
{
"cell_type": "code",
"source": [
"# ---\n",
"# ADD YOUR CODE HERE\n",
"# ---"
],
"metadata": {
"id": "WnbdiKyNsq1a"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"### EWA VS OGD\n",
"\n",
"Run experiments with EWA facing OGD."
],
"metadata": {
"id": "GQwt1DlFs6Om"
}
},
{
"cell_type": "code",
"source": [
"T=100\n",
"eta_EWA = 0.1\n",
"eta_OGD = 0.1\n",
"n_exp = 200\n",
"\n",
"results = runs_experiment(T, EWA_update, eta_EWA, OGD_update, eta_OGD, n_exp)"
],
"metadata": {
"id": "RTsnz_UstxqR"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"Observe the evolution of the weights of each player for one of the experiments."
],
"metadata": {
"id": "ZJ4HPubjWwZ-"
}
},
{
"cell_type": "code",
"source": [
"# ---\n",
"# ADD YOUR CODE HERE\n",
"# ---"
],
"metadata": {
"id": "YjckDmIcxQRd"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"We define $\\bar{p}_t = \\frac{1}{t}\\sum_{s=1}^t p_s$. Plot the Euclidian distance of this vector to the point $(1/3, 1/3, 1/3)$ for both strategies. What do you observe. You should that we remain around it. (the vectors actually converge almost surely to a Nash equilibrium)."
],
"metadata": {
"id": "e9IwSfPEzRAB"
}
},
{
"cell_type": "code",
"source": [
"# ---\n",
"# ADD YOUR CODE HERE\n",
"# ---"
],
"metadata": {
"id": "z8TSvX4Xxyzy"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"## Bonus: Bandit feedback\n",
"\n",
"Do the same with Bandit feedback and Algorithm EXP3 instead of EWA."
],
"metadata": {
"id": "K0HKd92a3l-j"
}
},
{
"cell_type": "markdown",
"source": [
"# References\n",
"- Sequential Learning Homework, Master MVA, 2021-2022, P. Gaillard & R. Degenne\n",
"- Duchi, J., Shalev-Shwartz, S., Singer, Y., & Chandra, T. (2008, July). Efficient projections onto the l 1-ball for learning in high dimensions. In Proceedings of the 25th international conference on Machine learning (pp. 272-279)."
],
"metadata": {
"id": "HXPm5UaZppkU"
}
}
]
}