{ "cells": [ { "cell_type": "code", "execution_count": 27, "metadata": { "collapsed": true, "jupyter": { "outputs_hidden": true } }, "outputs": [], "source": [ "%matplotlib inline\n", "import numpy as np;\n", "from matplotlib import pyplot as plt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$\\LaTeX \\text{ commands here}\n", "\\newcommand{\\R}{\\mathbb{R}}\n", "\\newcommand{\\im}{\\text{im}\\,}\n", "\\newcommand{\\norm}[1]{||#1||}\n", "\\newcommand{\\inner}[1]{\\langle #1 \\rangle}\n", "\\newcommand{\\span}{\\mathrm{span}}\n", "\\newcommand{\\proj}{\\mathrm{proj}}\n", "$" ] }, { "cell_type": "markdown", "metadata": { "nbpresent": { "id": "0d550dc6-b222-4f90-8a5a-8fc373b860e9" }, "slideshow": { "slide_type": "slide" } }, "source": [ "
\n", "\n", "**Georgia Tech, CS 4540**\n", "\n", "# L4: Convexity & Vector Calculus\n", "\n", "Jacob Abernethy\n", "\n", "*Thursday, August 29, 2019*" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Separating Hyperplanes\n", "\n", "The set of separating hyperplanes. Suppose that $C$ and $D$ are disjoint subsets of $\\R^n$.\n", "Consider the set of $(a, b) \\in \\R^{n+1}$ for which\n", "$$a^\\top x \\leq b \\text{ for all } x \\in C$$\n", "and\n", "$$a^\\top x \\geq b \\text{ for all } x \\in D.$$\n", "**Show** that this set is a convex cone (which is the singleton $\\{0\\}$ if there is no hyperplane that separates $C$ and $D$)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Separating hyperplane theorem\n", "If convex sets $C$ and $D$ are disjoint, then there is vector $w$ and scalar $b$ such that $\\forall x\\in C, w^\\top x \\leq b$ and $\\forall z \\in D, \\; w^\\top z \\geq b$.\n", "### Supporting hyperplane theorem\n", "Given a non-empty convex set $C$, and some $x_0 \\in \\text{bndry}(C)$, then there is vector $w$ and scalar $b$ such that $w^\\top x_0 = b$ and $\\forall x \\in C, \\; w^\\top x \\leq b$\n", "\n", "**Prove**: the first theorem implies the second (*Hint*: think about the interior of $C$)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "**Caratheodory's Theorem**: Let $X \\subset \\R^d$. Then each point in $\\text{conv}(X)$ is a convex combination of at most $d + 1$ points of $X$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Proof (start)**: Suppose there is some $y \\in \\text{conv}(X)$ that cannot be written as a convex combination of fewer than $m \\geq d+2$ points in $X$. Then\n", "$$ y = \\sum_{i=1}^m \\lambda_i x_i \\text{ with } \\sum_{i=1}^m \\lambda_i = 1 \\text{ and } \\lambda_i > 0 \\forall i.$$\n", "Notice that $m \\geq d+2$ points $x_1, \\ldots, x_m$ *must* be affinely dependent (since no more than $d+1$ points in $\\R^d$ can be affinely independent). That means that there are coefficients $\\mu_1, \\ldots, \\mu_m$ so that\n", "$$\\sum_{i=1}^m \\mu_i x_i = 0 \\text{ where } \\sum_{i=1}^m \\mu_i = 0, \\text{ and } \\exists \\mu_i > 0.$$\n", "Let's combine these two statements, and observe that for any $\\alpha \\in \\R$ we have\n", "$$y = y + \\alpha \\cdot 0 = \\sum_{i=1}^m \\lambda_i x_i + \\alpha \\sum_{i=1}^m \\mu_i x_i = \\sum_{i=1}^m (\\lambda_i + \\alpha \\mu_i) x_i$$\n", "\n", "$\\ldots$\n", "\n", "$\\ldots$ which is a contradiction!" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "#### Answer:\n", "\n", "We know that there is one $\\mu_j$ so that $\\mu_j > 0$. Set $\\alpha = - \\min_{i : \\mu_i > 0} \\frac{\\lambda_j}{\\mu_j}$, and let $i^*$ be the minimizing $i$ in the previous expression. Also let $\\lambda_i' := \\lambda_i + \\alpha \\mu_i$. Our particular choice of $\\alpha$ ensures two things:\n", "1. $\\lambda_{i^*}' = 0$, because $\\lambda_{i^*}' = \\lambda_{i^*} + (-\\frac{\\lambda_{i^*}}{\\mu_{i^*}}) \\mu_{i^*}$\n", "2. For any $j$, $\\lambda_j' \\geq 0$. That's because either\n", " + $\\mu_j = 0$, in which case $\\lambda_j' = \\lambda_j$\n", " + OR $\\lambda_j' = \\lambda_j + (-\\frac{\\lambda_{i^*}}{\\mu_{i^*}})\\mu_j \\geq \\lambda_j + (-\\frac{\\lambda_{j}}{\\mu_{j}})\\mu_j = 0$\n", "\n", "What we have just done is show that we can write $y$ in terms of another convex combination, i.e. $y = \\sum_{i=1}^m \\lambda_i' x_i$. But notice that, for this convex combination, one of the $\\lambda_i'$ is 0! That means we were able to write $y$ as a convex combination of fewer than $m$ points, a contradiction." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Derivatives, and multivariable functions\n", "\n", "For a differentiable function $f : \\R \\to \\R$, the derivative is defined as\n", "$$f'(x) = \\lim_{\\delta \\to 0} \\frac{ f(x + \\delta) - f(x)}{\\delta}.$$\n", "\n", "For a function $f : \\R^n \\to \\R$, the partial derivative w.r.t. $x_i$ is\n", "$$\\frac{\\partial f(x)}{\\partial x_i} = \\lim_{\\delta \\to 0} \\frac{ f(x + \\delta e_i ) - f(x)}{\\delta}$$\n", "where $e_i$ is the $i$th basis vector.\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Perspectives on the gradient\n", "\n", "\n", "The *gradient* of $f$ can be viewed as the vector of partial derivatives\n", "$$ \\nabla_x f = \\nabla f(x) = \\left[\\frac{\\partial f(x)}{\\partial x_1}, \\ldots, \\frac{\\partial f(x)}{\\partial x_n}\\right]$$\n", "\n", "But another way to view the gradient is that it is a *linear transformation* which has the same domain and co-domain of $f$. That is, $\\nabla_x f$ is a linear map $\\R^n \\to \\R$, where\n", "$$ \\nabla_x f [u] = \\left[\\frac{\\partial f(x)}{\\partial x_1}, \\ldots, \\frac{\\partial f(x)}{\\partial x_n}\\right] \\cdot u.$$\n", "\n", "But this is indeed the same as the *directional derivative* of $f$ in the direction of $u$. That is,\n", "$$ \\nabla_x f[u] = \\lim_{\\delta \\to 0} \\frac{ f(x + \\delta u ) - f(x)}{\\delta}$$" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## The Jacobian\n", "\n", "If $f$ is a function mapping $\\R^n \\to \\R^m$, then we often call the gradient the *Jacobian*, which is the matrix of partial derivatives:\n", "$$D_f := \\begin{pmatrix} \n", " \\frac{\\partial f_1}{\\partial x_1} & \\cdots & \\frac{\\partial f_1}{\\partial x_n}\\\\ \n", " \\vdots & & \\vdots \\\\\n", " \\frac{\\partial f_m}{\\partial x_1} & \\cdots & \\frac{\\partial f_m}{\\partial x_n}\n", "\\end{pmatrix}\n", "$$\n", "The *hessian* of a function $f : \\R^n \\to \\R$ is defined as the matrix of partial derivatives:\n", "$$ \\nabla^2 f = D^2_f := \\begin{pmatrix} \n", " \\frac{\\partial^2 f}{\\partial x_1 \\partial x_1} & \\cdots & \\frac{\\partial^2 f}{\\partial x_1 \\partial x_n}\\\\ \n", " \\vdots & & \\vdots \\\\\n", " \\frac{\\partial^2 f}{\\partial x_m \\partial x_1} & \\cdots & \\frac{\\partial^2 f}{\\partial x_n \\partial x_n}\n", "\\end{pmatrix}\n", "$$" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Gradient and Hessian problems\n", "\n", "Define a function $f(x) = \\log \\sum_{i=1}^n \\exp(x_i)$.\n", "\n", "#### Problem\n", "\n", "1. What is $\\nabla_x f$?\n", "1. What is $\\nabla_x f[\\mathbf{1}]$ where $\\mathbf{1}$ is the vector of all 1s.\n", "1. What is $\\nabla^2 f(x)$?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$f(x) = \\log \\sum_{i=1}^n \\exp(x_i)$.\n", "\n", "#### Answer\n", "\n", "1. $\\nabla_x f = \\frac{1}{\\sum_{i=1}^n \\exp(x_i)} \\cdot [\\exp(x_1) \\exp(x_2) \\dots \\exp(x_n)]$\n", "2. $\\nabla_x f[\\mathbf{1}] = \\sum_{i = 1}^n \\frac{\\exp(x_i)}{\\sum_{i=1}^n \\exp(x_i)} = 1$\n", "3. $\\nabla^2 f(x) = - \\frac{1}{(\\sum_{i=1}^n \\exp(x_i))^2} A$ where for matrix $A$, $a_{i,i} = \\exp(x_i)$, and $a_{i,j} = 0$ if $i \\neq j$." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Multivariate Chain Rule\n", "\n", "For a good description, see [these notes](https://math.berkeley.edu/~nikhil/courses/121a/chain.pdf).\n", "\n", "Imagine we have $f : \\R^n \\to \\R^m$ and $g : \\R^m \\to \\R^k$. Then we want to compute the gradient (Jacobian) of the function $f \\circ g$. Is there any easy way to do this? The answer is YES, according to the **multivariate chain rule**:\n", "$$ D_{f \\circ g}[x] = D_f[g(x)] \\cdot D_g[x]$$\n", "This is a powerful statement, although it may not be clear why. It says we can obtain the gradient of the composed functions, by simply composing the gradients, treated as *linear transformations*." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Problem \n", "Let $f(x) = \\sum_{i=1}^m -\\log (A_i \\cdot x - b_i)$ where $A$ is an $m\\times n$ matrix. Notice that we can write $f(x) = h(g(x)) = h \\circ g (x)$ where $h(y) = -\\sum \\log y_i$ and $g(x) = A x - b$\n", "\n", "Use the multivariate chain rule to compute $\\nabla_x f$." ] } ], "metadata": { "celltoolbar": "Slideshow", "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.16" }, "nbpresent": { "slides": { "00402695-e04c-4eef-89e0-d40218a4b0e7": { "id": "00402695-e04c-4eef-89e0-d40218a4b0e7", "prev": null, "regions": { "4448a694-c5c3-40bb-ab2b-ed9b29a5b571": { "attrs": { "height": 0.8, "width": 0.8, "x": 0.1, "y": 0.1 }, "id": "4448a694-c5c3-40bb-ab2b-ed9b29a5b571" } } }, "0265b550-c6b6-425a-9c52-f618822afef0": { "id": "0265b550-c6b6-425a-9c52-f618822afef0", "prev": "49ba58b9-fb36-4447-9811-c3ada1b777b6", "regions": { "b702ead7-d493-4d02-8d0f-23b216601150": { "attrs": { "height": 0.8, "width": 0.8, "x": 0.1, "y": 0.1 }, "content": { "cell": "a69ec655-4bfe-4a3f-9d26-9965eceb71df", "part": "whole" }, "id": "b702ead7-d493-4d02-8d0f-23b216601150" } } }, "1b9e5fe3-4efd-46d2-9af0-7648e295e4a2": { "id": "1b9e5fe3-4efd-46d2-9af0-7648e295e4a2", "prev": "885499a5-0dfb-4789-9555-6a95c5a3376e", "regions": { "556348bf-3f97-4a5d-952c-5ab545ee4992": { "attrs": { "height": 0.8, "width": 0.8, "x": 0.1, "y": 0.1 }, "content": { "cell": "ece64073-7cf1-4495-bfe4-337f1fa42390", "part": "whole" }, "id": "556348bf-3f97-4a5d-952c-5ab545ee4992" } } }, "2039394f-772d-4c00-b81e-83f05bc1dcd1": { "id": "2039394f-772d-4c00-b81e-83f05bc1dcd1", "prev": "94eabf87-a6d9-4ac8-a24e-dad8e0e4d8d8", "regions": { "63b012e8-1ac7-4c4e-b281-a80d944c12ae": { "attrs": { "height": 0.8, "width": 0.8, "x": 0.1, "y": 0.1 }, "content": { "cell": "29b540e4-7d19-4df6-b685-72c772a842d0", "part": "whole" }, "id": "63b012e8-1ac7-4c4e-b281-a80d944c12ae" } } }, "2db8174a-eab5-4a44-aa68-a816d759bda9": { "id": "2db8174a-eab5-4a44-aa68-a816d759bda9", "prev": "1b9e5fe3-4efd-46d2-9af0-7648e295e4a2", "regions": { "7539e7ab-53f5-417b-af25-a99f24b36e72": { "attrs": { "height": 0.8, "width": 0.8, "x": 0.1, "y": 0.1 }, "content": { "cell": "526a6929-1493-4efb-9580-8d532f1b1733", "part": "whole" }, "id": "7539e7ab-53f5-417b-af25-a99f24b36e72" } } }, "4329cc6d-7f9f-4b70-a761-2cb9d911ca0f": { "id": "4329cc6d-7f9f-4b70-a761-2cb9d911ca0f", "prev": "9b2467ee-a4a5-42ab-9028-de6057970611", "regions": { "4dc09d43-f722-4d98-99a1-5752221a2d67": { "attrs": { "height": 0.8, "width": 0.8, "x": 0.1, "y": 0.1 }, "content": { "cell": "ac1f6d59-30ec-4e45-ba35-254bfe82de2a", "part": "whole" }, "id": "4dc09d43-f722-4d98-99a1-5752221a2d67" } } }, "49ba58b9-fb36-4447-9811-c3ada1b777b6": { "id": "49ba58b9-fb36-4447-9811-c3ada1b777b6", "prev": "00402695-e04c-4eef-89e0-d40218a4b0e7", "regions": { "9fd470e1-9457-4fad-a69a-135027c528ae": { "attrs": { "height": 0.8, "width": 0.8, "x": 0.1, "y": 0.1 }, "content": { "cell": "0d550dc6-b222-4f90-8a5a-8fc373b860e9", "part": "whole" }, "id": "9fd470e1-9457-4fad-a69a-135027c528ae" } } }, "4f2e1449-4308-4724-b6b5-f1ce1967f8bb": { "id": "4f2e1449-4308-4724-b6b5-f1ce1967f8bb", "prev": "f0551436-2b74-43fd-b272-c48323a83773", "regions": { "a6956997-1dbe-417c-b982-aa9974af36a2": { "attrs": { "height": 0.8, "width": 0.8, "x": 0.1, "y": 0.1 }, "content": { "cell": "4da46af5-389b-422f-8723-2240bcb5e5cc", "part": "whole" }, "id": "a6956997-1dbe-417c-b982-aa9974af36a2" } } }, "6a9b86a5-72d4-4ea9-8160-3d55bae4c738": { "id": "6a9b86a5-72d4-4ea9-8160-3d55bae4c738", "prev": "4f2e1449-4308-4724-b6b5-f1ce1967f8bb", "regions": { "7a3484dc-5988-456c-b189-15cb1f18af1f": { "attrs": { "height": 0.8, "width": 0.8, "x": 0.1, "y": 0.1 }, "content": { "cell": "951424a9-7339-4487-bff2-66c64595ea34", "part": "whole" }, "id": "7a3484dc-5988-456c-b189-15cb1f18af1f" } } }, "788ca0e1-453f-4688-b082-ffde7b78e68c": { "id": "788ca0e1-453f-4688-b082-ffde7b78e68c", "prev": "2db8174a-eab5-4a44-aa68-a816d759bda9", "regions": { "fe4f47cd-4e72-4e30-970a-19547b803205": { "attrs": { "height": 0.8, "width": 0.8, "x": 0.1, "y": 0.1 }, "content": { "cell": "d70290b6-b579-4460-9035-1657b31857a4", "part": "whole" }, "id": "fe4f47cd-4e72-4e30-970a-19547b803205" } } }, "7a911c00-893a-4bdd-b842-fce896a21aae": { "id": "7a911c00-893a-4bdd-b842-fce896a21aae", "prev": "2039394f-772d-4c00-b81e-83f05bc1dcd1", "regions": { "2de9a398-fea4-4723-a8b6-55c33ce96eb1": { "attrs": { "height": 0.8, "width": 0.8, "x": 0.1, "y": 0.1 }, "content": { "cell": "b0a25cbc-b5fe-4080-bd6f-951ddfd7381f", "part": "whole" }, "id": "2de9a398-fea4-4723-a8b6-55c33ce96eb1" } } }, "829ba554-db30-4ece-af12-5488f4729294": { "id": "829ba554-db30-4ece-af12-5488f4729294", "prev": "7a911c00-893a-4bdd-b842-fce896a21aae", "regions": { "443f7e08-6b5f-4714-aed2-b8e910728910": { "attrs": { "height": 0.8, "width": 0.8, "x": 0.1, "y": 0.1 }, "content": { "cell": "56362fbe-c101-494a-bd32-3e1649e15643", "part": "whole" }, "id": "443f7e08-6b5f-4714-aed2-b8e910728910" } } }, "885499a5-0dfb-4789-9555-6a95c5a3376e": { "id": "885499a5-0dfb-4789-9555-6a95c5a3376e", "prev": "f3732cc4-6051-4998-a02c-0e5541a15f23", "regions": { "8b4717b8-bdd2-465b-96ad-407eacdbe34b": { "attrs": { "height": 0.8, "width": 0.8, "x": 0.1, "y": 0.1 }, "content": { "cell": "6f147f30-1ba3-4e9f-9653-e13a4257df6c", "part": "whole" }, "id": "8b4717b8-bdd2-465b-96ad-407eacdbe34b" } } }, "94eabf87-a6d9-4ac8-a24e-dad8e0e4d8d8": { "id": "94eabf87-a6d9-4ac8-a24e-dad8e0e4d8d8", "prev": "4329cc6d-7f9f-4b70-a761-2cb9d911ca0f", "regions": { "82549bbb-345d-423f-8229-7b5cd0628b14": { "attrs": { "height": 0.8, "width": 0.8, "x": 0.1, "y": 0.1 }, "content": { "cell": "8018269b-60c2-4a26-abe2-77c73cace5f6", "part": "whole" }, "id": "82549bbb-345d-423f-8229-7b5cd0628b14" } } }, "9b2467ee-a4a5-42ab-9028-de6057970611": { "id": "9b2467ee-a4a5-42ab-9028-de6057970611", "prev": "788ca0e1-453f-4688-b082-ffde7b78e68c", "regions": { "33ad7a50-cf56-40b7-b53b-552605f88fa5": { "attrs": { "height": 0.8, "width": 0.8, "x": 0.1, "y": 0.1 }, "content": { "cell": "6c33627a-8a43-4349-bf5e-9097b0e286f7", "part": "whole" }, "id": "33ad7a50-cf56-40b7-b53b-552605f88fa5" } } }, "ba0bf0ed-6cee-4c8c-bc7e-222a0f8e820d": { "id": "ba0bf0ed-6cee-4c8c-bc7e-222a0f8e820d", "prev": "829ba554-db30-4ece-af12-5488f4729294", "regions": { "7eb01692-dcb5-4ded-bd25-7e0d90f3fffc": { "attrs": { "height": 0.8, "width": 0.8, "x": 0.1, "y": 0.1 }, "content": { "cell": "6c53c225-83fe-4d41-8dca-0d1c9368584c", "part": "whole" }, "id": "7eb01692-dcb5-4ded-bd25-7e0d90f3fffc" } } }, "df3d62d2-e2b9-4ff7-978b-08c51a4f9ee8": { "id": "df3d62d2-e2b9-4ff7-978b-08c51a4f9ee8", "prev": "ba0bf0ed-6cee-4c8c-bc7e-222a0f8e820d", "regions": { "75cf714e-431e-4287-914d-b79312bcbfce": { "attrs": { "height": 0.8, "width": 0.8, "x": 0.1, "y": 0.1 }, "content": { "cell": "561a5ffb-7003-4ec0-a6bc-c3fd39204a40", "part": "whole" }, "id": "75cf714e-431e-4287-914d-b79312bcbfce" } } }, "f0551436-2b74-43fd-b272-c48323a83773": { "id": "f0551436-2b74-43fd-b272-c48323a83773", "prev": "0265b550-c6b6-425a-9c52-f618822afef0", "regions": { "9d1114ff-54fc-40c5-a3f1-4d094ab427d6": { "attrs": { "height": 0.8, "width": 0.8, "x": 0.1, "y": 0.1 }, "content": { "cell": "f14dd754-9e43-4014-8a09-be62ba0c3aed", "part": "whole" }, "id": "9d1114ff-54fc-40c5-a3f1-4d094ab427d6" } } }, "f3732cc4-6051-4998-a02c-0e5541a15f23": { "id": "f3732cc4-6051-4998-a02c-0e5541a15f23", "prev": "6a9b86a5-72d4-4ea9-8160-3d55bae4c738", "regions": { "dce19474-7bba-475a-a368-63f262661282": { "attrs": { "height": 0.8, "width": 0.8, "x": 0.1, "y": 0.1 }, "content": { "cell": "2b797236-c6a7-4860-b27b-ca4d8f381607", "part": "whole" }, "id": "dce19474-7bba-475a-a368-63f262661282" } } } }, "themes": { "default": "474559d9-b375-479a-ac75-71c3289ec9ff", "theme": { "474559d9-b375-479a-ac75-71c3289ec9ff": { "id": "474559d9-b375-479a-ac75-71c3289ec9ff", "palette": { "19cc588f-0593-49c9-9f4b-e4d7cc113b1c": { "id": "19cc588f-0593-49c9-9f4b-e4d7cc113b1c", "rgb": [ 252, 252, 252 ] }, "31af15d2-7e15-44c5-ab5e-e04b16a89eff": { "id": "31af15d2-7e15-44c5-ab5e-e04b16a89eff", "rgb": [ 68, 68, 68 ] }, "50f92c45-a630-455b-aec3-788680ec7410": { "id": "50f92c45-a630-455b-aec3-788680ec7410", "rgb": [ 155, 177, 192 ] }, "c5cc3653-2ee1-402a-aba2-7caae1da4f6c": { "id": "c5cc3653-2ee1-402a-aba2-7caae1da4f6c", "rgb": [ 43, 126, 184 ] }, "efa7f048-9acb-414c-8b04-a26811511a21": { "id": "efa7f048-9acb-414c-8b04-a26811511a21", "rgb": [ 25.118061674008803, 73.60176211453744, 107.4819383259912 ] } }, "rules": { "blockquote": { "color": "50f92c45-a630-455b-aec3-788680ec7410" }, "code": { "font-family": "Anonymous Pro" }, "h1": { "color": "c5cc3653-2ee1-402a-aba2-7caae1da4f6c", "font-family": "Lato", "font-size": 8 }, "h2": { "color": "c5cc3653-2ee1-402a-aba2-7caae1da4f6c", "font-family": "Lato", "font-size": 6 }, "h3": { "color": "50f92c45-a630-455b-aec3-788680ec7410", "font-family": "Lato", "font-size": 5.5 }, "h4": { "color": "c5cc3653-2ee1-402a-aba2-7caae1da4f6c", "font-family": "Lato", "font-size": 5 }, "h5": { "font-family": "Lato" }, "h6": { "font-family": "Lato" }, "h7": { "font-family": "Lato" }, "pre": { "font-family": "Anonymous Pro", "font-size": 4 } }, "text-base": { "font-family": "Merriweather", "font-size": 4 } } } } } }, "nbformat": 4, "nbformat_minor": 4 }