From b604aa986700138d191abf38d8ab622cc8bc38b4 Mon Sep 17 00:00:00 2001 From: Sam Duffield Date: Mon, 14 Nov 2022 19:35:20 +0000 Subject: [PATCH 1/7] add dt to readme --- README.md | 51 +++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 45 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 965d8c7..ab61f55 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,11 @@ # qujax Represent a (parameterised) quantum circuit as a pure [JAX](https://github.com/google/jax) function that -takes as input any parameters of the circuit and outputs a _statetensor_. The statetensor encodes all $2^N$ amplitudes -of the quantum state and can then be used downstream for exact expectations, gradients or sampling. - -qujax also supports densitytensor simulations. A densitytensor is a tensor representation of the density matrix and allows for mixed states and generic Kraus operators. +takes as input any parameters of the circuit and outputs either a _statetensor_ or a _densitytensor_ depending on +the choice of simulator. The statetensor encodes all $2^N$ amplitudes of the quantum state in a tensor version +of the statevector, for $N$ qubits. The densitytensor represents a tensor version of the +$2^N \times 2^N$ density matrix (allowing for mixed states and generic Kraus operators). +Either representation can then be used downstream for exact expectations, gradients or sampling. A JAX implementation of a quantum circuit is useful for runtime speedups, automatic differentiation and support for GPUs/TPUs. @@ -21,7 +22,7 @@ Some useful links: pip install qujax ``` -## Parameterised quantum circuits with qujax +## Statetensor simulations with qujax ```python from jax import numpy as jnp import qujax @@ -71,10 +72,37 @@ expectation_and_grad(jnp.array([0.1])) # DeviceArray([-2.987832], dtype=float32)) ``` +## Densitytensor simulations with qujax +qujax also supports densitytensor simulations + +```python +import qujax + +param_to_dt = qujax.get_params_to_statetensor_func(circuit_gates, + circuit_qubit_inds, + circuit_params_inds) +dt = param_to_dt(jnp.array([0.1])) +dt.shape +# (2, 2, 2, 2) +``` +Observe that the densitytensor has shape ```(2,) * 2 * N``` and the density matrix can be obtained +with ```.reshape(2 * N, 2 * N)```. + +Expectations can also be evaluated through the densitytensor + +```python +dt_to_expectation = qujax.get_densitytensor_to_expectation_func([['Z']], [[0]], [1.]) +dt_to_expectation(dt) +# DeviceArray(-0.3090171, dtype=float32) +``` +Again everything is differentiable, jit-able and can be composed with other JAX code. + + ## Notes + We use the convention where parameters are given in units of π (i.e. in [0,2] rather than [0, 2π]). -+ By default the parameter to statetensor function initiates in the all 0 state, however there is an optional ```statetensor_in``` argument to initiate in an arbitrary state. ++ By default, the simulators are initiated in the all 0 state, however the optional ```statetensor_in``` ++ or ```densitytensor_in``` argument can be used for arbitrary initialisations and combining circuits. ## pytket-qujax @@ -99,3 +127,14 @@ Pull requests are welcomed! New commits on [`develop`](https://github.com/CQCL/qujax/tree/develop) will then be merged into [`main`](https://github.com/CQCL/qujax/tree/main) on the next release. + + +## Cite +``` +@software{qujax2022, + author = {Samuel Duffield and Kirill Plekhanov and Gabriel Matos and Melf Johannsen}, + title = {qujax: Simulating quantum circuits with JAX}, + url = {https://github.com/CQCL/qujax}, + year = {2022}, +} +``` From 5c8cdfd9e8a4852d19e9929b6eee3a1dbdbcaea0 Mon Sep 17 00:00:00 2001 From: Sam Duffield Date: Tue, 15 Nov 2022 10:30:25 +0000 Subject: [PATCH 2/7] add notebook --- README.md | 4 +- examples/README.md | 1 + examples/classification.ipynb | 422 ++++++++++++++++++++++++++++++++++ 3 files changed, 424 insertions(+), 3 deletions(-) create mode 100644 examples/classification.ipynb diff --git a/README.md b/README.md index ab61f55..91fabe6 100644 --- a/README.md +++ b/README.md @@ -76,9 +76,7 @@ expectation_and_grad(jnp.array([0.1])) qujax also supports densitytensor simulations ```python -import qujax - -param_to_dt = qujax.get_params_to_statetensor_func(circuit_gates, +param_to_dt = qujax.get_params_to_densitytensor_func(circuit_gates, circuit_qubit_inds, circuit_params_inds) dt = param_to_dt(jnp.array([0.1])) diff --git a/examples/README.md b/examples/README.md index 4a5f6c1..4c818f4 100644 --- a/examples/README.md +++ b/examples/README.md @@ -2,6 +2,7 @@ In this directory, you can find a selection of notebooks demonstrating some simple use cases of `qujax` +- [`classification.ipynb`](https://github.com/CQCL/qujax/blob/main/examples/classification.ipynb) - train a quantum circuit for binary classification using data re-uploading. - [`generative_modelling.ipynb`](https://github.com/CQCL/qujax/blob/main/examples/generative_modelling.ipynb) - uses a parameterised quantum circuit as a generative model for a real life dataset. Trains via stochastic gradient Langevin dynamics on the maximum mean discrepancy between statetensor and dataset. - [`heisenberg_vqe.ipynb`](https://github.com/CQCL/qujax/blob/main/examples/heisenberg_vqe.ipynb) - an implementation of the variational quantum eigensolver to find the ground state of a quantum Hamiltonian. - [`maxcut_vqe.ipynb`](https://github.com/CQCL/qujax/blob/main/examples/maxcut_vqe.ipynb) - an implementation of the variational quantum eigensolver to solve a maxcut problem. Trains with Adam via [`optax`](https://github.com/deepmind/optax) and uses more realistic stochastic parameter shift gradients. diff --git a/examples/classification.ipynb b/examples/classification.ipynb new file mode 100644 index 0000000..a4e28f7 --- /dev/null +++ b/examples/classification.ipynb @@ -0,0 +1,422 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "from jax import numpy as jnp, random, vmap, value_and_grad, jit\n", + "import qujax\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Define the classification task
\n", + "We'll try and learn a _donut_ binary classification function (i.e. a bivariate coordinate is labelled 1 if it is inside the donut and 0 if it is outside)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "inner_rad = 0.25; outer_rad = 0.75\n", + "def classification_function(x, y):\n", + " r = jnp.sqrt(x**2 + y**2)\n", + " return jnp.where((r > inner_rad)*(r < outer_rad), 1, 0)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "linsp = jnp.linspace(-1, 1, 1000)\n", + "Z = vmap(lambda x: vmap(lambda y: classification_function(x, y))(linsp))(linsp)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.contourf(linsp, linsp, Z, cmap='Purples');" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now let's generate some data for our quantum circuit to learn from" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "n_data = 1000\n", + "x = random.uniform(random.PRNGKey(0), shape=(n_data, 2), minval=-1, maxval=1)\n", + "y = classification_function(x[:,0], x[:, 1])" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.scatter(x[:,0], x[:,1], alpha=jnp.where(y, 1, 0.2), s=10);" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Quantum circuit time
\n", + "We'll use a variant of data re-uploading [Pérez-Salinas et al](https://doi.org/10.22331/q-2020-02-06-226) to encode the input data, alongside some variational parameters within a quantum circuit classifier" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "n_qubits = 3\n", + "depth = 5" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "gate_seq_seq = []\n", + "qubit_inds_seq = []\n", + "param_inds_seq = []\n", + "\n", + "\n", + "pi = 0\n", + "for layer in range(depth):\n", + " for qi in range(n_qubits):\n", + " gate_seq_seq += ['Rz', 'Ry', 'Rz']\n", + " qubit_inds_seq += [[qi], [qi], [qi]]\n", + " param_inds_seq += [[pi], [pi+1], [pi+2]]\n", + " pi += 3\n", + "\n", + " if layer < (depth - 1):\n", + " for qi in range(layer, layer + n_qubits - 1, 2):\n", + " gate_seq_seq += ['CZ']\n", + " qubit_inds_seq += [[qi % n_qubits, (qi + 1) % n_qubits]]\n", + " param_inds_seq += [[]]" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "q0: ---Rz[0]---Ry[1]---Rz[2]-----◯-----Rz[9]---Ry[10]--Rz[11]--Rz[18]--Ry[19]--Rz[20]------------CZ----Rz[27]\n", + " | | \n", + "q1: ---Rz[3]---Ry[4]---Rz[5]-----CZ----Rz[12]--Ry[13]--Rz[14]----◯-----Rz[21]--Ry[22]--Rz[23]----|-----------\n", + " | | \n", + "q2: ---Rz[6]---Ry[7]---Rz[8]---Rz[15]--Ry[16]--Rz[17]------------CZ----Rz[24]--Ry[25]--Rz[26]----◯-----------\n" + ] + } + ], + "source": [ + "qujax.print_circuit(gate_seq_seq, qubit_inds_seq, param_inds_seq, gate_ind_max=30);" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can use `qujax` to generate our angles-to-statetensor function.\n", + "\n", + "We'll parameterise each angle as\n", + "$$\n", + " \\theta_k = b_k + w_k * x_k\n", + "$$\n", + "where $b_k, w_k$ are variational parameters to be learnt and $x_k = x_0$ if $k$ even, $x_k = x_1$ if $k$ odd for a single bivariate input point $(x_0, x_1)$." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "angles_to_st = qujax.get_params_to_statetensor_func(gate_seq_seq, qubit_inds_seq, param_inds_seq)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "n_angles = 3 * n_qubits * depth\n", + "n_params = 2 * n_angles" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "def param_and_x_to_angles(param, x_single):\n", + " biases = param[:n_angles]\n", + " weights = param[n_angles:]\n", + " \n", + " weights_times_data = jnp.where(jnp.arange(n_angles) % 2 == 0, weights * x_single[0], weights * x_single[1])\n", + " \n", + " angles = biases + weights_times_data\n", + " return angles" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "param_and_x_to_st = lambda param, x_single: angles_to_st(param_and_x_to_angles(param, x_single))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We'll measure the first qubit only (if its 1 we label _donut_, if its 0 we label _not donut_)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "def param_and_x_to_probability(param, x_single):\n", + " st = param_and_x_to_st(param, x_single)\n", + " all_probs = jnp.square(jnp.abs(st))\n", + " first_qubit_probs = jnp.sum(all_probs, axis=range(1, n_qubits))\n", + " return first_qubit_probs[1]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The ideal loss function is the log-likelihood\n", + "
$$ \\log p(y \\mid q_{(b, w)}(x)) = {\\mathbb{I}[y = 0]}\\log(1 - q_{(b, w)}(x)) + {\\mathbb{I}[y = 1]} \\log(q_{(b, w)}(x))$$
\n", + "where $q_{(b, w)}(x)$ is the probability the quantum circuit classifies input $x$ as donut given variational parameter vectors $(b, w)$. However this cannot be approximated unbiasedly with shots (in qujax simulations we can use the statetensor to calculate this exactly, but it is still good to keep in mind loss functions that can also be used with shots from a quantum device)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Instead we can minimise the expected Hamming distance between shots and data\n", + "
\n", + "$$\n", + "C(b, w, x, y) = \\mathbb{E}_{y' \\sim p(\\cdot \\mid q_{(b, w)}(x))}[\\ell(y', y)] = q_{(b, w)} \\ell(0, y) + (1 - q_{(b, w)})\\ell(1, y),\n", + "$$\n", + "
\n", + "where $y'$ are shots, $y$ are the data labels and $\\ell$ is the Hamming distance. The full batch cost function is $C(b, w) = \\frac1N \\sum_{i=1}^N C(b, w, x_i, y_i)$.\n", + "\n", + "Note that to calculate the cost function we need to evaluate the statetensor for every input point $x_i$. If the dataset becomes too large, we can easily minibatch." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "def param_to_cost(param):\n", + " donut_probs = vmap(param_and_x_to_probability, in_axes=(None, 0))(param, x)\n", + " costs = jnp.where(y, 1-donut_probs, donut_probs)\n", + " return costs.mean()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Ready to descend some gradients?\n", + "\n", + "We'll just use vanilla gradient descent here" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "param_to_cost_and_grad = jit(value_and_grad(param_to_cost))" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "999 Cost: 0.25121891\r" + ] + } + ], + "source": [ + "n_iter = 1000\n", + "stepsize = 1e-1\n", + "param = random.uniform(random.PRNGKey(1), shape=(n_params,), minval=0, maxval=2)\n", + "costs = jnp.zeros(n_iter)\n", + "for i in range(n_iter):\n", + " cost, grad = param_to_cost_and_grad(param)\n", + " costs = costs.at[i].set(cost)\n", + " param = param - stepsize * grad\n", + " print(i, 'Cost: ', cost, end='\\r')" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(costs)\n", + "plt.xlabel('Iteration')\n", + "plt.ylabel('Cost');" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Visualise trained classifier" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "linsp = jnp.linspace(-1, 1, 100)\n", + "Z = vmap(lambda a: vmap(lambda b: param_and_x_to_probability(param, jnp.array([a, b])))(linsp))(linsp)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.contourf(linsp, linsp, Z, cmap='Purples', alpha=0.8)\n", + "circle_linsp = jnp.linspace(0, 2 * jnp.pi, 100)\n", + "plt.plot(inner_rad * jnp.cos(circle_linsp), inner_rad * jnp.sin(circle_linsp), c='red')\n", + "plt.plot(outer_rad * jnp.cos(circle_linsp), outer_rad * jnp.sin(circle_linsp), c='red');" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Looks good, it has clearly grasped the donut shape. Sincerest apologies if you are now hungry! 🍩" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.10" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 080138ad52c4a0b21ed6ce47a8ad119cd5dc95ed Mon Sep 17 00:00:00 2001 From: Sam Duffield Date: Tue, 15 Nov 2022 10:38:15 +0000 Subject: [PATCH 3/7] clean readme --- README.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 91fabe6..1107758 100644 --- a/README.md +++ b/README.md @@ -2,13 +2,15 @@ Represent a (parameterised) quantum circuit as a pure [JAX](https://github.com/google/jax) function that takes as input any parameters of the circuit and outputs either a _statetensor_ or a _densitytensor_ depending on -the choice of simulator. The statetensor encodes all $2^N$ amplitudes of the quantum state in a tensor version -of the statevector, for $N$ qubits. The densitytensor represents a tensor version of the +the choice of simulator. +- The statetensor encodes all $2^N$ amplitudes of the quantum state in a tensor version +of the statevector, for $N$ qubits. +- The densitytensor represents a tensor version of the $2^N \times 2^N$ density matrix (allowing for mixed states and generic Kraus operators). -Either representation can then be used downstream for exact expectations, gradients or sampling. -A JAX implementation of a quantum circuit is useful for runtime speedups, automatic differentiation and support -for GPUs/TPUs. +Either representation can then be used downstream for exact expectations, gradients or sampling. A JAX implementation +of a quantum circuit is useful for runtime speedups, automatic differentiation, support for GPUs/TPUs and compatibility +with other JAX code and packages. Some useful links: - [Documentation](https://cqcl.github.io/qujax/api/) @@ -73,8 +75,6 @@ expectation_and_grad(jnp.array([0.1])) ``` ## Densitytensor simulations with qujax -qujax also supports densitytensor simulations - ```python param_to_dt = qujax.get_params_to_densitytensor_func(circuit_gates, circuit_qubit_inds, @@ -83,7 +83,7 @@ dt = param_to_dt(jnp.array([0.1])) dt.shape # (2, 2, 2, 2) ``` -Observe that the densitytensor has shape ```(2,) * 2 * N``` and the density matrix can be obtained +The densitytensor has shape ```(2,) * 2 * N``` and the density matrix can be obtained with ```.reshape(2 * N, 2 * N)```. Expectations can also be evaluated through the densitytensor @@ -100,13 +100,13 @@ Again everything is differentiable, jit-able and can be composed with other JAX ## Notes + We use the convention where parameters are given in units of π (i.e. in [0,2] rather than [0, 2π]). + By default, the simulators are initiated in the all 0 state, however the optional ```statetensor_in``` -+ or ```densitytensor_in``` argument can be used for arbitrary initialisations and combining circuits. +or ```densitytensor_in``` argument can be used for arbitrary initialisations and combining circuits. ## pytket-qujax -You can also generate the parameter to statetensor function from a [`pytket`](https://cqcl.github.io/tket/pytket/api/) -circuit using the [`pytket-qujax`](https://github.com/CQCL/pytket-qujax) extension. -In particular, the +You can also generate the parameter to statetensor/densitytensor functions from +a [`pytket`](https://cqcl.github.io/tket/pytket/api/) circuit using the +[`pytket-qujax`](https://github.com/CQCL/pytket-qujax) extension. In particular, the [`tk_to_qujax`](https://cqcl.github.io/pytket-qujax/api/api.html#pytket.extensions.qujax.qujax_convert.tk_to_qujax) and [`tk_to_qujax_symbolic`](https://cqcl.github.io/pytket-qujax/api/api.html#pytket.extensions.qujax.qujax_convert.tk_to_qujax_symbolic) functions. From 2f0bbeb9be18cf95b72d6b44ccf4c1f69f5dcae0 Mon Sep 17 00:00:00 2001 From: Sam Duffield Date: Tue, 15 Nov 2022 10:39:07 +0000 Subject: [PATCH 4/7] clean readme --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1107758..22cbbd3 100644 --- a/README.md +++ b/README.md @@ -77,8 +77,8 @@ expectation_and_grad(jnp.array([0.1])) ## Densitytensor simulations with qujax ```python param_to_dt = qujax.get_params_to_densitytensor_func(circuit_gates, - circuit_qubit_inds, - circuit_params_inds) + circuit_qubit_inds, + circuit_params_inds) dt = param_to_dt(jnp.array([0.1])) dt.shape # (2, 2, 2, 2) From 445a007ff15384ef1850dcee819ef52bef9b7f97 Mon Sep 17 00:00:00 2001 From: Sam Duffield Date: Tue, 15 Nov 2022 11:21:37 +0000 Subject: [PATCH 5/7] notebook bug --- examples/classification.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/classification.ipynb b/examples/classification.ipynb index a4e28f7..b0ef487 100644 --- a/examples/classification.ipynb +++ b/examples/classification.ipynb @@ -261,7 +261,7 @@ "Instead we can minimise the expected Hamming distance between shots and data\n", "
\n", "$$\n", - "C(b, w, x, y) = \\mathbb{E}_{y' \\sim p(\\cdot \\mid q_{(b, w)}(x))}[\\ell(y', y)] = q_{(b, w)} \\ell(0, y) + (1 - q_{(b, w)})\\ell(1, y),\n", + "C(b, w, x, y) = \\mathbb{E}_{y' \\sim p(\\cdot \\mid q_{(b, w)}(x))}[\\ell(y', y)] = (1 - q_{(b, w)}(x)) \\ell(0, y) + q_{(b, w)}(x)\\ell(1, y),\n", "$$\n", "
\n", "where $y'$ are shots, $y$ are the data labels and $\\ell$ is the Hamming distance. The full batch cost function is $C(b, w) = \\frac1N \\sum_{i=1}^N C(b, w, x_i, y_i)$.\n", From 0853a879ae723ec83c9cf1905de211f2f6d00bf1 Mon Sep 17 00:00:00 2001 From: Sam Duffield Date: Tue, 15 Nov 2022 14:43:58 +0000 Subject: [PATCH 6/7] notebook text --- examples/classification.ipynb | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/examples/classification.ipynb b/examples/classification.ipynb index b0ef487..ff8b0bc 100644 --- a/examples/classification.ipynb +++ b/examples/classification.ipynb @@ -249,9 +249,17 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The ideal loss function is the log-likelihood\n", - "
$$ \\log p(y \\mid q_{(b, w)}(x)) = {\\mathbb{I}[y = 0]}\\log(1 - q_{(b, w)}(x)) + {\\mathbb{I}[y = 1]} \\log(q_{(b, w)}(x))$$
\n", - "where $q_{(b, w)}(x)$ is the probability the quantum circuit classifies input $x$ as donut given variational parameter vectors $(b, w)$. However this cannot be approximated unbiasedly with shots (in qujax simulations we can use the statetensor to calculate this exactly, but it is still good to keep in mind loss functions that can also be used with shots from a quantum device)." + "For binary classification, the likelihood for our full data set $(x_{1:N}, y_{1:N})$ is\n", + "$$\n", + "p(y_{1:N} \\mid b, w, x_{1:N}) = \\prod_{i=1}^N p(y_i \\mid b, w, x_i) = \\prod_{i=1}^N (1 - q_{(b,w)}(x_i))^{\\mathbb{I}[y_i = 0]}q_{(b,w)}(x_i)^{\\mathbb{I}[y_i = 1]},\n", + "$$\n", + "where $q_{(b, w)}(x)$ is the probability the quantum circuit classifies input $x$ as donut given variational parameter vectors $(b, w)$. This gives log-likelihood\n", + "$$\n", + "\\log p(y_{1:N} \\mid b, w, x_{1:N}) = \\sum_{i=1}^N \\mathbb{I}[y_i = 0] \\log(1 - q_{(b,w)}(x_i)) + \\mathbb{I}[y_i = 1] \\log q_{(b,w)}(x_i),\n", + "$$\n", + "which we would like to maximise.\n", + "\n", + "Unfortunately the log-likelihood **cannot** be approximated unbiasedly using shots (in qujax simulations we can use the statetensor to calculate this exactly, but it is still good to keep in mind loss functions that can also be used with shots from a quantum device)." ] }, { @@ -261,7 +269,7 @@ "Instead we can minimise the expected Hamming distance between shots and data\n", "
\n", "$$\n", - "C(b, w, x, y) = \\mathbb{E}_{y' \\sim p(\\cdot \\mid q_{(b, w)}(x))}[\\ell(y', y)] = (1 - q_{(b, w)}(x)) \\ell(0, y) + q_{(b, w)}(x)\\ell(1, y),\n", + "C(b, w, x, y) = \\mathbb{E}_{p(y' \\mid q_{(b, w)}(x))}[\\ell(y', y)] = (1 - q_{(b, w)}(x)) \\ell(0, y) + q_{(b, w)}(x)\\ell(1, y),\n", "$$\n", "
\n", "where $y'$ are shots, $y$ are the data labels and $\\ell$ is the Hamming distance. The full batch cost function is $C(b, w) = \\frac1N \\sum_{i=1}^N C(b, w, x_i, y_i)$.\n", From e0ca1d1da033ae66e9741de8ccf2cfbdcbb85d1a Mon Sep 17 00:00:00 2001 From: Sam Duffield Date: Tue, 15 Nov 2022 15:28:58 +0000 Subject: [PATCH 7/7] notebook text --- examples/classification.ipynb | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/examples/classification.ipynb b/examples/classification.ipynb index ff8b0bc..181a120 100644 --- a/examples/classification.ipynb +++ b/examples/classification.ipynb @@ -259,20 +259,21 @@ "$$\n", "which we would like to maximise.\n", "\n", - "Unfortunately the log-likelihood **cannot** be approximated unbiasedly using shots (in qujax simulations we can use the statetensor to calculate this exactly, but it is still good to keep in mind loss functions that can also be used with shots from a quantum device)." + "Unfortunately, the log-likelihood **cannot** be approximated unbiasedly using shots, that is we can approximate $q_{(b,w)}(x_i)$ unbiasedly but not $\\log(q_{(b,w)}(x_i))$.\n", + "Note that in qujax simulations we can use the statetensor to calculate this exactly, but it is still good to keep in mind loss functions that can also be used with shots from a quantum device." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Instead we can minimise the expected Hamming distance between shots and data\n", + "Instead we can minimise an expected distance between shots and data\n", "
\n", "$$\n", "C(b, w, x, y) = \\mathbb{E}_{p(y' \\mid q_{(b, w)}(x))}[\\ell(y', y)] = (1 - q_{(b, w)}(x)) \\ell(0, y) + q_{(b, w)}(x)\\ell(1, y),\n", "$$\n", "
\n", - "where $y'$ are shots, $y$ are the data labels and $\\ell$ is the Hamming distance. The full batch cost function is $C(b, w) = \\frac1N \\sum_{i=1}^N C(b, w, x_i, y_i)$.\n", + "where $y'$ is a shot, $y$ is a data label and $\\ell$ is some distance between bitstrings - here we simply set $\\ell(0, 0) = \\ell(1, 1) = 0$ and $\\ell(0, 1) = \\ell(1, 0) = 1$ (which coincides with the Hamming distance for this binary example). The full batch cost function is $C(b, w) = \\frac1N \\sum_{i=1}^N C(b, w, x_i, y_i)$.\n", "\n", "Note that to calculate the cost function we need to evaluate the statetensor for every input point $x_i$. If the dataset becomes too large, we can easily minibatch." ]