From c512dd0be96e801d2da13a5d5b1ba32e19f50413 Mon Sep 17 00:00:00 2001 From: "Steven G. Johnson" Date: Mon, 24 Jan 2022 19:37:45 -0500 Subject: [PATCH 1/9] link fix --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 384ac69..67045df 100644 --- a/README.md +++ b/README.md @@ -90,7 +90,7 @@ Automatic differentiation, guest lecture by [Dr. Chris Rackauckas](https://chris # Lecture 6 (Jan 24) -* part 1: derivatives of eigenproblems [(html)](https://rawcdn.githack.com/mitmath/matrixcalc/69cbb521f357a9633ea4e5f77079eb399986240a/symeig.jl.html) [(julia source)](symeig.jl) +* part 1: derivatives of eigenproblems [(html)](https://rawcdn.githack.com/mitmath/matrixcalc/61a7b3e0cbebd0ccdc126fbe831d1398154e272b/symeig.jl.html) [(julia source)](symeig.jl) * part 2: second derivatives, bilinear forms, and Hessian matrices [(notes)](https://www.dropbox.com/s/tde5cow6wuais8y/Hessians.pdf?dl=0) * [video](https://mit.zoom.us/rec/share/Av05JqxIoIO9woSRjxZVh5AA4cXGeq1mkTUFyqqM5ZU2YElVbsPupJ_zrWwwemUU.8Ten6yxTyONNy8ya?startTime=1643039961000) From 035b2787ec26b4ed2e660d1621bd0a9ddad0239e Mon Sep 17 00:00:00 2001 From: "Steven G. Johnson" Date: Wed, 26 Jan 2022 13:54:59 -0500 Subject: [PATCH 2/9] notes from today --- README.md | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 67045df..91b0596 100644 --- a/README.md +++ b/README.md @@ -97,4 +97,15 @@ Automatic differentiation, guest lecture by [Dr. Chris Rackauckas](https://chris **Further reading (part 1)**: Computing derivatives on curved surfaces ("manifolds") is closely related to [tangent spaces](https://en.wikipedia.org/wiki/Tangent_space) in differential geometry. The effect of constraints can also be expressed in terms of [Lagrange multipliers](https://en.wikipedia.org/wiki/Lagrange_multiplier), which are useful in expressing optimization problems with constraints (see also chapter 5 of [Convex Optimization](https://web.stanford.edu/~boyd/cvxbook/) by Boyd and Vandenberghe). In physics, first and second derivatives of eigenvalues and first derivatives of eigenvectors are often presented as part of ["time-independent" perturbation theory](https://en.wikipedia.org/wiki/Perturbation_theory_(quantum_mechanics)#Time-independent_perturbation_theory) in quantum mechanics, or as the [Hellmann–Feynmann theorem](https://en.wikipedia.org/wiki/Hellmann%E2%80%93Feynman_theorem) for the case of dλ. The derivative of an eigenvector involves *all* of the other eigenvectors, but a much simpler "vector–Jacobian product" (involving only a single eigenvector and eigenvalue) can be obtained from left-to-right differentiation of a *scalar function* of an eigenvector, as reviewed in the [18.335 notes on adjoint methods](https://github.com/mitmath/18335/blob/spring21/notes/adjoint/adjoint.pdf). -**Further reading (part 2)**: [Bilinear forms](https://en.wikipedia.org/wiki/Bilinear_form) are an important generalization of quadratic operations to arbitrary vector spaces, and we saw that the second derivative can be viewed as a [symmetric bilinear forms](https://en.wikipedia.org/wiki/Symmetric_bilinear_form). This is closely related to a [quadratic form](https://en.wikipedia.org/wiki/Quadratic_form), which is just what we get by plugging in the same vector twice, e.g. the f''(x)[δx,δx]/2 that appears in quadratic approximations for f(x+δx) is a quadratic form. The most familar multivariate version of f''(x) is the [Hessian matrix](https://en.wikipedia.org/wiki/Hessian_matrix); Khan academy has an elementary [introduction to quadratic approximation](https://www.khanacademy.org/math/multivariable-calculus/applications-of-multivariable-derivatives/quadratic-approximations/a/quadratic-approximation) using the Hessian. \ No newline at end of file +**Further reading (part 2)**: [Bilinear forms](https://en.wikipedia.org/wiki/Bilinear_form) are an important generalization of quadratic operations to arbitrary vector spaces, and we saw that the second derivative can be viewed as a [symmetric bilinear forms](https://en.wikipedia.org/wiki/Symmetric_bilinear_form). This is closely related to a [quadratic form](https://en.wikipedia.org/wiki/Quadratic_form), which is just what we get by plugging in the same vector twice, e.g. the f''(x)[δx,δx]/2 that appears in quadratic approximations for f(x+δx) is a quadratic form. The most familar multivariate version of f''(x) is the [Hessian matrix](https://en.wikipedia.org/wiki/Hessian_matrix); Khan academy has an elementary [introduction to quadratic approximation](https://www.khanacademy.org/math/multivariable-calculus/applications-of-multivariable-derivatives/quadratic-approxi + +# Lecture 7 (Jan 26) + +* part 1: continued [Hessian notes](https://www.dropbox.com/s/tde5cow6wuais8y/Hessians.pdf?dl=0) from previous lecture +* part 2: derivatives and backpropagation on graphs and linear operators (to be posted) +* video: to be posted +* pset 2 solutions: to be posted + +**Further reading (part 1)**: [Positive-definite](https://en.wikipedia.org/wiki/Definite_matrix) Hessian matrices, or more generally [definite quadratic forms](https://en.wikipedia.org/wiki/Definite_quadratic_form) f″, appear at extrema (f′=0) of scalar-valued functions f(x) that are local minima; there a lot [more formal treatments](http://www.columbia.edu/~md3405/Unconstrained_Optimization.pdf) of the same idea, and conversely Khan academy has the [simple 2-variable version](https://www.khanacademy.org/math/multivariable-calculus/applications-of-multivariable-derivatives/optimizing-multivariable-functions/a/second-partial-derivative-test) where you can check the sign of the 2×2 eigenvalues just by looking at the determinant and a single entry (or the trace). There's a nice [stackexchange discussion](https://math.stackexchange.com/questions/2285282/relating-condition-number-of-hessian-to-the-rate-of-convergence) on why an [ill-conditioned](https://nhigham.com/2020/03/19/what-is-a-condition-number/) Hessian tends to make steepest descent converge slowly; some Toronto [course notes on the topic](https://www.cs.toronto.edu/~rgrosse/courses/csc421_2019/slides/lec07.pdf) may also be helpful. + +**Further reading (part 2)**: See this blog post on [calculus on computational graphs](https://colah.github.io/posts/2015-08-Backprop/) for an gentle review, and these Columbia [course notes](http://www.cs.columbia.edu/~mcollins/ff2.pdf) for a more formal approach. \ No newline at end of file From 50c44c083b951eba44d57f2c843f63a08ee4963c Mon Sep 17 00:00:00 2001 From: "Steven G. Johnson" Date: Wed, 26 Jan 2022 15:38:43 -0500 Subject: [PATCH 3/9] video link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 91b0596..1bd9235 100644 --- a/README.md +++ b/README.md @@ -103,7 +103,7 @@ In physics, first and second derivatives of eigenvalues and first derivatives of * part 1: continued [Hessian notes](https://www.dropbox.com/s/tde5cow6wuais8y/Hessians.pdf?dl=0) from previous lecture * part 2: derivatives and backpropagation on graphs and linear operators (to be posted) -* video: to be posted +* [video](https://mit.zoom.us/rec/share/DblFFU72Nary_yKfaQis0WaDoFEznD-92EPr52LHE1QBKcVWPUlmBPgApjre2uf9.oqtYrgEg73glPWx-?startTime=1643212653000) * pset 2 solutions: to be posted **Further reading (part 1)**: [Positive-definite](https://en.wikipedia.org/wiki/Definite_matrix) Hessian matrices, or more generally [definite quadratic forms](https://en.wikipedia.org/wiki/Definite_quadratic_form) f″, appear at extrema (f′=0) of scalar-valued functions f(x) that are local minima; there a lot [more formal treatments](http://www.columbia.edu/~md3405/Unconstrained_Optimization.pdf) of the same idea, and conversely Khan academy has the [simple 2-variable version](https://www.khanacademy.org/math/multivariable-calculus/applications-of-multivariable-derivatives/optimizing-multivariable-functions/a/second-partial-derivative-test) where you can check the sign of the 2×2 eigenvalues just by looking at the determinant and a single entry (or the trace). There's a nice [stackexchange discussion](https://math.stackexchange.com/questions/2285282/relating-condition-number-of-hessian-to-the-rate-of-convergence) on why an [ill-conditioned](https://nhigham.com/2020/03/19/what-is-a-condition-number/) Hessian tends to make steepest descent converge slowly; some Toronto [course notes on the topic](https://www.cs.toronto.edu/~rgrosse/courses/csc421_2019/slides/lec07.pdf) may also be helpful. From 7ffd54f34a5f03729e63ed1f3e7382ffad1d60c6 Mon Sep 17 00:00:00 2001 From: "Steven G. Johnson" Date: Wed, 26 Jan 2022 15:46:53 -0500 Subject: [PATCH 4/9] typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1bd9235..4840007 100644 --- a/README.md +++ b/README.md @@ -108,4 +108,4 @@ In physics, first and second derivatives of eigenvalues and first derivatives of **Further reading (part 1)**: [Positive-definite](https://en.wikipedia.org/wiki/Definite_matrix) Hessian matrices, or more generally [definite quadratic forms](https://en.wikipedia.org/wiki/Definite_quadratic_form) f″, appear at extrema (f′=0) of scalar-valued functions f(x) that are local minima; there a lot [more formal treatments](http://www.columbia.edu/~md3405/Unconstrained_Optimization.pdf) of the same idea, and conversely Khan academy has the [simple 2-variable version](https://www.khanacademy.org/math/multivariable-calculus/applications-of-multivariable-derivatives/optimizing-multivariable-functions/a/second-partial-derivative-test) where you can check the sign of the 2×2 eigenvalues just by looking at the determinant and a single entry (or the trace). There's a nice [stackexchange discussion](https://math.stackexchange.com/questions/2285282/relating-condition-number-of-hessian-to-the-rate-of-convergence) on why an [ill-conditioned](https://nhigham.com/2020/03/19/what-is-a-condition-number/) Hessian tends to make steepest descent converge slowly; some Toronto [course notes on the topic](https://www.cs.toronto.edu/~rgrosse/courses/csc421_2019/slides/lec07.pdf) may also be helpful. -**Further reading (part 2)**: See this blog post on [calculus on computational graphs](https://colah.github.io/posts/2015-08-Backprop/) for an gentle review, and these Columbia [course notes](http://www.cs.columbia.edu/~mcollins/ff2.pdf) for a more formal approach. \ No newline at end of file +**Further reading (part 2)**: See this blog post on [calculus on computational graphs](https://colah.github.io/posts/2015-08-Backprop/) for a gentle review, and these Columbia [course notes](http://www.cs.columbia.edu/~mcollins/ff2.pdf) for a more formal approach. \ No newline at end of file From 2662ecb6103a51b57ecea4613679264108d823fa Mon Sep 17 00:00:00 2001 From: "Steven G. Johnson" Date: Thu, 27 Jan 2022 09:30:37 -0500 Subject: [PATCH 5/9] pset 2 solutions --- README.md | 2 +- hw2.pdf | Bin 41742 -> 41690 bytes hw2sol.ipynb | 799 +++++++++++++++++++++++++++++++++++++++++++++++++++ hw2sol.pdf | Bin 0 -> 73388 bytes hw2sol.tex | 157 ++++++++++ 5 files changed, 957 insertions(+), 1 deletion(-) create mode 100644 hw2sol.ipynb create mode 100644 hw2sol.pdf create mode 100644 hw2sol.tex diff --git a/README.md b/README.md index 4840007..a9c7bdf 100644 --- a/README.md +++ b/README.md @@ -104,7 +104,7 @@ In physics, first and second derivatives of eigenvalues and first derivatives of * part 1: continued [Hessian notes](https://www.dropbox.com/s/tde5cow6wuais8y/Hessians.pdf?dl=0) from previous lecture * part 2: derivatives and backpropagation on graphs and linear operators (to be posted) * [video](https://mit.zoom.us/rec/share/DblFFU72Nary_yKfaQis0WaDoFEznD-92EPr52LHE1QBKcVWPUlmBPgApjre2uf9.oqtYrgEg73glPWx-?startTime=1643212653000) -* pset 2 solutions: to be posted +* [pset 2 solutions](hw2sol.pdf) and computational [notebook](https://nbviewer.org/github/mitmath/matrixcalc/blob/main/hw2sol.ipynb) **Further reading (part 1)**: [Positive-definite](https://en.wikipedia.org/wiki/Definite_matrix) Hessian matrices, or more generally [definite quadratic forms](https://en.wikipedia.org/wiki/Definite_quadratic_form) f″, appear at extrema (f′=0) of scalar-valued functions f(x) that are local minima; there a lot [more formal treatments](http://www.columbia.edu/~md3405/Unconstrained_Optimization.pdf) of the same idea, and conversely Khan academy has the [simple 2-variable version](https://www.khanacademy.org/math/multivariable-calculus/applications-of-multivariable-derivatives/optimizing-multivariable-functions/a/second-partial-derivative-test) where you can check the sign of the 2×2 eigenvalues just by looking at the determinant and a single entry (or the trace). There's a nice [stackexchange discussion](https://math.stackexchange.com/questions/2285282/relating-condition-number-of-hessian-to-the-rate-of-convergence) on why an [ill-conditioned](https://nhigham.com/2020/03/19/what-is-a-condition-number/) Hessian tends to make steepest descent converge slowly; some Toronto [course notes on the topic](https://www.cs.toronto.edu/~rgrosse/courses/csc421_2019/slides/lec07.pdf) may also be helpful. diff --git a/hw2.pdf b/hw2.pdf index c72620ada633d9c108b5f93cbf22a73c80cefe0c..c8fc977715ab68ac746475b24e1341d7e90006b7 100644 GIT binary patch delta 28359 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 delta 28418 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 ...` that captures the other parameters (also called a [closure](https://en.wikipedia.org/wiki/Closure_(computer_programming)) in computer science):" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "2329ed32", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "([262.5515510338092, -273.8595112733488, 96.32881037878506, 217.43756038923235, -171.7934208639604],)" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Zygote.gradient(p -> f(p, A₀, a, B₀, b, F), p)" + ] + }, + { + "cell_type": "markdown", + "id": "09a8a25a", + "metadata": {}, + "source": [ + "(Zygote returns a 1-component tuple of outputs, because it can potentially differentiate with respect to multiple arguments, though here we are just asking for 1.)\n", + "\n", + "The above looks pretty good if we \"eyeball\" it compared to `∇f` above. Let's compare it quantitatively:" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "c0c3d50f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "2.1572017312010847e-16" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "relerr(∇f(p, A₀, a, B₀, b, F), # manual ∇f\n", + " Zygote.gradient(p -> f(p, A₀, a, B₀, b, F), p)[1]) # vs AD" + ] + }, + { + "cell_type": "markdown", + "id": "33c8c7d5", + "metadata": {}, + "source": [ + "Hooray, it matches up to the limits of roundoff error (to essentially [machine precision](https://en.wikipedia.org/wiki/Machine_epsilon))!" + ] + }, + { + "cell_type": "markdown", + "id": "4cb40856", + "metadata": {}, + "source": [ + "# Problem 4c" + ] + }, + { + "cell_type": "markdown", + "id": "8834f86c", + "metadata": {}, + "source": [ + "Demonstrate numerically that $d(e^A) = \\sum_{k=0}^\\infty \\! \\! \\frac{1}{k!} (\\sum_{\\ell=0}^{k-1} (A^T)^{k-\\ell-1} \\otimes A^\\ell )dA$" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "36ca240e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "3×3 Matrix{Float64}:\n", + " 0.989401 0.372355 0.475427\n", + " 0.94298 0.68495 0.646221\n", + " 0.794569 0.13317 0.353663" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "A = rand(3,3)" + ] + }, + { + "cell_type": "markdown", + "id": "df6620d8", + "metadata": {}, + "source": [ + "### Using ForwardDiff" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "a7dfb9f4", + "metadata": {}, + "outputs": [], + "source": [ + "using ForwardDiff" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "d3176e9d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "e (generic function with 1 method)" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "e(A) = sum(A^k/factorial(k) for k=0:20) # hmm exp doesn't work, i'll go to k=20" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "c1536121", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1.2971024122201743e-15" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "relerr(e(A), exp(A)) # check that our sum matches the built-in exp(A) function" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "8b7817cb", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "9×9 Matrix{Float64}:\n", + " 3.35707 0.5389 0.688955 1.50121 … 1.04456 0.123629 0.158014\n", + " 1.50121 2.82372 0.907286 0.466706 0.338304 0.92634 0.209389\n", + " 1.04456 0.265598 2.45771 0.338304 0.244335 0.0576795 0.83731\n", + " 0.5389 0.0624931 0.0798733 2.82372 0.265598 0.0290732 0.0371575\n", + " 0.170853 0.479248 0.105876 1.3384 0.079272 0.237991 0.0492994\n", + " 0.123629 0.0290732 0.434115 0.92634 … 0.0576795 0.0134119 0.216817\n", + " 0.688955 0.0798733 0.102087 0.907286 2.45771 0.434115 0.555028\n", + " 0.218367 0.612715 0.135322 0.289541 1.21467 2.02443 0.729772\n", + " 0.158014 0.0371575 0.555028 0.209389 0.83731 0.216817 1.73404" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "J_AD = ForwardDiff.jacobian(e,A)" + ] + }, + { + "cell_type": "markdown", + "id": "84969d50", + "metadata": {}, + "source": [ + "### .. or using Finite Differences" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "7b35a6b2", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "9×9 Matrix{Float64}:\n", + " 3.35707 0.538899 0.688955 1.50121 … 1.04456 0.123629 0.158014\n", + " 1.50121 2.82372 0.907286 0.466706 0.338304 0.92634 0.209389\n", + " 1.04456 0.265598 2.45771 0.338304 0.244335 0.0576795 0.83731\n", + " 0.5389 0.062493 0.0798732 2.82372 0.265598 0.0290732 0.0371576\n", + " 0.170853 0.479248 0.105875 1.3384 0.0792719 0.237991 0.0492994\n", + " 0.123629 0.0290732 0.434115 0.92634 … 0.0576795 0.0134118 0.216817\n", + " 0.688955 0.0798732 0.102087 0.907286 2.45771 0.434115 0.555028\n", + " 0.218367 0.612715 0.135321 0.289541 1.21467 2.02443 0.729772\n", + " 0.158014 0.0371575 0.555028 0.209389 0.83731 0.216817 1.73404" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ϵ = 1e-8\n", + "J = zeros(9,0) # initialize 9x9 Jacobian with 9 rows and no columns\n", + "for j=1:3, i=1:3\n", + " dA = zeros(3,3)\n", + " dA[i,j] = ϵ # perturb the (i,j) entry only\n", + " df = exp(A+dA)-exp(A) # see the perturbed exp\n", + " J = [J vec(df)] # append this to J\n", + "end\n", + "J_FD = J/ϵ" + ] + }, + { + "cell_type": "markdown", + "id": "d6973563", + "metadata": {}, + "source": [ + "### The theoretical answer summing to 20" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "aabb597f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "9×9 Matrix{Float64}:\n", + " 3.35707 0.5389 0.688955 1.50121 … 1.04456 0.123629 0.158014\n", + " 1.50121 2.82372 0.907286 0.466706 0.338304 0.92634 0.209389\n", + " 1.04456 0.265598 2.45771 0.338304 0.244335 0.0576795 0.83731\n", + " 0.5389 0.0624931 0.0798733 2.82372 0.265598 0.0290732 0.0371575\n", + " 0.170853 0.479248 0.105876 1.3384 0.079272 0.237991 0.0492994\n", + " 0.123629 0.0290732 0.434115 0.92634 … 0.0576795 0.0134119 0.216817\n", + " 0.688955 0.0798733 0.102087 0.907286 2.45771 0.434115 0.555028\n", + " 0.218367 0.612715 0.135322 0.289541 1.21467 2.02443 0.729772\n", + " 0.158014 0.0371575 0.555028 0.209389 0.83731 0.216817 1.73404" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# written as nested sum calls:\n", + "sum(sum( (A')^(k-ℓ-1) ⊗ A^ℓ for ℓ=0:(k-1))/factorial(k) for k=1:20)" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "75eb21e5", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "9×9 Matrix{Float64}:\n", + " 3.35707 0.5389 0.688955 1.50121 … 1.04456 0.123629 0.158014\n", + " 1.50121 2.82372 0.907286 0.466706 0.338304 0.92634 0.209389\n", + " 1.04456 0.265598 2.45771 0.338304 0.244335 0.0576795 0.83731\n", + " 0.5389 0.0624931 0.0798733 2.82372 0.265598 0.0290732 0.0371575\n", + " 0.170853 0.479248 0.105876 1.3384 0.079272 0.237991 0.0492994\n", + " 0.123629 0.0290732 0.434115 0.92634 … 0.0576795 0.0134119 0.216817\n", + " 0.688955 0.0798733 0.102087 0.907286 2.45771 0.434115 0.555028\n", + " 0.218367 0.612715 0.135322 0.289541 1.21467 2.02443 0.729772\n", + " 0.158014 0.0371575 0.555028 0.209389 0.83731 0.216817 1.73404" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# same thing written another way:\n", + "J_20 = sum( (A')^(k-ℓ-1) ⊗ A^ℓ / factorial(k) for ℓ=0:20, k=1:20 if k>ℓ)" + ] + }, + { + "cell_type": "markdown", + "id": "bd39711b", + "metadata": {}, + "source": [ + "Looks good let's check the match quantitatively:" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "d3c6f007", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1.3738128345184809e-15" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "relerr(J_20, J_AD) # should match to nearly machine precision" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "6c1d30c8", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1.293987776257493e-7" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "relerr(J_20, J_FD) # should match to ≈ 7 digits" + ] + }, + { + "cell_type": "markdown", + "id": "49ebb275", + "metadata": {}, + "source": [ + "Hooray, math works!" + ] + } + ], + "metadata": { + "@webio": { + "lastCommId": null, + "lastKernelId": null + }, + "kernelspec": { + "display_name": "Julia 1.7.1", + "language": "julia", + "name": "julia-1.7" + }, + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.7.1" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/hw2sol.pdf b/hw2sol.pdf new file mode 100644 index 0000000000000000000000000000000000000000..1faf98a210a0d0ebceccdc2c7f406e06f485a35a GIT binary patch literal 73388 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®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 z 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 Jy863u0RWldJ)!^r literal 0 HcmV?d00001 diff --git a/hw2sol.tex b/hw2sol.tex new file mode 100644 index 0000000..cfad4b4 --- /dev/null +++ b/hw2sol.tex @@ -0,0 +1,157 @@ +\documentclass[10pt,oneside]{article} +\usepackage{amsmath} +\usepackage{graphicx} +\usepackage{subcaption} +\usepackage{amsfonts} +\usepackage{amssymb} + +\newcommand{\tr}{\operatorname{trace}} +\newcommand{\vecm}{\operatorname{vec}} +\newcommand{\diagm}{\operatorname{diagm}} +\newcommand{\dotstar}{\mathbin{.*}} + +\usepackage{polyglossia} + + + + +\usepackage[ + backend=biber +]{biblatex} +\addbibresource{biblio.bib} + + +\usepackage[ + letterpaper, + left=1cm, + right=1cm, + top=1.5cm, + bottom=1.5cm +]{geometry} + + +\usepackage[ + final, + unicode, + colorlinks=true, + citecolor=blue, + linkcolor=blue, + plainpages=false, + urlcolor=blue, + pdfpagelabels=true, + pdfsubject={Cálculo}, + pdfauthor={José Doroteo Arango Arámbula}, + pdftitle={Tarea 1}, + pdfkeywords={UNAM, FES Acatlán, 2021-I} +]{hyperref} + +\usepackage{booktabs} + + +\usepackage{algpseudocode} +\usepackage{algorithm} +\floatname{algorithm}{Algoritmo} + +\usepackage{enumitem} + +\usepackage{lastpage} +\usepackage{fancyhdr} +\fancyhf{} +\pagestyle{fancy} +\fancyhf{} +\fancyhead[L]{MIT IAP Winter 2022} +\fancyhead[C]{Matrix Calculus} +\fancyhead[R]{Profs. Edelman and Johnson} +\fancyfoot[R]{} +% https://tex.stackexchange.com/questions/227/how-can-i-add-page-of-on-my-document +\fancyfoot[C]{\thepage\ of \pageref*{LastPage}} +%\fancyfoot[C]{ of } +\fancyfoot[L]{} +\renewcommand{\headrulewidth}{2pt} +\renewcommand{\footrulewidth}{2pt} + +\usepackage[newfloat=true]{minted} + +\author{} +\title{Homework 2} + +\date{\today} + + +\DeclareCaptionFormat{mitedFormat}{% + \textbf{#1#2}#3} +\DeclareCaptionStyle{minetdStyle}{skip=0cm,width=.85\textwidth,justification=centering, + font=footnotesize,singlelinecheck=off,format=mitedFormat,labelsep=space} +\newenvironment{mintedCode}{\captionsetup{type=listing,style=minetdStyle}}{} + +\usepackage{dirtytalk} + +\SetupFloatingEnvironment{listing}{} + +\usepackage[parfill]{parskip} + +\usepackage{csquotes} + +\begin{document} +\maketitle +\thispagestyle{fancy} + +{\bf Please submit your HW on Canvas; include a PDF printout of any code and results, clearly labeled, e.g. from a Jupyter notebook. It is due Wednesday January 26th by 11:59pm EST. } + +\subsection*{Problem 1} + +Let $f(x): \mathbb{R}^n \to \mathbb{R}^n$ be an invertible map from inputs $x \in \mathbb{R}^n$ ($n$-component column vectors) to outputs in $\mathbb{R}^n$. If $g(x)$ is the inverse function, so that $g(f(x)) = x = f(g(x))$, use the chain rule to show how the Jacobians $f'(x)$ and $g'(x)$ are related. + +\subsection*{Problem 2} + +Consider $f(A) = \sqrt{A}$ where $A$ is an $n\times n$ matrix. (Recall that the matrix square root is a matrix such that $(\sqrt{A})^2 = A$. In 18.06, we might compute this from a diagonalization of $A$ by taking the square roots of all the eigenvalues.) + +\begin{enumerate}[label=\alph*)] + \item Give a formula for the Jacobian of $f$, acting on $\vecm(A)$, in terms of Kronecker products and matrix powers only (no eigenvalues required!). (Hint: see problem 1.) + + \item Check your formula numerically against a finite-difference approximation. (To ensure that no complex numbers show up in the matrix square root, pick a random positive-definite $A = B^T B$ for some random square $B$.) +\end{enumerate} + +\subsection*{Problem 3} + +Suppose that $A(p) = A_0 + \diagm(p)$ constructs an $n\times n$ matrix $A$ from $p \in \mathbb{R}^n$, where $\diagm(p) = \begin{pmatrix} p_1 & & \\ & p_2 & \\ & & \ddots \end{pmatrix}$ is the diagonal matrix with the entries of $p$ along its diagonal, and $A_0$ is some constant matrix. We now perform the following sequence of steps: + +\begin{enumerate} + \item solve $A(p) x = a$ for $x \in \mathbb{R}^n$, where $a$ is some vector. + \item form $B(x) = B_0 + \diagm(x \dotstar x)$ where $\dotstar$ is the elementwise product and $B_0$ is some $n\times n$ matrix. + \item solve $By = b$ for $y \in \mathbb{R}^n$, where $b$ is some vector. + \item compute $f = y^T F y$ where $F = F^T$ is some symmetric $n \times n$ matrix. +\end{enumerate} + +Now, suppose that we want to optimize $f(p)$ as a function of the parameters $p$ that went into the first step. We need to compute the gradient $\nabla f$ for any kind of large-scale problem. If $n$ is huge, though, we must be careful to do this efficiently, using ``reverse-mode'' or ``adjoint'' calculations in which we apply the chain rule from left to right. + +\begin{enumerate}[label=\alph*)] + +\item Explain the sequence of steps to compute $\nabla f$. Your answer should show that $\nabla f$ can \emph{also} be computed by solving only \emph{two} $n \times n$ linear systems, similar to $f$ itself. + +\item Check your answer numerically against finite differences (for some randomly chosen $A_0, B_0, a, b, F$). + +\item Check your answer against the result of a reverse-mode AD software (e.g. Zygote in Julia). + +\end{enumerate} + +\subsection*{Problem 4} + +\begin{enumerate}[label=\alph*)] + +\item Write down some $4 \times 4$ matrix that is not the +Kronecker product of two $2 \times 2$ matrices. Convince +us this is true. + +\item Prove that if $A$ ($m \times m$) and $B$ ($n \times n$) are orthogonal (i.e., +$A^TA=I_m$ and $B^TB=I_n$) then $A \otimes B$ ($mn \times mn$) is orthogonal. + +\item If $f(A) = e^A= \sum_{k=0}^\infty A^k/k!$, write down +a power series involving Kronecker products for the +Jacobian $f'(A)$. Check your answer with a numerical example, e.g.~against finite differences. + +\end{enumerate} + + + +\end{document} From 5cdc6bf73da1bb3a5b9baa89568dd2b1f6420dd6 Mon Sep 17 00:00:00 2001 From: "Steven G. Johnson" Date: Fri, 28 Jan 2022 14:37:33 -0500 Subject: [PATCH 6/9] lecture 8 updates --- README.md | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a9c7bdf..2725756 100644 --- a/README.md +++ b/README.md @@ -101,11 +101,22 @@ In physics, first and second derivatives of eigenvalues and first derivatives of # Lecture 7 (Jan 26) -* part 1: continued [Hessian notes](https://www.dropbox.com/s/tde5cow6wuais8y/Hessians.pdf?dl=0) from previous lecture +* part 1: continued [Hessian notes](https://www.dropbox.com/s/tde5cow6wuais8y/Hessians.pdf?dl=0) from previous lecture: minima/maxima and f″ definiteness, Hessian conditioning and steepest-descent convergence * part 2: derivatives and backpropagation on graphs and linear operators (to be posted) * [video](https://mit.zoom.us/rec/share/DblFFU72Nary_yKfaQis0WaDoFEznD-92EPr52LHE1QBKcVWPUlmBPgApjre2uf9.oqtYrgEg73glPWx-?startTime=1643212653000) * [pset 2 solutions](hw2sol.pdf) and computational [notebook](https://nbviewer.org/github/mitmath/matrixcalc/blob/main/hw2sol.ipynb) **Further reading (part 1)**: [Positive-definite](https://en.wikipedia.org/wiki/Definite_matrix) Hessian matrices, or more generally [definite quadratic forms](https://en.wikipedia.org/wiki/Definite_quadratic_form) f″, appear at extrema (f′=0) of scalar-valued functions f(x) that are local minima; there a lot [more formal treatments](http://www.columbia.edu/~md3405/Unconstrained_Optimization.pdf) of the same idea, and conversely Khan academy has the [simple 2-variable version](https://www.khanacademy.org/math/multivariable-calculus/applications-of-multivariable-derivatives/optimizing-multivariable-functions/a/second-partial-derivative-test) where you can check the sign of the 2×2 eigenvalues just by looking at the determinant and a single entry (or the trace). There's a nice [stackexchange discussion](https://math.stackexchange.com/questions/2285282/relating-condition-number-of-hessian-to-the-rate-of-convergence) on why an [ill-conditioned](https://nhigham.com/2020/03/19/what-is-a-condition-number/) Hessian tends to make steepest descent converge slowly; some Toronto [course notes on the topic](https://www.cs.toronto.edu/~rgrosse/courses/csc421_2019/slides/lec07.pdf) may also be helpful. -**Further reading (part 2)**: See this blog post on [calculus on computational graphs](https://colah.github.io/posts/2015-08-Backprop/) for a gentle review, and these Columbia [course notes](http://www.cs.columbia.edu/~mcollins/ff2.pdf) for a more formal approach. \ No newline at end of file +**Further reading (part 2)**: See this blog post on [calculus on computational graphs](https://colah.github.io/posts/2015-08-Backprop/) for a gentle review, and these Columbia [course notes](http://www.cs.columbia.edu/~mcollins/ff2.pdf) for a more formal approach. + + +# Lecture 8 (Jan 28) + +* part 1: continued [Hessian notes](https://www.dropbox.com/s/tde5cow6wuais8y/Hessians.pdf?dl=0): using Hessians for optimization (Newton & quasi-Newton & Newton–Krylov methods), cost of Hessians +* part 2: adjoint differentiation of ODES (guest lecture by Dr. Chris Rackauckas), notes coming soon +* video: coming soon + +**Further reading (part 1)**: See e.g. these Stanford notes on [sequential quadratic optimization](https://web.stanford.edu/class/ee364b/lectures/seq_notes.pdf) using trust regions (sec. 2.2). See 18.335 [notes on BFGS quasi-Newton methods](https://github.com/mitmath/18335/blob/spring21/notes/BFGS.pdf) (also [video](https://mit.zoom.us/rec/share/naqcRgSkZ0VNeDp0ht8QmB566mPowuHJ8k0LcaAmZ7XxaCT1ch4j_O4Khzi-taXm.CXI8xFthag4RvvoC?startTime=1620241284000)). The fact that a quadratic optimization problem in a sphere has [strong duality](https://en.wikipedia.org/wiki/Strong_duality) and hence is efficiently solvable is discussed in section 5.2.4 of the [*Convex Optimization* book](https://web.stanford.edu/~boyd/cvxbook/). There has been a lot of work on [automatic Hessian computation](https://en.wikipedia.org/wiki/Hessian_automatic_differentiation), but for large-scale problems you can ultimately only compute Hessian–vector products efficiently in general, which are equivalent to a directional derivative of the gradient, and can be used e.g. for [Newton–Krylov methods](https://en.wikipedia.org/wiki/Newton%E2%80%93Krylov_method). + +**Further reading (part 2)**: A very general reference on adjoint-method (reverse-mode/backpropagation) differentiation of ODEs (and generalizations thereof), using notation similar to that of Chris R. today, is [Cao et al (2003)](https://epubs.siam.org/doi/10.1137/S1064827501380630) ([pdf](http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.65.455&rep=rep1&type=pdf)). See also the [adjoint sensitivity analysis](https://diffeq.sciml.ai/stable/extras/sensitivity_math/) and [automatic sensitivity analysis](https://diffeq.sciml.ai/stable/analysis/sensitivity/) sections of Chris's amazing [DifferentialEquations.jl software suite](https://diffeq.sciml.ai/stable/) for numerical solution of ODEs in Julia. There is a nice YouTube [lecture on adjoint sensitivity of ODEs](https://www.youtube.com/watch?v=k6s2G5MZv-I), again using a similar notation. \ No newline at end of file From 64c1550eb1314364b3da9825a99c74646b1b5451 Mon Sep 17 00:00:00 2001 From: "Steven G. Johnson" Date: Fri, 28 Jan 2022 15:30:00 -0500 Subject: [PATCH 7/9] video link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2725756..29fd194 100644 --- a/README.md +++ b/README.md @@ -115,7 +115,7 @@ In physics, first and second derivatives of eigenvalues and first derivatives of * part 1: continued [Hessian notes](https://www.dropbox.com/s/tde5cow6wuais8y/Hessians.pdf?dl=0): using Hessians for optimization (Newton & quasi-Newton & Newton–Krylov methods), cost of Hessians * part 2: adjoint differentiation of ODES (guest lecture by Dr. Chris Rackauckas), notes coming soon -* video: coming soon +* [video](https://mit.zoom.us/rec/share/4yJfjUXsAhykKGebU8lw1wqOb_TIwK-WISEHwEbG8WyB2bLlyYLjkZXQHonT2Tte.lLaSTRDjVxYocEmz?startTime=1643385485000) **Further reading (part 1)**: See e.g. these Stanford notes on [sequential quadratic optimization](https://web.stanford.edu/class/ee364b/lectures/seq_notes.pdf) using trust regions (sec. 2.2). See 18.335 [notes on BFGS quasi-Newton methods](https://github.com/mitmath/18335/blob/spring21/notes/BFGS.pdf) (also [video](https://mit.zoom.us/rec/share/naqcRgSkZ0VNeDp0ht8QmB566mPowuHJ8k0LcaAmZ7XxaCT1ch4j_O4Khzi-taXm.CXI8xFthag4RvvoC?startTime=1620241284000)). The fact that a quadratic optimization problem in a sphere has [strong duality](https://en.wikipedia.org/wiki/Strong_duality) and hence is efficiently solvable is discussed in section 5.2.4 of the [*Convex Optimization* book](https://web.stanford.edu/~boyd/cvxbook/). There has been a lot of work on [automatic Hessian computation](https://en.wikipedia.org/wiki/Hessian_automatic_differentiation), but for large-scale problems you can ultimately only compute Hessian–vector products efficiently in general, which are equivalent to a directional derivative of the gradient, and can be used e.g. for [Newton–Krylov methods](https://en.wikipedia.org/wiki/Newton%E2%80%93Krylov_method). From 02b0d90b806187ce9cc953bfcd8b1a9f6415f4d9 Mon Sep 17 00:00:00 2001 From: "Steven G. Johnson" Date: Fri, 28 Jan 2022 18:02:52 -0500 Subject: [PATCH 8/9] link video by @mohamed82008 --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 29fd194..582d670 100644 --- a/README.md +++ b/README.md @@ -51,7 +51,7 @@ The chain rule and associativity: forward vs. reverse differentiation. The cha In part 2 (last few minutes), began setting up some example problems involving matrix functions of matrices, and "[vectorization](https://en.wikipedia.org/wiki/Vectorization_(mathematics))" of matrices to vectors and linear operators to [Kronecker products](https://en.wikipedia.org/wiki/Kronecker_product). To be continued. -**Further reading**: The terms "forward-mode" and "reverse-mode" differentiation are most prevalent in [automatic differentiation](https://en.wikipedia.org/wiki/Automatic_differentiation), which will will cover later in this course. You can find many, many articles online about [backpropagation](https://en.wikipedia.org/wiki/Backpropagation) in neural networks. There are many other versions of this, e.g. in differential geometry the derivative linear operator (multiplying Jacobians and perturbations dx right-to-left) is called a [pushforward](https://en.wikipedia.org/wiki/Pushforward_(differential)), whereas multiplying a gradient row vector (covector) by a Jacobian left-to-right is called a [pullback](https://en.wikipedia.org/wiki/Pullback_(differential_geometry)). +**Further reading**: The terms "forward-mode" and "reverse-mode" differentiation are most prevalent in [automatic differentiation (AD)](https://en.wikipedia.org/wiki/Automatic_differentiation), which will will cover later in this course. You can find many, many articles online about [backpropagation](https://en.wikipedia.org/wiki/Backpropagation) in neural networks. There are many other versions of this, e.g. in differential geometry the derivative linear operator (multiplying Jacobians and perturbations dx right-to-left) is called a [pushforward](https://en.wikipedia.org/wiki/Pushforward_(differential)), whereas multiplying a gradient row vector (covector) by a Jacobian left-to-right is called a [pullback](https://en.wikipedia.org/wiki/Pullback_(differential_geometry)). This [video on the principles of AD in Julia](https://www.youtube.com/watch?v=UqymrMG-Qi4) by [Mohamed Tarek](https://github.com/mohamed82008) also starts with a similar left-to-right (reverse) vs right-to-left (forward) viewpoint and goes into how it translates to Julia code, and how you define custom chain-rule steps for Julia AD. ## Lecture 3 (Jan 14) @@ -119,4 +119,4 @@ In physics, first and second derivatives of eigenvalues and first derivatives of **Further reading (part 1)**: See e.g. these Stanford notes on [sequential quadratic optimization](https://web.stanford.edu/class/ee364b/lectures/seq_notes.pdf) using trust regions (sec. 2.2). See 18.335 [notes on BFGS quasi-Newton methods](https://github.com/mitmath/18335/blob/spring21/notes/BFGS.pdf) (also [video](https://mit.zoom.us/rec/share/naqcRgSkZ0VNeDp0ht8QmB566mPowuHJ8k0LcaAmZ7XxaCT1ch4j_O4Khzi-taXm.CXI8xFthag4RvvoC?startTime=1620241284000)). The fact that a quadratic optimization problem in a sphere has [strong duality](https://en.wikipedia.org/wiki/Strong_duality) and hence is efficiently solvable is discussed in section 5.2.4 of the [*Convex Optimization* book](https://web.stanford.edu/~boyd/cvxbook/). There has been a lot of work on [automatic Hessian computation](https://en.wikipedia.org/wiki/Hessian_automatic_differentiation), but for large-scale problems you can ultimately only compute Hessian–vector products efficiently in general, which are equivalent to a directional derivative of the gradient, and can be used e.g. for [Newton–Krylov methods](https://en.wikipedia.org/wiki/Newton%E2%80%93Krylov_method). -**Further reading (part 2)**: A very general reference on adjoint-method (reverse-mode/backpropagation) differentiation of ODEs (and generalizations thereof), using notation similar to that of Chris R. today, is [Cao et al (2003)](https://epubs.siam.org/doi/10.1137/S1064827501380630) ([pdf](http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.65.455&rep=rep1&type=pdf)). See also the [adjoint sensitivity analysis](https://diffeq.sciml.ai/stable/extras/sensitivity_math/) and [automatic sensitivity analysis](https://diffeq.sciml.ai/stable/analysis/sensitivity/) sections of Chris's amazing [DifferentialEquations.jl software suite](https://diffeq.sciml.ai/stable/) for numerical solution of ODEs in Julia. There is a nice YouTube [lecture on adjoint sensitivity of ODEs](https://www.youtube.com/watch?v=k6s2G5MZv-I), again using a similar notation. \ No newline at end of file +**Further reading (part 2)**: A very general reference on adjoint-method (reverse-mode/backpropagation) differentiation of ODEs (and generalizations thereof), using notation similar to that of Chris R. today, is [Cao et al (2003)](https://epubs.siam.org/doi/10.1137/S1064827501380630) ([pdf](http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.65.455&rep=rep1&type=pdf)). See also the [adjoint sensitivity analysis](https://diffeq.sciml.ai/stable/extras/sensitivity_math/) and [automatic sensitivity analysis](https://diffeq.sciml.ai/stable/analysis/sensitivity/) sections of Chris's amazing [DifferentialEquations.jl software suite](https://diffeq.sciml.ai/stable/) for numerical solution of ODEs in Julia. There is a nice YouTube [lecture on adjoint sensitivity of ODEs](https://www.youtube.com/watch?v=k6s2G5MZv-I), again using a similar notation. From 8d9aae5980e06585e80c3a40f84c3ab27a66b395 Mon Sep 17 00:00:00 2001 From: "Steven G. Johnson" Date: Sat, 29 Jan 2022 22:17:28 -0500 Subject: [PATCH 9/9] notes for lecture 8 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 582d670..e87b212 100644 --- a/README.md +++ b/README.md @@ -114,7 +114,7 @@ In physics, first and second derivatives of eigenvalues and first derivatives of # Lecture 8 (Jan 28) * part 1: continued [Hessian notes](https://www.dropbox.com/s/tde5cow6wuais8y/Hessians.pdf?dl=0): using Hessians for optimization (Newton & quasi-Newton & Newton–Krylov methods), cost of Hessians -* part 2: adjoint differentiation of ODES (guest lecture by Dr. Chris Rackauckas), notes coming soon +* part 2: adjoint differentiation of ODES (guest lecture by Dr. Chris Rackauckas): [notes from 18.337](https://rawcdn.githack.com/mitmath/18337/7b0e890e1211bfa253782f7862389aeaa321e8d7/lecture11/adjoints.html) * [video](https://mit.zoom.us/rec/share/4yJfjUXsAhykKGebU8lw1wqOb_TIwK-WISEHwEbG8WyB2bLlyYLjkZXQHonT2Tte.lLaSTRDjVxYocEmz?startTime=1643385485000) **Further reading (part 1)**: See e.g. these Stanford notes on [sequential quadratic optimization](https://web.stanford.edu/class/ee364b/lectures/seq_notes.pdf) using trust regions (sec. 2.2). See 18.335 [notes on BFGS quasi-Newton methods](https://github.com/mitmath/18335/blob/spring21/notes/BFGS.pdf) (also [video](https://mit.zoom.us/rec/share/naqcRgSkZ0VNeDp0ht8QmB566mPowuHJ8k0LcaAmZ7XxaCT1ch4j_O4Khzi-taXm.CXI8xFthag4RvvoC?startTime=1620241284000)). The fact that a quadratic optimization problem in a sphere has [strong duality](https://en.wikipedia.org/wiki/Strong_duality) and hence is efficiently solvable is discussed in section 5.2.4 of the [*Convex Optimization* book](https://web.stanford.edu/~boyd/cvxbook/). There has been a lot of work on [automatic Hessian computation](https://en.wikipedia.org/wiki/Hessian_automatic_differentiation), but for large-scale problems you can ultimately only compute Hessian–vector products efficiently in general, which are equivalent to a directional derivative of the gradient, and can be used e.g. for [Newton–Krylov methods](https://en.wikipedia.org/wiki/Newton%E2%80%93Krylov_method).