{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "eJW2cWXguczS" }, "source": [ "Copyright 2021 The RecSim Authors.\n", "\n", "Licensed under the Apache License, Version 2.0 (the \"License\");\n", "you may not use this file except in compliance with the License.\n", "You may obtain a copy of the License at\n", "\n", " http://www.apache.org/licenses/LICENSE-2.0\n", "\n", "Unless required by applicable law or agreed to in writing, software\n", "distributed under the License is distributed on an \"AS IS\" BASIS,\n", "WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", "See the License for the specific language governing permissions and\n", "limitations under the License.\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "7hwGgnCQtlLu" }, "outputs": [], "source": [ "# @title Install.\n", "!pip3 install --upgrade -q --no-cache-dir recsim_ng\n", "!pip3 install --upgrade -q --no-cache-dir edward2" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "x4AioKCLKHId" }, "outputs": [], "source": [ "# @title Imports and defs.\n", "\n", "from typing import Any, Callable, Mapping, Sequence, Text\n", "\n", "import functools\n", "\n", "import matplotlib as mpl\n", "from matplotlib import animation\n", "from matplotlib import pyplot as plt\n", "import numpy as np\n", "import tensorflow as tf\n", "import tensorflow_probability as tfp\n", "\n", "import edward2 as ed\n", "from recsim_ng.core import network as network_lib\n", "from recsim_ng.core import variable\n", "from recsim_ng.core import value\n", "from recsim_ng.lib import data\n", "from recsim_ng.lib.tensorflow import entity\n", "from recsim_ng.lib.tensorflow import log_probability\n", "\n", "from recsim_ng.lib.tensorflow import runtime\n", "\n", "from recsim_ng.core import value\n", "\n", "tfd = tfp.distributions\n", "tfb = tfp.bijectors\n", "\n", "mpl.style.use(\"classic\")\n", "\n", "Variable = variable.Variable\n", "Value = value.Value\n", "FieldSpec = value.FieldSpec\n", "\n", "ValueSpec = value.ValueSpec" ] }, { "cell_type": "markdown", "metadata": { "id": "D5zmReyn_ldz" }, "source": [ "# Uncertainty in RecSim NG\r\n", "\r\n", "In [the first tutorial](RecSim_NG_Basics.ipynb) we introduced a RecSim NG model that captured a simple stochastic process expressed using the language of Dynamic Bayesian Networks (DBNs). Yet, throughout the tutorial we explicitly abstained from dealing with *stochasticity*! This was for good reason: given the many capabilities and ways of using RecSim NG, we could not do it justice within the scope of an introductory tutorial. In this tutorial, we correct this deficiency and explicitly address the stochastics of the Markov process captured by a DBN.\r\n", "\r\n", "## Stochastic Simulations\r\n", "\r\n", "Simulating individual events (e.g., clicks, ratings, churn) with precision in the context of a recommender system is an extremely challenging task that faces many obstacles. By far, the most significant challenge is that of observability: if we think of human decision making as a process---causally driven by some combination of mental state, past experience, personality traits, and environmental factors---then it becomes clear how implausible it is that we'll ever be able to observe these factors to the degree required to uniquely determine the outcome of a user placed in any *choice situation*. And even if we could, modeling the interplay or interaction of multiple users with any degree of fidelity or realism is prohibitively complex. \r\n", "\r\n", "Luckily, the questions that we typically aim to answer with simulation rarely require realistically reproducing exact sequences of events. In most cases, we are interested in questions like: \r\n", "* \"Does policy A induce more user satisfaction than policy B?\"\r\n", "* \"Does technique X decrease the disparity in quality of service between niche and mainstream users?\"\r\n", "* \"Is this product going to be viable in 5 years?\"\r\n", "\r\n", "and so on. Such questions can be answered using aggregate statistics. For example, we do not necessarily need to know if a user query for a specific type of content will be answered correctly at a specific time of the day; rather, it may suffice to know that *p*% of a user's queries are answered in a satisfactory fashion. This relaxes the requirement of simulating \"precise\" trajectories of events to that of simulating \"plausible\" trajectories of events---trajectories that contain different types of events in the right contexts in similar proportions to those found in the real world.\r\n", "\r\n", "In recommendation systems simulation, stochasticity is typically implemented using \"stochastic\" behaviors. That is, given a set of stimuli or inputs (e.g., a slate of recommendations, and a user's context), a *behavioral model* (e.g., a user's response or choice function) generates an outcome (e.g., a click, a rating, a purchase) by sampling from a distribution of possible outcomes conditioned on these stimuli. We consider a simulation to be \"plausible\" if it generates events whose relative frequencies are \"similar\" to those observed in real world data. Of course, there is a significant amount of freedom in how we measure similarity for this purpose---we discuss some options later on. \r\n", "\r\n", "\r\n", "\r\n", "\r\n" ] }, { "cell_type": "markdown", "metadata": { "id": "mrgXb6iBAeSu" }, "source": [ "# Randomness in RecSim NG \r\n", "\r\n", "In [Tutorial 1](RecSim_NG_Basics.ipynb), we defined a RecSim NG program as a stochastic process described by a Dynamic Bayesian Network (DBN). In the following, we discuss how DBNs are defined in RecSim in greater detail. Recall that we defined a DBN as a Markovian stochastic process whose kernel factorizes as \r\n", "$$T(s_t, s_{t-1}) = \\prod_i p^i(s_t^i | s^{\\operatorname{Pa}_{\\Gamma}(i)}_t, s_{t-1}^{{\\operatorname{Pa}_{\\Gamma_{-1}}(i)}}),$$ where $\\operatorname{Pa}_\\Gamma(i)$ and $\\operatorname{Pa}_{\\Gamma^{-1}}(i)$ denote sets of random variables. respectively, whose current time step (present) and prior time step (previous) values jointly determine the distribution from which $s_t^i$ is generated. \r\n", "\r\n", "The equation above embodies a *declarative* style for defining the core stochastic process; that is, to specify a DBN, we specify the conditional distributions $T_i$ using mathematical functions in some symbolic language. This is clearly *not* what we did in Tutorial 1, which used more algorithmic (or *imperative*) definitions by implementing a sequence of TensorFlow operators which transformed given inputs into the desired outputs. \r\n", "\r\n", "Generally imperative specifications tend to be much more intuitive than declarative ones---especially in the context of agent-based modeling, where we can literally imagine an agent engaging in a sequence of steps to accomplish something. That said, they tend to be less useful than declarative approaches since they only describe how values are produced. As a result, they do not allow us to transform the distribution or derive new mathematical facts to aid in specific inference tasks (for example, computing its gradients).\r\n", "\r\n", "There is, however, a fairly wide set of cases where imperative definitions can be converted to declarative ones in reasonable time and space, allowing us to have the best of both worlds. To achieve this, RecSim NG uses the [Edward2](https://github.com/google/edward2) probabilistic programming environment. Edward2 is a layer on top of [TensorFlow Probability](https://github.com/tensorflow/probability) which employs program transformation to allow us to treat our imperative sampling code as if it were a symbolic declarative definition of the distribution. RecSim NG exposes a small (but easily extensible) set of Edward2 program transformations tailored to simulation-specific tasks (including those of special relevance for simulating agents involved in recommender systems).\r\n", "\r\n", "In the rest of this tutorial, we demonstrate how to use Edward2 in RecSim NG and show how to use the corresponding RecSim NG APIs for inference and learning tasks.\r\n", "\r\n", "## Hello Random World\r\n", "\r\n", "In principle, adding randomness to a RecSim NG simulation can be as easy as encapsulating every random draw in an Edward2 random variable. The following code implements a simple Gaussian random walk whose kernel is parameterized by the ```normal_scale``` parameter.\r\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "8AVmL5PG_gan" }, "outputs": [], "source": [ "normal_scale = tf.Variable(1.0)\n", "\n", "\n", "def rw_next(previous_state: Value) -\u003e Value:\n", " return Value(\n", " state=ed.Normal(loc=previous_state.get(\"state\"), scale=normal_scale))\n", "\n", "\n", "random_walk_var = Variable(name=\"rw_var\", spec=ValueSpec(state=FieldSpec()))\n", "random_walk_var.initial_value = variable.value(\n", " lambda: Value(state=ed.Normal(loc=0.0, scale=1.0)))\n", "random_walk_var.value = variable.value(rw_next, (random_walk_var.previous,))\n", "\n", "tf_runtime = runtime.TFRuntime(network=network_lib.Network([random_walk_var]))" ] }, { "cell_type": "markdown", "metadata": { "id": "0EkSQayfwlnA" }, "source": [ "We can use the runtime to generate some trajectories and plot them." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "height": 305 }, "executionInfo": { "elapsed": 2494, "status": "ok", "timestamp": 1612907217185, "user": { "displayName": "", "photoUrl": "", "userId": "" }, "user_tz": 480 }, "id": "q96h63lawlzr", "outputId": "d549a434-9988-4dc6-c716-fc7f55251712" }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "\u003cFigure size 640x240 with 1 Axes\u003e" ] }, "metadata": { "tags": [] }, "output_type": "display_data" } ], "source": [ "horizon = 200\r\n", "trajectories = [tf_runtime.trajectory(horizon) for _ in range(5)]\r\n", "_, ax = plt.subplots(figsize=(8, 3))\r\n", "\r\n", "for trajectory in trajectories:\r\n", " ax.plot(range(horizon), trajectory[\"rw_var\"].get(\"state\"))" ] }, { "cell_type": "markdown", "metadata": { "id": "Jbqpn_k3yzwK" }, "source": [ "We see that different simulator runs result in different random draws, hence different trajectories.\r\n", "\r\n", "## Beyond Monte Carlo: Evaluating Log-probabilities\r\n", "The example above illustrates the implementation of a simple stochastic simulation (also known as a *Monte Carlo simulation*) in RecSim NG. As discussed earlier, RecSim offers considerable additional functionality beyond simple trajectory generation. One significant difference between RecSim NG and a pure Monte Carlo simulator is that it can evaluate the probabilities of trajectories according to the DBN induced by the simulation. This functionality is contained in the ```log_probability``` module. \r\n", "\r\n", "The ```log_probability``` module offers a number of APIs for evaluating log probabilities of either entire trajectories, or parts thereof (e.g., individual variables or even individual fields, which is often useful when constructing various estimators). \r\n", "\r\n", "At the highest level, the ```log_probability_from_value_trajectory``` function takes a collection of RecSim NG simulation variables, a ```NetworkValueTrajectory```, which provides possible values for these variables, a trajectory length (in case we want a partial evaluation), and outputs the log probability of the values in the trajectory under the variables' initial state and transition distributions." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "executionInfo": { "elapsed": 3028, "status": "ok", "timestamp": 1612907220456, "user": { "displayName": "", "photoUrl": "", "userId": "" }, "user_tz": 480 }, "id": "bL12flqCyyXD", "outputId": "a3def075-cb28-45f8-b2e9-0ea095ad4939" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[-283.9256, -284.32123, -270.65427, -284.97693, -286.8812]\n" ] } ], "source": [ "log_probs = [\n", " log_probability.log_probability_from_value_trajectory(\n", " [random_walk_var], traj, horizon - 1).numpy()\n", " for traj in trajectories\n", "]\n", "print(log_probs)" ] }, { "cell_type": "markdown", "metadata": { "id": "fro0cgYQ66rz" }, "source": [ "Note that the log probabilities are also differentiable with respect to parameters. For example, " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "executionInfo": { "elapsed": 2297, "status": "ok", "timestamp": 1612907222806, "user": { "displayName": "", "photoUrl": "", "userId": "" }, "user_tz": 480 }, "id": "CNppJBPv4v1U", "outputId": "9baed826-2e15-4cea-ffd7-5dd2f0d6021f" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "tf.Tensor(29.001118, shape=(), dtype=float32)\n" ] } ], "source": [ "with tf.GradientTape() as tape:\n", " log_probs = [\n", " log_probability.log_probability_from_value_trajectory([random_walk_var],\n", " traj, 100)\n", " for traj in trajectories\n", " ]\n", " negative_likelihood = -tf.reduce_sum(log_probs)\n", "grad = tape.gradient(negative_likelihood, normal_scale)\n", "print(grad)" ] }, { "cell_type": "markdown", "metadata": { "id": "3MMWBYsq8-LW" }, "source": [ "The above code is essentially the update step of a *stochastic gradient-based maximum likelihood estimator*. If the set of trajectories were not generated by our simulation, but instead corresponded to observations of some real-world stochastic process, this code would implement a maximum-likelihood learning algorithm to learn a model-based simulator that \"explains\" the data. \r\n", "\r\n", "Let's dig a little deeper and look under the hood of log probability computations in RecSim NG. A log probability computation is in fact a simulation in and of itself---to evaluate a log probability, RecSim NG does the following:\r\n", "\r\n", "\r\n", "1. It replaces the simulation variables with *data/replay variables*---these are variables which have the same signature as the original simulation variables, but instead of \"simulating\" or sampling their values, they just read their values from some data source.\r\n", "2. It then creates \"*log prob*\" variables. These variables are transformed versions of the simulation variables which, instead of generating a sample, employ Edward2 program transformations to compute the log probability of the replay variable's output per key, relative to the simulation variable's kernel.\r\n", "3. Finally, it creates an *aggregator variable*, which sums the outputs of the log prob variables over time and keys. \r\n", "4. The output log probability is simply the value of the aggregator variable after *n* steps.\r\n", "\r\n", "\r\n", "All of these steps are accessible to the simulation/model designer and can be customized in many different ways! For example, one can extract per-timestep, per-key disaggregated log probabilities for custom score-function estimators and the like. We illustrate this here: \r\n", "\r\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "executionInfo": { "elapsed": 1406, "status": "ok", "timestamp": 1612907224220, "user": { "displayName": "", "photoUrl": "", "userId": "" }, "user_tz": 480 }, "id": "KCvEPGbXF5dk", "outputId": "a747206a-bcb7-4228-801c-322199db3415" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Trajectory shape: (200,)\n", "replay_var's initial state: tf.Tensor(-0.58220947, shape=(), dtype=float32) \n", " is identical to the logged trajectory at index 0: tf.Tensor(-0.58220947, shape=(), dtype=float32)\n", "Log probability of last step: Value[{'state': \u003ctf.Tensor: shape=(), dtype=float32, numpy=-283.9256\u003e}]\n", "Disaggregated log probabilities: Value[{'state': \u003ctf.Tensor: shape=(200,), dtype=float32, numpy=\n", "array([-1.0884224 , -1.0893903 , -0.9264586 , -0.91894114, -0.9491419 ,\n", " -0.94670796, -1.3360205 , -1.3899759 , -1.1114663 , -1.168746 ,\n", " -1.0847802 , -2.1293712 , -0.97579426, -1.6905679 , -0.9380691 ,\n", " -1.9812022 , -0.99771154, -2.1495352 , -1.0598828 , -1.2094593 ,\n", " -1.0197289 , -0.93745774, -0.9812193 , -1.1953458 , -4.492368 ,\n", " -1.4562724 , -1.3406684 , -1.0203346 , -0.96815187, -1.9457467 ,\n", " -0.937134 , -3.6148767 , -0.9463751 , -0.9658838 , -1.4671748 ,\n", " -1.2601641 , -0.96707296, -0.9233948 , -0.9349471 , -0.94283074,\n", " -6.353716 , -1.7861427 , -0.91896445, -1.241405 , -2.9391694 ,\n", " -2.0516844 , -1.0553749 , -1.9049366 , -2.9583101 , -1.0455312 ,\n", " -1.1803379 , -0.9285948 , -0.9312215 , -3.074512 , -1.8040113 ,\n", " -1.0345722 , -1.0883486 , -1.0750703 , -1.0887747 , -0.91909045,\n", " -2.408174 , -1.2423995 , -1.5385469 , -1.209719 , -0.99786603,\n", " -0.9370814 , -1.4161525 , -0.9341603 , -1.2367096 , -1.0899146 ,\n", " -1.453406 , -1.3595762 , -1.306848 , -1.0490953 , -0.96145517,\n", " -1.0432199 , -0.9415488 , -1.3047137 , -1.6516585 , -1.0255421 ,\n", " -1.4184042 , -1.4636996 , -0.9195137 , -1.7281055 , -0.9190686 ,\n", " -1.3831232 , -2.024263 , -1.2229054 , -1.1069304 , -4.6087604 ,\n", " -0.9338769 , -0.98521626, -0.9484593 , -1.0187111 , -0.9303984 ,\n", " -1.1458685 , -0.9519727 , -1.390176 , -1.2860086 , -2.2983413 ,\n", " -1.3652768 , -1.4853109 , -0.96601534, -2.0815992 , -1.761055 ,\n", " -2.641132 , -1.212083 , -3.3986082 , -1.3146684 , -1.317802 ,\n", " -0.93234926, -1.531301 , -1.4495558 , -4.116403 , -0.9308894 ,\n", " -0.9443663 , -1.6071599 , -0.9665894 , -1.443568 , -1.5977513 ,\n", " -0.92117167, -1.5416385 , -0.91919285, -1.086457 , -0.9199078 ,\n", " -1.692383 , -0.99753356, -2.2029786 , -1.2807134 , -1.0015672 ,\n", " -1.0225933 , -1.0241107 , -0.9670447 , -1.0593185 , -0.9236634 ,\n", " -0.92260116, -1.868392 , -0.91895455, -0.92980134, -0.94504863,\n", " -1.1088934 , -1.1268054 , -0.9298169 , -0.9510851 , -1.0776869 ,\n", " -1.2780071 , -1.3413801 , -4.9062233 , -0.92401665, -0.9316606 ,\n", " -0.9294726 , -3.2066202 , -1.5958252 , -0.9314612 , -1.6059935 ,\n", " -1.9312091 , -0.9466464 , -1.1010096 , -1.5598292 , -0.9992079 ,\n", " -0.9218286 , -1.0539887 , -4.8283825 , -1.2250524 , -1.0425811 ,\n", " -1.4748418 , -1.0253347 , -1.0421374 , -0.9711143 , -1.0260371 ,\n", " -0.9554626 , -1.0268576 , -0.9451057 , -0.9271395 , -1.7758801 ,\n", " -1.9564112 , -0.96933144, -1.1015071 , -0.9808164 , -1.6531401 ,\n", " -1.5909661 , -1.2117362 , -1.0730803 , -1.1731992 , -0.97250533,\n", " -1.8742337 , -1.8525048 , -1.3403509 , -1.0833449 , -1.0711769 ,\n", " -0.9588435 , -0.9287915 , -3.1819706 , -1.0787956 , -1.6551054 ,\n", " -0.9220071 , -1.2495457 , -1.9648324 , -1.2942157 , -2.3240125 ],\n", " dtype=float32)\u003e}]\n", "Trajectory keys: dict_keys(['rw_var_replay', 'rw_var_log_prob', 'rw_var_log_prob_accum'])\n" ] } ], "source": [ "# Get input data trajectory.\n", "trajectory = trajectories[0]\n", "rw_trajectory = trajectory[\"rw_var\"]\n", "# This is just a horizon x 1 tensor of values wrapped in a Value object.\n", "# Inputs like these could come from real-world logs.\n", "print(\"Trajectory shape:\", rw_trajectory.get(\"state\").shape)\n", "# Now we create the replay variable.\n", "replay_var = data.data_variable(\n", " name=random_walk_var.name + \"_replay\",\n", " spec=random_walk_var.spec,\n", " data_sequence=data.SlicedValue(value=trajectory[random_walk_var.name]))\n", "# replay_var now mimics random_walk_var, except that it replays values from\n", "# the input trajectory. For example:\n", "print(\"replay_var's initial state:\",\n", " replay_var.initial_value.fn().get(\"state\"),\n", " \"\\n is identical to the logged trajectory at index 0:\",\n", " trajectory[\"rw_var\"].get(\"state\")[0])\n", "# Now we create the corresponding transformed log prob variable:\n", "log_prob_var = log_probability.log_prob_variables_from_observation(\n", " [random_walk_var], [replay_var])\n", "# We can have an aggregator var that sums the log probabilities over time and\n", "# keys.\n", "aggregators = log_probability.log_prob_accumulator_variables(log_prob_var)\n", "# We can also have a global accumulator that adds the log probabilities of all\n", "# variables together, but this is redundant since we have only one.\n", "# aggregators.append(\n", "# log_probability.total_log_prob_accumulator_variable(log_prob_vars))\n", "# We can now run this network\n", "tf_runtime = runtime.TFRuntime(\n", " network=network_lib.Network(variables=[replay_var] + log_prob_var +\n", " aggregators))\n", "# We can either get the aggregated outputs at the last step, which is equivalent\n", "# to the previous example:\n", "print(\"Log probability of last step: \",\n", " tf_runtime.execute(horizon - 1)[\"rw_var_log_prob_accum\"])\n", "# or get the entire trajectory of log probs:\n", "log_prob_trajectory = tf_runtime.trajectory(horizon)\n", "print(\"Disaggregated log probabilities: \",\n", " log_prob_trajectory[\"rw_var_log_prob\"])\n", "# For reference, the trajectory contains the following keys:\n", "print(\"Trajectory keys:\", log_prob_trajectory.keys())\n", "# corresponding to the replay var, the log probability var and the accumulator." ] }, { "cell_type": "markdown", "metadata": { "id": "Fk0ggEkuq6Nk" }, "source": [ "One particular shortcut is worth pointing out. The above API computes log probabilities no matter where the trajectories come from (e.g., from logs, or from a different simulation model). However, if we are specifically interested in computing log probabilities relative to the model being simulated, we can insert log prob variables directly to the simulation itself by using the ```log_prob_variables_from_direct_output``` function instead of first generating the trajectories and then evaluating their log probabilities. This comes in handy , for example, in reinforcement learning applications, where we simulate a run of an agent in some environment, and use its action log probabilities to compute policy gradients. Here is an example of this:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "executionInfo": { "elapsed": 1363, "status": "ok", "timestamp": 1612907225597, "user": { "displayName": "", "photoUrl": "", "userId": "" }, "user_tz": 480 }, "id": "pYT2Gemmq5KR", "outputId": "34fc42c1-5979-4288-efa1-16caa57dd71a" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Simulated random walk: Value[{'state': \u003ctf.Tensor: shape=(2,), dtype=float32, numpy=array([-0.18111575, -1.5586151 ], dtype=float32)\u003e}]\n", "Log probabilities: Value[{'state': \u003ctf.Tensor: shape=(2,), dtype=float32, numpy=array([-0.93534 , -1.8676908], dtype=float32)\u003e}]\n" ] } ], "source": [ "def rw_next(previous_state: Value) -\u003e Value:\n", " return Value(state=ed.Normal(loc=previous_state.get(\"state\"), scale=1.0))\n", "\n", "\n", "random_walk_var = Variable(name=\"rw_var\", spec=ValueSpec(state=FieldSpec()))\n", "random_walk_var.initial_value = variable.value(\n", " lambda: Value(state=ed.Normal(loc=0.0, scale=1.0)))\n", "random_walk_var.value = variable.value(rw_next, (random_walk_var.previous,))\n", "rw_log_prob = log_probability.log_prob_variables_from_direct_output(\n", " [random_walk_var])[0]\n", "tf_runtime = runtime.TFRuntime(\n", " network=network_lib.Network([random_walk_var, rw_log_prob]))\n", "trajectory = tf_runtime.trajectory(2)\n", "print(\"Simulated random walk: \", trajectory[\"rw_var\"])\n", "print(\"Log probabilities: \", trajectory[\"rw_var_log_prob\"])" ] }, { "cell_type": "markdown", "metadata": { "id": "9bB_7isRuYp4" }, "source": [ "This runtime simultaneously simulates the random walk and computes the log probabilities of every state transition." ] }, { "cell_type": "markdown", "metadata": { "id": "HU5LQghALhUm" }, "source": [ "## A Few Gotchas\r\n", "Before we move on with an application, let's discuss some potential issues that come up when computing log probabilities. Writing simulation code in which log probabilities can be evaluated using RecSim NG's APIs involves a few special considerations.\r\n", "\r\n", "The first thing to keep in mind is that RecSim NG does not allow \"latent variables\" in the following sense: every random variable must be observable ***to the simulator***. This does *not* mean that random variables cannot be latent from the point of view of different *agents* in the simulation (e.g., a recommender agent may not be able to observe the true, latent preferences of a user when making a recommendation)---it simply means that the *simulator itself* must be able to observe everything. What this means in practice is that:\r\n", "1. All randomness must be sources from Edward2 random variables; and\r\n", "1. Every Edward2 random variable must be bound to some key of a RecSim NG variable.\r\n", "\r\n", "Both are necessary for the simulator to be able to map the observed data to the actual random draws that are intended to explain that data. We provide two counter-examples to illustrate what can go wrong if these conditions are not met.\r\n", "\r\n", "\r\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "dprkvrqKTo_L" }, "outputs": [], "source": [ "def rw_next(previous_state: Value) -\u003e Value:\n", " return Value(\n", " state=tf.random.normal([1], previous_state.get(\"state\"), 1.0, tf.float32))\n", "\n", "\n", "random_walk_var = Variable(name=\"rw_var\", spec=ValueSpec(state=FieldSpec()))\n", "random_walk_var.initial_value = variable.value(\n", " lambda: Value(state=tf.random.normal([1], 0.0, 1.0, tf.float32)))\n", "random_walk_var.value = variable.value(rw_next, (random_walk_var.previous,))\n", "\n", "tf_runtime = runtime.TFRuntime(network=network_lib.Network([random_walk_var]))" ] }, { "cell_type": "markdown", "metadata": { "id": "AYb13Vt9UbLQ" }, "source": [ "This code violates (1) in that it does not use Edward2 for randomness (calls tf.random.normal). We see that Monte Carlo simulations still work and trajectories are sampled from the same distribution as the original:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "height": 305 }, "executionInfo": { "elapsed": 709, "status": "ok", "timestamp": 1612907226671, "user": { "displayName": "", "photoUrl": "", "userId": "" }, "user_tz": 480 }, "id": "jt_UQ4rTUZsr", "outputId": "f5f39524-71ee-4ff0-d681-6bfd325280ea" }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "\u003cFigure size 640x240 with 1 Axes\u003e" ] }, "metadata": { "tags": [] }, "output_type": "display_data" } ], "source": [ "trajectories = [tf_runtime.trajectory(horizon) for _ in range(5)]\r\n", "_, ax = plt.subplots(figsize=(8, 3))\r\n", "\r\n", "for trajectory in trajectories:\r\n", " ax.plot(range(horizon), trajectory[\"rw_var\"].get(\"state\"))" ] }, { "cell_type": "markdown", "metadata": { "id": "o2xZKsXGUzF7" }, "source": [ "Unfortunately, log probability evaluation is incorrect, as the simulator does not see the random draws as being random:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "executionInfo": { "elapsed": 880, "status": "ok", "timestamp": 1612907227631, "user": { "displayName": "", "photoUrl": "", "userId": "" }, "user_tz": 480 }, "id": "PNzf1HN-UsRB", "outputId": "b3e6118b-9a19-4b17-b682-4477c7767761" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0.0, 0.0, 0.0, 0.0, 0.0]\n" ] } ], "source": [ "log_probs = [\r\n", " log_probability.log_probability_from_value_trajectory(\r\n", " [random_walk_var], traj, horizon - 1).numpy()\r\n", " for traj in trajectories\r\n", "]\r\n", "print(log_probs)" ] }, { "cell_type": "markdown", "metadata": { "id": "Ibp8jOtJU8iF" }, "source": [ "Here is a snippet that illustrates a violation of condition (2)." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "tbPhiZxoVBip" }, "outputs": [], "source": [ "def rw_next(previous_state: Value) -\u003e Value:\r\n", " return Value(\r\n", " state=previous_state.get(\"state\") + ed.Normal(loc=0.0, scale=1.0))\r\n", "\r\n", "\r\n", "random_walk_var = Variable(name=\"rw_var\", spec=ValueSpec(state=FieldSpec()))\r\n", "random_walk_var.initial_value = variable.value(\r\n", " lambda: Value(state=0.0 + ed.Normal(loc=0.0, scale=1.0)))\r\n", "random_walk_var.value = variable.value(rw_next, (random_walk_var.previous,))\r\n", "\r\n", "tf_runtime = runtime.TFRuntime(network=network_lib.Network([random_walk_var]))" ] }, { "cell_type": "markdown", "metadata": { "id": "H2r9LlQ5VNB1" }, "source": [ "This code is again identical in the Monte Carlo sense. However, what is returned are TensorFlow scalars due to the final addition operator and not Edward2 random variables, so the simulator cannot associate the data with the random draws. This will generate an error stating that some random variable is not being returned." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "SSMFW_uxVMN4" }, "outputs": [], "source": [ "trajectories = [tf_runtime.trajectory(horizon) for _ in range(5)]\r\n", "try: \r\n", " log_probs = [\r\n", " log_probability.log_probability_from_value_trajectory(\r\n", " [random_walk_var], traj, horizon - 1).numpy()\r\n", " for traj in trajectories\r\n", " ]\r\n", "except Exception as e:\r\n", " print(e)\r\n" ] }, { "cell_type": "markdown", "metadata": { "id": "ammIv-pjagxd" }, "source": [ "\r\n", "\r\n", "---\r\n", "\r\n", "\r\n", "The second significant source of errors stems from the fact that RecSim NG variables are *not allowed to change shape across time steps*. This requirement may seem straightforward, but ends up having some interesting implications on the way in which variables should be sampled to ensure their log probabilities can be properly evaluated.\r\n", "\r\n", "One somewhat subtle source of confusion arises from the notion of shapes used by TensorFlow Probability (TFP). TFP uses the notions of *event shape*, *batch shape*, and *sample shape*. The event shape is the tensor shape of the random variable being sampled. The batch shape is used to pack independent, but not identical, draws of distributions from the same family into a tensor, while the sample shape is used to pack independent and identical draws. These shapes determine the shape of the log probability tensor computed by the TFP distribution, respectively, the Edward2 random variable. \r\n", "\r\n", "The significance of this in the context of simulation is that we may accidentally implement simulations which run as intended in the Monte Carlo regime, but cause shape-change issues during log probability computation.\r\n", "\r\n", "Here is a quick illustration. Suppose we wish to sample two values from a standard normal distribution. In principle, we could use any of the following three ways to generate these samples, drawing from:\r\n", "1. a standard normal with sample shape (2,), \r\n", "1. a batch of two standard normals, and \r\n", "1. a bivariate normal with zero mean and unit covariance.\r\n", "\r\n", "When evaluating the log probabilities under (1) and (2), we get a 2x1 tensor of log probs, but (3) will return a single scalar:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "executionInfo": { "elapsed": 404, "status": "ok", "timestamp": 1612907228957, "user": { "displayName": "", "photoUrl": "", "userId": "" }, "user_tz": 480 }, "id": "S86OY0YlaHqX", "outputId": "53302ca7-2e07-4cac-ffde-7cec13403c7a" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Log prob with sample shape [2]: tf.Tensor([-0.91893864 -3.3121057 ], shape=(2,), dtype=float32)\n", "Log prob with batch shape [2]: tf.Tensor([-0.91893864 -3.3121057 ], shape=(2,), dtype=float32)\n", "Log prob with event shape [2]: tf.Tensor(-4.2310443, shape=(), dtype=float32)\n" ] } ], "source": [ "sample = tf.random.normal(shape=[2], mean=0.0, stddev=1.0)\n", "indep_sample_rv = ed.Normal(loc=0.0, scale=1.0, sample_shape=[2])\n", "print(\"Log prob with sample shape [2]:\",\n", " indep_sample_rv.distribution.log_prob(sample))\n", "batch_sample_rv = ed.Normal(loc=[0.0, 0.0], scale=[1.0, 1.0])\n", "print(\"Log prob with batch shape [2]:\",\n", " batch_sample_rv.distribution.log_prob(sample))\n", "event_sample_rv = ed.MultivariateNormalDiag(\n", " loc=[0.0, 0.0], scale_identity_multiplier=1.0)\n", "print(\"Log prob with event shape [2]:\",\n", " event_sample_rv.distribution.log_prob(sample))" ] }, { "cell_type": "markdown", "metadata": { "id": "ec8kAS8zgS0u" }, "source": [ "This is again a situation where these different samplers are identical in the Monte Carlo sense, but sample from \"semantically\" different distributions. \r\n", "\r\n", "This can easily leads to errors in simulations by causing a log-prob shape mismatch between the initial and next state distributions:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "muTrhUWXg2c2" }, "outputs": [], "source": [ "def rw_next(previous_state: Value) -\u003e Value:\n", " # Next state samples from a batch of two normals.\n", " return Value(state=ed.Normal(loc=previous_state.get(\"state\"), scale=1.0))\n", "\n", "\n", "random_walk_var = Variable(name=\"rw_var\", spec=ValueSpec(state=FieldSpec()))\n", "# Initial state samples from a multivariate normal.\n", "random_walk_var.initial_value = variable.value(lambda: Value(\n", " state=ed.MultivariateNormalDiag(\n", " loc=[0.0, 0.0], scale_identity_multiplier=1.0)))\n", "random_walk_var.value = variable.value(rw_next, (random_walk_var.previous,))\n", "\n", "tf_runtime = runtime.TFRuntime(network=network_lib.Network([random_walk_var]))" ] }, { "cell_type": "markdown", "metadata": { "id": "wF-809XdhL5P" }, "source": [ "This model is fine for sampling, but evaluating log probs will lead to an exception:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "Qv4pt8IDhWTt" }, "outputs": [], "source": [ "trajectories = [tf_runtime.trajectory(horizon) for _ in range(5)]\r\n", "try: \r\n", " log_probs = [\r\n", " log_probability.log_probability_from_value_trajectory(\r\n", " [random_walk_var], traj, horizon - 1).numpy()\r\n", "\r\n", " for traj in trajectories\r\n", " ]\r\n", "except Exception as e:\r\n", " print(e)" ] }, { "cell_type": "markdown", "metadata": { "id": "pBiL6FXZhpoT" }, "source": [ "This error shows the RecSim NG typechecking system informing us that a field changed shape across iterations. \r\n", "\r\n", "With these precautions in mind, we now illustrate how these ideas come together in larger recommender-system applications." ] }, { "cell_type": "markdown", "metadata": { "id": "vJa2c6KCh3jU" }, "source": [ "# Putting It All Together: User Model Learning\r\n", "\r\n", "In this section, we showcase how the uncertainty APIs of RecSim NG can be used within a recommender-system model-learning application. In this scenario, we envision a number of users repeatedly interacting with a recommender. Each interaction proceeds as follows: the recommender serves a slate (small set) of recommended items to each user; each user examines their slate and responds to it in some way (e.g., by clicking, rating or consuming an item in the case of content); each user then updates their own (latent) state; finally, the recommender observes each user's responses.\r\n", "\r\n", "The RecSim NG tasks we consider focus on the inference of the parameters of the *user model*, comprising models which specify their choice/response behaviors and how they update their state. We assume there is a \"ground truth\" user model with specific parameter values, which is used to generate trajectories. These trajectories will be used to fit a second instantiation of the user model---think of this as the model of user behavior a recommender system might build to optimize its performance---with the same structure, but with unknown parameter values. We consider two flavors of problem: the easy case is where the trajectory data contains all simulation variables, including those that model \"mental processes\" of the user; and the more involved, but more realistic, case in which some random variables are not made available in the trajectories. The latter case reflects the situation faced by most recommender systems, which cannot directly observe a user's latent state (e.g., her interests, level of satisfaction, etc.).\r\n", "\r\n", "For simplicity of presentation, we hardcode some parameter values directly into the model. A version of this example can also be found at ```recsim_ng.applications.latent_variable_model_learning```, where most parameter values are configurable.\r\n", "\r\n", "## The User Model\r\n", "\r\n", "In our simulated world, we assume that each recommendable item can be represented in a 2-dimensional Euclidean space. \r\n", "A user has a *state* consisting of:\r\n", "* an *intent* realized by a target item: we assume the user has some goal in mind, expressible as an \"ideal\" point within the same space in which the items are embedded. The intent induces a preference model according to which items closer to the user's intent are preferred to those which are further away.\r\n", "* a dynamic *satisfaction* variable $s$, which reflects the user's (personal or subjective) assessment of whether the recommender makes progress towards the target.\r\n", "\r\n", "When presented with a slate of recommended items, the user's *choice process* either selects an item for consumption, using the sum of item affinities (computed as the negative Euclidean distance between the item and the intent) and satisfaction as logits, or abstain according to a constant \"no choice\" logit (which we set to 0 for simplicity). The user's satisfaction acts as a boost to the item-level logits compared to the constant \"no choice\" logit; thus, at high levels of satisfaction, the user is more likely to select some item for consumption. If the user's satisfaction drops and no good items are found, the user effectively \"drops out\" of the system (i.e., the probability of choosing anything other than \"no choice\" becomes negligible).\r\n", "\r\n", "The user state updates as follows:\r\n", "* The intent is sampled from a mixture model with component means $[1.0, 0.0]^T, [0.0, 1.0]^T$. This distribution over intents remains fixed over time.\r\n", "* Satisfaction $s$ evolves as: $$s_t = \\mathrm{satisfaction\\ sensitivity} \\cdot s_{t-1} + \\delta_t + \\epsilon,$$ where: satisfaction sensitivity is a parameter (set to 0.8 in this case); $\\delta_t$ is the difference between the maximum affinity among the items from the slate presented at time $t$ and the maximum of the time $(t-1)$ slate; and $\\epsilon$ is zero-mean Gaussian noise with standard deviation of $0.1$.\r\n", "\r\n", "This model is implemented below using intent, choice, and affinity model implementations provided by the RecSim NG library.\r\n", "\r\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "cellView": "form", "id": "EZP1nGig6CXL" }, "outputs": [], "source": [ "# @title RecSimNG modeling imports. \r\n", "from recsim_ng.stories import recommendation_simulation as simulation\r\n", "from recsim_ng.applications.latent_variable_model_learning import recommender\r\n", "from recsim_ng.entities.recommendation import user\r\n", "from recsim_ng.entities.state_models import static\r\n", "from recsim_ng.entities.choice_models import selectors\r\n", "from recsim_ng.entities.choice_models import affinities" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "_LT54_bftFOp" }, "outputs": [], "source": [ "class ModelLearningDemoUser(user.User):\n", "\n", " def __init__(self,\n", " config: Mapping[Text, Any],\n", " satisfaction_sensitivity: tf.Tensor,\n", " name: Text = 'ModelLearningDemoUser') -\u003e None:\n", " super().__init__(config, name)\n", " self._slate_size = config.get('slate_size')\n", " # Hardcoded parameter values.\n", " self._user_intent_variance = 0.1\n", " self._initial_satisfication = 5.0\n", " # Unknown satisfaction sensitivity.\n", " self._sat_sensitivity = satisfaction_sensitivity\n", " # The intent model as a GMM state model from the RecSim NG state\n", " # model library.\n", " batch_intent_means = tf.eye(\n", " 2, num_columns=2, batch_shape=(self._num_users,))\n", " lop_ctor = lambda params: tf.linalg.LinearOperatorScaledIdentity(\n", " num_rows=2, multiplier=params)\n", " self._intent_model = static.GMMVector(\n", " batch_ndims=1,\n", " mixture_logits=tf.zeros((self._num_users, 2)),\n", " component_means=batch_intent_means,\n", " component_scales=tf.sqrt(self._user_intent_variance),\n", " linear_operator_ctor=lop_ctor)\n", " # The choice model is a multinomial logit choice model from the RecSim NG\n", " # choice model library.\n", " self._choice_model = selectors.MultinomialLogitChoiceModel(\n", " batch_shape=(self._num_users,),\n", " nochoice_logits=tf.ones(self._num_users))\n", " # The affinity model is a target point similarity model, which by default\n", " # computes the negative Euclidean distance between the target point and the\n", " # item embedding.\n", " self._affinity_model = affinities.TargetPointSimilarity(\n", " batch_shape=(self._num_users,), slate_size=self._slate_size)\n", "\n", " def initial_state(self) -\u003e Value:\n", " \"\"\"Initial state value.\"\"\"\n", " return Value(\n", " satisfaction=ed.Deterministic(self._initial_satisfication *\n", " tf.ones(self._num_users)),\n", " intent=self._intent_model.initial_state().get('state'),\n", " max_slate_utility=tf.zeros(self._num_users))\n", "\n", " def next_state(self, previous_state: Value, _, slate_docs: Value) -\u003e Value:\n", " \"\"\"State transition kernel.\"\"\"\n", " # Compute the improvement of slate scores.\n", " slate_doc_features = slate_docs.get('features')\n", " slate_doc_affinities = self._affinity_model.affinities(\n", " previous_state.get('intent'), slate_doc_features).get('affinities')\n", " max_slate_utility = tf.reduce_max(slate_doc_affinities, axis=-1)\n", " improvement = max_slate_utility - previous_state.get('max_slate_utility')\n", " next_satisfaction = self._sat_sensitivity * previous_state.get(\n", " 'satisfaction') + improvement\n", " return Value(\n", " satisfaction=ed.Normal(loc=next_satisfaction, scale=0.01),\n", " intent=self._intent_model.next_state(\n", " Value(state=previous_state.get('intent'))).get('state'),\n", " max_slate_utility=max_slate_utility)\n", "\n", " def next_response(self, previous_state: Value, slate_docs: Value) -\u003e Value:\n", " \"\"\"The response value after the initial value.\"\"\"\n", " slate_doc_features = slate_docs.get('features')\n", " slate_doc_scores = self._affinity_model.affinities(\n", " previous_state.get('intent'), slate_doc_features).get('affinities')\n", " # Adding the user's satisfaction to the item scores.\n", " adjusted_scores = (\n", " slate_doc_scores + previous_state.get('satisfaction')[..., tf.newaxis])\n", " return self._choice_model.choice(adjusted_scores)\n", "\n", " def observation(self):\n", " pass\n", "\n", " def specs(self) -\u003e ValueSpec:\n", " response_spec = self._choice_model.specs()\n", " state_spec = ValueSpec(\n", " intent=self._intent_model.specs().get('state'),\n", " satisfaction=FieldSpec(),\n", " max_slate_utility=FieldSpec())\n", " return state_spec.prefixed_with('state').union(\n", " response_spec.prefixed_with('response'))" ] }, { "cell_type": "markdown", "metadata": { "id": "ctx8olxywR7U" }, "source": [ "\r\n", "With this user model, we can now set up the *ground-truth* simulation and generate some ground-truth trajectories." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "executionInfo": { "elapsed": 1590, "status": "ok", "timestamp": 1612910390147, "user": { "displayName": "", "photoUrl": "", "userId": "" }, "user_tz": 480 }, "id": "mEWC8u7Hl2Gt", "outputId": "9adbed7f-4408-4d9c-8a27-cc69c5b5adda" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "===============GROUND TRUTH LIKELIHOOD================\n", "tf.Tensor(-38.463882, shape=(), dtype=float32)\n", "======================================================\n" ] } ], "source": [ "# Initialize simulation parameters\r\n", "gt_satisfaction_sensitivity = 0.8 * tf.ones(5)\r\n", "num_users = 5\r\n", "num_topics = 2\r\n", "horizon = 6\r\n", "\r\n", "config = {\r\n", " \"slate_size\": 2,\r\n", " \"num_users\": num_users,\r\n", " \"num_topics\": num_topics,\r\n", " \"num_docs\": 0\r\n", "}\r\n", "# Set up ground truth runtime.\r\n", "gt_user_ctor = functools.partial(\r\n", " ModelLearningDemoUser,\r\n", " satisfaction_sensitivity=gt_satisfaction_sensitivity)\r\n", "gt_variables = simulation.simplified_recs_story(config, gt_user_ctor,\r\n", " recommender.SimpleNormalRecommender)\r\n", "gt_network = network_lib.Network(variables=gt_variables)\r\n", "gt_runtime = runtime.TFRuntime(network=gt_network)\r\n", "traj = dict(gt_runtime.trajectory(length=horizon))\r\n", "print('===============GROUND TRUTH LIKELIHOOD================')\r\n", "print(\r\n", " log_probability.log_probability_from_value_trajectory(\r\n", " variables=gt_variables, value_trajectory=traj, num_steps=horizon - 1))\r\n", "print('======================================================')" ] }, { "cell_type": "markdown", "metadata": { "id": "Wb8pbgwYdSER" }, "source": [ "We will also set up a parallel copy of the simulation in which the satisfaction sensitivity is *a priori* unknown and randomly initialized. We'll also evaluate the log probability of the ground-truth trajectories from the original simulator under the untrained model." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "executionInfo": { "elapsed": 1141, "status": "ok", "timestamp": 1612907234790, "user": { "displayName": "", "photoUrl": "", "userId": "" }, "user_tz": 480 }, "id": "qhzH_KtxE2qJ", "outputId": "240c2a05-5307-425e-a20d-2d5492575c15" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "===============UNTRAINED LIKELIHOOD================\n", "tf.Tensor(-223204.06, shape=(), dtype=float32)\n", "======================================================\n" ] } ], "source": [ "trainable_sat_sensitivity = tf.Variable(\n", " tf.math.sigmoid(ed.Normal(loc=tf.zeros(5), scale=1.0)))\n", "trainable_user_ctor = functools.partial(\n", " ModelLearningDemoUser, satisfaction_sensitivity=trainable_sat_sensitivity)\n", "t_variables = simulation.simplified_recs_story(\n", " config, trainable_user_ctor, recommender.SimpleNormalRecommender)\n", "trainable_network = network_lib.Network(variables=t_variables)\n", "trainable_runtime = runtime.TFRuntime(network=trainable_network)\n", "print('===============UNTRAINED LIKELIHOOD================')\n", "print(\n", " log_probability.log_probability_from_value_trajectory(\n", " variables=t_variables, value_trajectory=traj, num_steps=horizon - 1))\n", "print('======================================================')" ] }, { "cell_type": "markdown", "metadata": { "id": "a2l0ETf1djSP" }, "source": [ "As we can see, not surprisingly, the ground-truth trajectories are multiple (log-) orders of magnitude less plausible under the untrained model than they are under the ground-truth model. To calibrate (or train) the untrained model, we use the following procedure:\r\n", "1. We sample a set of trajectories from the ground-truth model.\r\n", "2. We adjust the satisfaction sensitivity parameter in the trained model in the direction that increases the likelihood of the ground-truth trajectories. \r\n", "\r\n", "This is a stochastic version of gradient-based maximum likelihood training. If the likelihood function is well-enough behaved, we can hope that this process will converge to the ground-truth parameters or some other set of parameters that performs equally well. The following code snippet implements the maximum likelihood training loop:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "executionInfo": { "elapsed": 4898, "status": "ok", "timestamp": 1612907239698, "user": { "displayName": "", "photoUrl": "", "userId": "" }, "user_tz": 480 }, "id": "fhwNuLN1FVd9", "outputId": "b99545d9-4da8-4534-999d-a79091a2d050" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Parameters before training: [0.48540968 0.37344843 0.5908341 0.3959334 0.12628874]\n", "Iteration 0, negative likelihood 223204.0625\n", "Parameter values: [0.49540967 0.38344842 0.6008341 0.40593338 0.13628875]\n", "Iteration 20, negative likelihood 83791.0234375\n", "Parameter values: [0.6824743 0.5748696 0.776621 0.5967244 0.3314404]\n", "Iteration 40, negative likelihood 26727.419921875\n", "Parameter values: [0.7964278 0.71955895 0.82324153 0.73694897 0.50187737]\n", "Iteration 60, negative likelihood 7806.90234375\n", "Parameter values: [0.81591403 0.7914579 0.7965654 0.799916 0.63205963]\n", "Iteration 80, negative likelihood 1937.3466796875\n", "Parameter values: [0.80240583 0.8072632 0.79837674 0.808281 0.7184297 ]\n", "Iteration 100, negative likelihood 365.5766906738281\n", "Parameter values: [0.7987236 0.80294615 0.80081785 0.80180526 0.7673559 ]\n" ] } ], "source": [ "optimizer = tf.keras.optimizers.Adam(learning_rate=0.01)\r\n", "\r\n", "@tf.function\r\n", "def training_step():\r\n", " with tf.GradientTape() as tape:\r\n", " gt_trajectory = gt_runtime.trajectory(length=horizon)\r\n", " neg_likelihood = -log_probability.log_probability_from_value_trajectory(\r\n", " variables=t_variables, value_trajectory=traj, num_steps=horizon - 1)\r\n", " grads = tape.gradient(neg_likelihood, [trainable_sat_sensitivity])\r\n", " optimizer.apply_gradients(zip(grads, [trainable_sat_sensitivity]))\r\n", " return neg_likelihood\r\n", "\r\n", "likelihood_history = []\r\n", "print(f\"Parameters before training: {trainable_sat_sensitivity.numpy()}\")\r\n", "for i in range(101):\r\n", " obj = training_step()\r\n", " likelihood_history.append(-obj)\r\n", " if not i % 20:\r\n", " print(f\"Iteration {i}, negative likelihood {obj.numpy()}\")\r\n", " print(f\"Parameter values: {trainable_sat_sensitivity.numpy()}\")" ] }, { "cell_type": "markdown", "metadata": { "id": "th4-ltNpfJlV" }, "source": [ "Running the training loops for a couple of iterations shows a nice improvement in likelihood as visualized below. From the printouts, we can also see that the parameters converge to their ground truth values." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "height": 327 }, "executionInfo": { "elapsed": 466, "status": "ok", "timestamp": 1612907240195, "user": { "displayName": "", "photoUrl": "", "userId": "" }, "user_tz": 480 }, "id": "IwVyc0dc3PD5", "outputId": "57c07b45-eb6f-40ae-d9fc-3c63153994fd" }, "outputs": [ { "data": { "image/png": "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\nNIi4uLib+xJEbiGXLplJ/f33Q61asGCBuYf9L7+YD9SOH68EX0REirZcHYY1btw4RowYwS+//GI9\n8TYwMJCyZcs6Oj6Hmj59Om3btrWpq1evns37/fv306ZNGxo2bMjy5ctJSkpi8uTJtGrVij179uB7\n1bn0oaGhTJo0ibFjx9K+fXt27tzJxIkTiYmJYdGiRdZ+ly9fJigoiH///Zc5c+ZQvnx55s+fT8eO\nHdm4cSOtW7e29t28eTOdOnWiS5curFmzhri4OF555RWCgoLYtWsXrnoKUCRbe/bA4sWwbBkkJEBQ\nkLlbTo8e4Obm7OhERETykXEL2LRpkwEYX3755Q379unTx/Dx8TESEhKsdceOHTNKlChhjBkzxlp3\n+vRpw83NzRg+fLjN50NDQw2LxWLs27fPWjd//nwDMLZu3WqtS0lJMerWrWs0a9bM5vNNmzY16tat\na6SkpFjrtmzZYgDGggULso07KirKAIyoqKgb/owiRcmFC4axeLFhNGliGGAYfn6GMX68YRw65OzI\nREREbOVnvparE28Nw2DHjh18+eWXfPLJJ5lKYZWamso333zDww8/TJkyZaz1VapUoW3btqxatcpa\nt3btWpKSkjItTxo8eDCGYbB69Wpr3apVq6hVqxaBgYHWOhcXF/r168eOHTuIiYkBICYmhp07d9K/\nf39cXK78R5aWLVtSs2ZNm/uL3OoOHIDnnwd/fxg+3HyYds0aOHECQkOhenVnRygiIuI8di/X+eOP\nP3jooYc4ePAghmFkardYLAwYMMAhwTnayJEjeeyxx6xr4idNmsR9991nbT98+DCJiYkEBARk+mxA\nQAAbNmwgKSkJNzc39u7dC0D9+vVt+vn5+eHj42NtB9i7dy+tWrXKckyAffv24e/vb/1MdvffsmVL\nLn5qkaIjNdVM5BcuhIgI8PGBp582k/xq1ZwdnYiISMFhd5I/cuRIkpKS+OKLLwgICCgUa8TLli3L\nqFGjaNOmDd7e3hw6dIiZM2fSpk0bvv32Wzp06ABAfHw8AF5eXpnG8PLywjAMzp49i5+fH/Hx8bi6\nuuLp6Zll34yxMsbNbsyr73uj+189psit5MwZc639/Pnw55/QsqW5x33v3jqsSkREJCt2J/k7duxg\n8eLF9O7dOy/iuaHIyMhMD89m59dff6Vhw4Y0atSIRo0aWetbtWpFz549qV+/PmPGjLEm+RksFku2\n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\n3Xetr6/dFgiU5Bd058/D449DkyYwebKzoxERERGRvGB3kp+enp4XcUg+GTUKYmNh7VooUcLZ0YiI\niIhIXsjVYVhSOH35JXz8MXz0EdSo4exoRERERCSv2L1PvhROf/4Jw4dD794waJCzoxERERGRvJSj\nmfw777yTVatW0aBBA7hQUwIAAButSURBVKpVq3bdU20tFguHDx92WIBy89LSYMAA8PSE99+HXB5K\nLCIiIiKFRI6S/NatW1OmTBnr6+sl+VLwvPUWbN4MERHg5eXsaEREREQkr+Uoyf/444+tr5csWZJX\nsUge2L0bJk6El1+Gtm2dHY2IiIiI5AetyS/CEhOhf3+4+26YNs3Z0YiIiIhIfsn17joJCQn88ccf\nJCYmZmq7//77byoocYzx4+HwYYiKgpIlnR2NiIiIiOQXu5P81NRUnnrqKT755BPS0tKy7JNdveSf\nH36Ad94x1+PffbezoxERERGR/GT3cp3Zs2fz9ddf89FHH2EYBu+++y7vv/8+99xzD3fddRfff/99\nXsQpdvj3X3ObzLZt4fnnnR2NiIiIiOQ3u5P8Tz/9lAkTJhAcHAxA8+bNGTp0KNu3b6dKlSps2rTJ\n4UGKfZ59FhISYMkSKKanLkRERERuOXangEeOHKFBgwYU+1/2mJSUZG176qmnWLZsmeOiE7tt3Ahh\nYfDuu1C5srOjERERERFnsDvJ9/T0JDk5GYvFgpeXF8ePH7e2ubu7Ex8f79AAxT6hofDww9Cvn7Mj\nERERERFnsTvJr127NkePHgWgZcuWvP322/z111/ExcXx5ptvUqtWLYcHKTnn4gLvvadTbf+/vfuP\nqjnP/wD+/Ejd248lbr9cPwozSqPkOBEzyCbF1CTGGYal7HCGstkzfobt93AGSzo4i0VEdoxihewQ\n2V0hv3bl544RM0ylm6bfhPf3j/l2p+tecfup2/Nxzj3mvj+vz/vzup9Xxqt73/fzISIiImrL9L66\nzieffILbt28DAKKiojB8+HDY29sDAIyNjZGSktK4GZJeIiIAK6uWzoKIiIiIWpLeTf6cOXPU/z1g\nwABcv34dBw4cgCRJ8Pb25jv5LeyDD1o6AyIiIiJqaXo1+VVVVYiOjsaECRMwcOBAAED37t0xd+7c\nJkmOiIiIiIj0p9eafLlcjrVr16K8vLyp8iEiIiIiogbS+4u3ffv2VX/xloiIiIiI3j56N/nLly9H\n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\ngg==\n", "text/plain": [ "\u003cFigure size 640x240 with 1 Axes\u003e" ] }, "metadata": { "tags": [] }, "output_type": "display_data" } ], "source": [ "_, ax = plt.subplots(figsize=(8, 3))\r\n", "ax.plot(range(len(likelihood_history)), likelihood_history)\r\n", "plt.xlabel('training iteration')\r\n", "plt.ylabel('trainable model likelihood')\r\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "id": "2BVyFAa1ruQ5" }, "source": [ "## Partially observed data.\r\n", "\r\n", "Model learning problems like the one above, where all random variables are observed in every trajectory, are relatively straightforward to solve (at least conceptually). However, in many real-world applications, especially those concerning recommender systems, we cannot expect to observe everything that goes on in the domain of interest. This is true almost by definition in the realm of *user modeling*, where the tools needed to understand users' behaviors tend to be psychometric constructs, such as preferences, interests, personality characteristics, mood/sentiment, and so on. These are hypothesized to \"exist\" only in the user's mind and can only be inferred via the observed behaviors which they influence. Other unobservable characteristics involving the user's context or environment may also influence their behavior in a recommendation setting (e.g., context variables like the user's location, their activity, and their companions).\r\n", "\r\n", "Learning simulators from partially observed data is still possible, though not as straightforward as in the fully observed case. \r\n", "\r\n", "There are several well-understood ways to train a latent variable model for use as a simulator. For the purposes of this tutorial, we implement a classical technique called *Expectation-Maximization (EM)*. \r\n", "\r\n", "Let $X$ be the set of observed variables, $Y$ be the set of unobserved variables, and $\\theta$ be the set of model parameters. In the fully observed case ($Y = \\emptyset$), one natural approach is to find parameters that maximize the plausibility of the observed data $X$ by maximizing the log-likelihood:\r\n", "$$\\theta^\\ast = \\arg\\max_\\theta \\log p_\\theta(X).$$\r\n", "\r\n", " The starting point of EM is to extend the idea of maximizing log-marginal likelihood of $X$ by integrating out $Y$:\r\n", " $$\\theta^* = \\arg\\max_\\theta \\log \\int_Y p_\\theta(X,Y).$$\r\n", "Algorithmically, this is done by constructing a sequence of lower bounds\r\n", "$$ f(\\theta; \\theta_k) = \\int_Y p_{\\theta^k}(Y|X)\\log p_\\theta(X,Y) + H_{\\theta^k} \\leq \\log \\int_Y p_\\theta(X,Y),$$\r\n", "where $\\theta^k$ is the parameter guess at step $k$, and $H_{\\theta^k}$ is a quantity dependent on $\\theta_k$, which can be ignored for our particular purposes. \r\n", "\r\n", "A \"vanilla\" EM iteration (e.g., step $k+1$) typically proceeds in two phases:\r\n", "1. Compute $f(\\theta; \\theta_k)$ (E-step).\r\n", "2. Update parameters as $\\theta_{k+1} = \\arg\\max_\\theta f(\\theta; \\theta_k)$ (M-step).\r\n", "\r\n", "There are two challenges to address before we can put this into action: first, we need a tractable way of computing (possibly approximating) the posterior expectation over $Y|X$ in the E-step. Second, we need to be able to compute (again, approximate) the argmax parameters in the M-step. \r\n", "\r\n", "The first challenge will be addressed using *posterior sampling*. Specifically, we replace the expectation $\\int_Y p_{\\theta^k}(Y|X)\\log p_\\theta(X,Y)$ by a Monte-Carlo estimate $\\frac{1}{|S|}\\sum_{s\\in S} \\log p_\\theta(X,Y_s)$, where $\\{Y_1,\\ldots, Y_s\\}$ are samples from the posterior distribution $p(\\cdot|X)$. The second challenge is addressed using gradient ascent on $\\theta$. In fact, we just replace step 2 by a *single* gradient step instead of running gradient descent to convergence every time (this works fine in our case---surprise, surprise---but, in general, how much and what type of maximization is realized in step 2 may change the convergence properties of the algorithm).\r\n", "\r\n", "We already know how to perform gradient ascent on parameter likelihoods, so what remains to show is how to implement posterior sampling with RecSim NG." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "executionInfo": { "elapsed": 351, "status": "ok", "timestamp": 1612907240637, "user": { "displayName": "", "photoUrl": "", "userId": "" }, "user_tz": 480 }, "id": "mFHMaarRHt3D", "outputId": "a20817f9-fea8-4db5-ae9e-5cb22a0c76e9" }, "outputs": [ { "data": { "text/plain": [ "\u003ctf.Variable 'UnreadVariable' shape=(5,) dtype=float32, numpy=\n", "array([0.85395336, 0.62427443, 0.82974935, 0.5824438 , 0.59435993],\n", " dtype=float32)\u003e" ] }, "execution_count": 23, "metadata": { "tags": [] }, "output_type": "execute_result" } ], "source": [ "# Reinitialize trainable variables.\n", "trainable_sat_sensitivity.assign(\n", " tf.math.sigmoid(ed.Normal(loc=tf.zeros(5), scale=1.0)))" ] }, { "cell_type": "markdown", "metadata": { "id": "GzK-0l7zZokj" }, "source": [ "Our posterior sampling implementation uses a *Markov-Chain Monte Carlo (MCMC)* sampler provided by TFP. MCMC is a family of algorithms for sampling from an unnormalized density---such methods start at some point in the support of the density and incrementally perturb that point using information from the density. We use the *Hamiltonian Monte Carlo (HMC)* approach, which stochastically moves the sample in the direction of the gradient of the log probability function. TFP already offers a robust implementation of HMC, so our job is only to provide its inputs.\r\n", "\r\n", "To illustrate latent variable model learning, let's assume that every user's intent is an *unobserved* variable, while all other parts of the trajectory are given. To use TFP's HMC implementation, we need to implement the unnormalized (log) density $\\phi(Y) := \\log p(X,Y)$, where $Y$ is the array consisting of the users' intents. Moreover, $\\phi(Y)$ must be differentiable with respect to $Y$. This is relatively straightforward in RecSim NG. Since the user intent doesn't change over time, we can recreate the intent trajectory by expanding the intent vector over time. Then, we combine that intent trajectory with the observed data and call the log prob function. The implementation is given below." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "cesoYsEcZkh1" }, "outputs": [], "source": [ "@tf.function\r\n", "def unnormalized_log_prob_train(intent: tf.Tensor) -\u003e tf.Tensor:\r\n", " # Expand initial intent to complete intent trajectory.\r\n", " intent_traj = tf.expand_dims(\r\n", " intent, axis=0) + tf.zeros((horizon, num_users, num_topics))\r\n", " # Combine intent trajectory with the observed data.\r\n", " user_state_dict = dict(traj['user state'].as_dict)\r\n", " user_state_dict['intent'] = intent_traj\r\n", " traj['user state'] = Value(**user_state_dict)\r\n", " # Return the log probability of the imputed intent + observations.\r\n", " return log_probability.log_probability_from_value_trajectory(\r\n", " variables=t_variables, value_trajectory=traj, num_steps=horizon - 1)" ] }, { "cell_type": "markdown", "metadata": { "id": "YhV1LIKAe6uk" }, "source": [ "With the unnormalized density implementation, setting up the HMC sampler follows the TFP [HamiltonianMonteCarlo example code](https://www.tensorflow.org/probability/api_docs/python/tfp/mcmc/HamiltonianMonteCarlo) almost verbatim." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "QfRerqg7fD3c" }, "outputs": [], "source": [ "num_results = int(2e3)\r\n", "num_burnin_steps = int(5e2)\r\n", "adaptive_hmc = tfp.mcmc.SimpleStepSizeAdaptation(\r\n", " tfp.mcmc.HamiltonianMonteCarlo(\r\n", " target_log_prob_fn=unnormalized_log_prob_train,\r\n", " num_leapfrog_steps=5,\r\n", " step_size=.00008),\r\n", " num_adaptation_steps=int(num_burnin_steps * 0.8))\r\n", "\r\n", "# Run the chain (with burn-in).\r\n", "@tf.function\r\n", "def run_chain():\r\n", " samples, is_accepted = tfp.mcmc.sample_chain(\r\n", " num_results=num_results,\r\n", " num_burnin_steps=num_burnin_steps,\r\n", " current_state=tfd.Normal(loc=tf.ones((5, 2)) / 5, scale=0.5).sample(),\r\n", " kernel=adaptive_hmc,\r\n", " trace_fn=lambda _, pkr: pkr.inner_results.is_accepted)\r\n", "\r\n", " sample_mean = tf.reduce_mean(samples)\r\n", " sample_stddev = tf.math.reduce_std(samples)\r\n", " is_accepted = tf.reduce_mean(tf.cast(is_accepted, dtype=tf.float32))\r\n", " return samples, sample_mean, sample_stddev, is_accepted" ] }, { "cell_type": "markdown", "metadata": { "id": "PleMCLDkgDVk" }, "source": [ "We now implement our training loop, which imputes the latent user intents and then computes the likelihood gradients of the model parameters (please note: running this may take some time):" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "executionInfo": { "elapsed": 3134740, "status": "ok", "timestamp": 1612910376208, "user": { "displayName": "", "photoUrl": "", "userId": "" }, "user_tz": 480 }, "id": "JMF8jZjOHNs0", "outputId": "2e847c80-ebf9-45e7-a099-af14a3cfe684" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Iteration 0, unnormalized negative ELBO 10907.8486328125\n", "Parameter values: [0.8439534 0.6342744 0.81974936 0.59244376 0.6043599 ]\n", "Acceptance rate: 0.6629999876022339\n", "Iteration 5, unnormalized negative ELBO 3477.6552734375\n", "Parameter values: [0.84924823 0.6806311 0.79297256 0.6338071 0.6531151 ]\n", "Acceptance rate: 0.8705000281333923\n", "Iteration 10, unnormalized negative ELBO 3598.144775390625\n", "Parameter values: [0.8455839 0.72616017 0.7912083 0.66730124 0.69621223]\n", "Acceptance rate: 0.8880000114440918\n", "Iteration 15, unnormalized negative ELBO 2717.02294921875\n", "Parameter values: [0.8568001 0.7666226 0.8023705 0.7004531 0.73060715]\n", "Acceptance rate: 0.8995000123977661\n", "Iteration 20, unnormalized negative ELBO 1063.31103515625\n", "Parameter values: [0.8587995 0.79394627 0.80976456 0.7290326 0.7561469 ]\n", "Acceptance rate: 0.8774999976158142\n", "Iteration 25, unnormalized negative ELBO 2830.359375\n", "Parameter values: [0.84353304 0.809964 0.80888164 0.75223213 0.76822114]\n", "Acceptance rate: 0.8665000200271606\n", "Iteration 30, unnormalized negative ELBO 3480.015380859375\n", "Parameter values: [0.83962655 0.7962504 0.80363363 0.77005285 0.7776636 ]\n", "Acceptance rate: 0.9800000190734863\n", "Iteration 35, unnormalized negative ELBO 6820.14599609375\n", "Parameter values: [0.8336434 0.7822843 0.8001987 0.77669513 0.78704494]\n", "Acceptance rate: 0.9959999918937683\n", "Iteration 40, unnormalized negative ELBO 344.58355712890625\n", "Parameter values: [0.8260194 0.77690136 0.79889727 0.7722866 0.79511166]\n", "Acceptance rate: 0.6320000290870667\n", "Iteration 45, unnormalized negative ELBO 3310.296630859375\n", "Parameter values: [0.8132283 0.7714392 0.7972437 0.7701629 0.8013445]\n", "Acceptance rate: 0.628000020980835\n", "Iteration 50, unnormalized negative ELBO 5423.1416015625\n", "Parameter values: [0.81113327 0.7646369 0.7935569 0.76339734 0.8058682 ]\n", "Acceptance rate: 0.9664999842643738\n", "Iteration 55, unnormalized negative ELBO 382.6935729980469\n", "Parameter values: [0.828589 0.7637927 0.7989959 0.7597632 0.8099311]\n", "Acceptance rate: 0.7935000061988831\n", "Iteration 60, unnormalized negative ELBO 2912.44775390625\n", "Parameter values: [0.84019667 0.7481886 0.7990552 0.7504208 0.81106424]\n", "Acceptance rate: 0.8755000233650208\n", "Iteration 65, unnormalized negative ELBO 1522.7490234375\n", "Parameter values: [0.8500635 0.7464666 0.798144 0.7483299 0.8101944]\n", "Acceptance rate: 0.9350000023841858\n", "Iteration 70, unnormalized negative ELBO 595.91650390625\n", "Parameter values: [0.85677725 0.74388593 0.79862046 0.74948245 0.80772215]\n", "Acceptance rate: 0.722000002861023\n", "Iteration 75, unnormalized negative ELBO 5040.6142578125\n", "Parameter values: [0.8487373 0.7467692 0.8045625 0.75377744 0.8067379 ]\n", "Acceptance rate: 0.859499990940094\n", "Iteration 80, unnormalized negative ELBO 7894.9921875\n", "Parameter values: [0.8404005 0.74889225 0.79082286 0.76096314 0.8071549 ]\n", "Acceptance rate: 0.625\n", "Iteration 85, unnormalized negative ELBO 324.404052734375\n", "Parameter values: [0.8299797 0.7334399 0.78776354 0.758886 0.80702996]\n", "Acceptance rate: 0.9004999995231628\n", "Iteration 90, unnormalized negative ELBO 3195.50732421875\n", "Parameter values: [0.8315344 0.7305668 0.7954734 0.7580647 0.8074295]\n", "Acceptance rate: 0.987500011920929\n", "Iteration 95, unnormalized negative ELBO 951.7831420898438\n", "Parameter values: [0.83558345 0.7371346 0.8031642 0.7608758 0.81014526]\n", "Acceptance rate: 0.8690000176429749\n", "Iteration 100, unnormalized negative ELBO 10119.37109375\n", "Parameter values: [0.83159685 0.7453298 0.8079736 0.76339805 0.8133612 ]\n", "Acceptance rate: 0.6384999752044678\n" ] } ], "source": [ "#@test {\"skip\": true}\n", "# Initialize the HMC transition kernel.\n", "optimizer = tf.keras.optimizers.Adam(learning_rate=0.01)\n", "elbo_history = []\n", "for i in range(101):\n", " posterior_samples, sample_mean, sample_stddev, is_accepted = run_chain()\n", " log_probs = []\n", " with tf.GradientTape() as tape:\n", " log_probs = tf.vectorized_map(unnormalized_log_prob_train,\n", " posterior_samples[num_burnin_steps:,])\n", " neg_elbo = -tf.reduce_mean(log_probs)\n", " grads = tape.gradient(neg_elbo, [trainable_sat_sensitivity])\n", " optimizer.apply_gradients(zip(grads, [trainable_sat_sensitivity]))\n", " elbo_history.append(-neg_elbo)\n", " if not i % 5:\n", " print(f\"Iteration {i}, unnormalized negative ELBO {neg_elbo.numpy()}\")\n", " print(f\"Parameter values: {trainable_sat_sensitivity.numpy()}\")\n", " print(f\"Acceptance rate: {is_accepted.numpy()}\")" ] }, { "cell_type": "markdown", "metadata": { "id": "DYc8EzNigRzH" }, "source": [ "We see that the ground truth parameters are recovered more or less successfully. The following figure plots the progress of the objective function. As we mention that we only have one gradient step for the M-step, the objective value can oscillate with high variance.\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "height": 344 }, "executionInfo": { "elapsed": 525, "status": "ok", "timestamp": 1612910376764, "user": { "displayName": "", "photoUrl": "", "userId": "" }, "user_tz": 480 }, "id": "1l8qJBWQ3-H4", "outputId": "e66a69c2-e5e4-4adc-f0b1-23750682d16a" }, "outputs": [ { "data": { "text/plain": [ "Text(0, 0.5, 'ELBO')" ] }, "execution_count": 27, "metadata": { "tags": [] }, "output_type": "execute_result" }, { "data": { "image/png": "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\nA5988gk2btzYYUpsvgfsw2effYYvvvgCp06d6vK48ZjLW2trKxobG7FixQosXboUABAaGooBAwZg\n8eLFKCgogFqtBsBjbQ/Ky8sRGxsLb29v5OTkwMvLC8eOHcPq1atx48YNfPjhh9q2PN72zdTj21vv\nAwbuEuPh4WHwzKumpgaA4TM7kp+VK1di9erVWLNmDV544QXtcg8PDwCGv1mpqamBQqGAm5ub1fpJ\n3Xfjxg0sXLgQL774Inx8fHD16lUAwK1btwAAV69ehaOjI4+5nfDw8MD//d//dZjufNq0aVi8eDFO\nnjyJp556CgCPtT1YunQprl+/jtOnT2uzqI899hg8PT0xZ84czJo1C0OGDAHA422vzPnf7eHhgcbG\nRtTX12tP4HXbtk/edYalMhITHByM7777Di0tLXrLi4uLAQBBQUG26Bb1opUrVyItLQ1paWl4/fXX\n9daNGjUKTk5O2uOtq7i4GPfccw9UKpW1uko9UFVVhcuXL+O///u/cdddd2lv2dnZuHnzJu666y48\n++yzPOZ2wlCdKwDtUJD9+vXjsbYjp0+fxujRozuUPjz88MMAoC2h4fG2X+YcX7G2vX3bS5cuoaqq\nyqzYjoG7xMyYMQM3btzAZ599prc8MzMTPj4+mDBhgo16Rr3hrbfeQlpaGpYvX44VK1Z0WO/g4IDY\n2Fjs2rULdXV12uU//vgjDh06hLi4OGt2l3pgyJAhOHToUIfb1KlToVKpcOjQIaxevZrH3E48/fTT\nAIC8vDy95fv27QMATJw4kcfajvj4+ODMmTO4ceOG3vJvvvkGADB8+HAebztnzvGNioqCSqVCRkaG\n3jYyMjKgUCg6HSu+A5MHjiSriYiIEO666y5hy5YtwsGDB4V58+YJAISsrCxbd416YMOGDQIAISoq\nSvjmm2863ETfffed4OLiIjz22GPCvn37hF27dglBQUGCj4+PUFlZacNXQL3B0DjuPOb2ITY2VlAq\nlcJbb70lfPXVV8If/vAHQaVSCTExMdo2PNb2Yc+ePYJCoRAmTpwo/O1vfxMKCgqENWvWCC4uLsLo\n0aOFpqYmQRB4vOVs3759ws6dO4Xt27cLAIT4+Hhh586dws6dO4WbN28KgmDe8V29erWgUCiE119/\nXTh8+LCwfv16QalUCvPmzTOrXwzcJaiurk5YtGiRMGTIEGHAgAHCmDFjhOzsbFt3i3poypQpAgCj\n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\nyrXTAAAAAElFTkSuQmCC\n", "text/plain": [ "\u003cFigure size 640x240 with 1 Axes\u003e" ] }, "metadata": { "tags": [] }, "output_type": "display_data" } ], "source": [ "#@test {\"skip\": true}\r\n", "_, ax = plt.subplots(figsize=(8, 3))\r\n", "ax.plot(range(len(elbo_history)), elbo_history)\r\n", "plt.xlabel('training iteration')\r\n", "plt.ylabel('ELBO')" ] } ], "metadata": { "colab": { "collapsed_sections": [], "last_runtime": { "build_target": "//research/biology/alphagenome:alphagenome_colab", "kind": "private" }, "name": "RecSim NG: Dealing With Uncertainty.ipynb", "provenance": [ { "file_id": "1TjdB6jU20i0KyQl8h5QJAQTSB8oxlHTo", "timestamp": 1612906289114 } ] }, "kernelspec": { "display_name": "Python 3", "name": "python3" } }, "nbformat": 4, "nbformat_minor": 0 }