Skip to content

Chapter 7 Formula Sheet

One page for the whole chapter. Equation numbers are the book’s; the measured columns are this module’s.

whatequationnotes
the problemminxf(x)\min_{\mathbf{x}} f(\mathbf{x})Eq 7.4, ff differentiable
one stepx1=x0γ((f)(x0))\mathbf{x}_1 = \mathbf{x}_0 - \gamma\big((\nabla f)(\mathbf{x}_0)\big)^\topEq 7.5
the updatexi+1=xiγi((f)(xi))\mathbf{x}_{i+1} = \mathbf{x}_i - \gamma_i\big((\nabla f)(\mathbf{x}_i)\big)^\topEq 7.6, the whole algorithm
least squares by descentAxb2\lVert\mathbf{A}\mathbf{x} - \mathbf{b}\rVert^2,  x=2(Axb)A\ \nabla_{\mathbf{x}} = 2(\mathbf{A}\mathbf{x}-\mathbf{b})^\top\mathbf{A}Eq 7.9, 7.10
condition numberκ=σ(A)max/σ(A)min\kappa = \sigma(\mathbf{A})_{\max}/\sigma(\mathbf{A})_{\min}§4.5; the aspect ratio of the valley
preconditioningsolve P1(Axb)=0\mathbf{P}^{-1}(\mathbf{A}\mathbf{x} - \mathbf{b}) = \mathbf{0}want κ(P1A)\kappa(\mathbf{P}^{-1}\mathbf{A}) small and P1\mathbf{P}^{-1} cheap

The transpose in Eq 7.6 is bookkeeping. Gradients are rows in this book (Eq 5.40), iterates are columns. In NumPy both are flat arrays, so the mistake is invisible until you reshape.

quantityformulaExample 7.1 value
curvature boundsμ=λmin\mu = \lambda_{\min}, L=λmaxL = \lambda_{\max}1.9446151.944615, 20.05538520.055385
condition numberκ=L/μ\kappa = L/\mu10.31329410.313294
divergence thresholdγ<2/L\gamma < 2/L0.0997240.099724
fastest step sizeγ=2/(μ+L)\gamma^\star = 2/(\mu+L)0.0909090.090909
convergence rate(κ1)/(κ+1)(\kappa-1)/(\kappa+1)0.8232170.823217
per-mode contraction1γλ\lvert 1 - \gamma\lambda\rvertmust be under 11 for every λ\lambda

Measured iteration counts to 10810^{-8} from x0=(3,1)\mathbf{x}_0 = (-3,-1): 10251025 at γ=0.01\gamma = 0.01, 112112 at the book’s 0.0850.085, 104104 at 0.0909090.090909, 12801280 at 0.0990.099, 3911339113 at 0.09970.0997, divergence from 0.09980.0998. The curve is a U, not a slide.

  • ff went up → the step was too large. Undo it and decrease γ\gamma. The undo is what buys monotonic convergence.
  • ff went down → try a larger γ\gamma.
whatequation
the updatexi+1=xiγi((f)(xi))+αΔxi\mathbf{x}_{i+1} = \mathbf{x}_i - \gamma_i\big((\nabla f)(\mathbf{x}_i)\big)^\top + \alpha\,\Delta\mathbf{x}_i
the memoryΔxi=xixi1=αΔxi1γi1((f)(xi1))\Delta\mathbf{x}_i = \mathbf{x}_i - \mathbf{x}_{i-1} = \alpha\,\Delta\mathbf{x}_{i-1} - \gamma_{i-1}\big((\nabla f)(\mathbf{x}_{i-1})\big)^\top
unrolledΔxi=γj=0i1αj((f)(xi1j))\Delta\mathbf{x}_i = -\gamma\sum_{j=0}^{i-1}\alpha^{\,j}\big((\nabla f)(\mathbf{x}_{i-1-j})\big)^\top

Equations 7.11 and 7.12, with α[0,1]\alpha \in [0,1]. The unrolled form is an exponentially weighted moving average with effective window 1/(1α)1/(1-\alpha).

heavy-ball optimum on a quadraticformulaExample 7.1 value
step sizeγ=4/(μ+L)2\gamma^\star = 4/(\sqrt\mu + \sqrt L)^20.1159760.115976
momentumα=((Lμ)/(L+μ))2\alpha^\star = \big((\sqrt L - \sqrt\mu)/(\sqrt L + \sqrt\mu)\big)^20.2757320.275732
rate(κ1)/(κ+1)(\sqrt\kappa - 1)/(\sqrt\kappa + 1)κ\kappa became κ\sqrt\kappa

That γ\gamma^\star is 16.3%16.3\% above the 2/L2/L where plain descent diverges. Measured at that step size: α=0.10\alpha = 0.10 diverges, 0.1650.165 takes 39003900 iterations, 0.28\mathbf{0.28} takes 33\mathbf{33}, 0.90.9 takes 343343, 0.990.99 takes 34213421, and α1\alpha \geq 1 never converges. Momentum has a lower stability bound as well as an upper one.

Speedup against plain descent, measured: 2.69×2.69\times at κ=10\kappa = 10, 7.89×7.89\times at 100100, 23.64×23.64\times at 10001000, 71.36×71.36\times at 10410^4 — tracking κ\sqrt\kappa.

whatequation
loss as a sumL(θ)=n=1NLn(θ)L(\boldsymbol\theta) = \sum_{n=1}^{N} L_n(\boldsymbol\theta)
negative log-likelihoodL(θ)=n=1Nlogp(ynxn,θ)L(\boldsymbol\theta) = -\sum_{n=1}^{N}\log p(y_n \mid \mathbf{x}_n, \boldsymbol\theta)
batch updateθi+1=θiγin=1N(Ln(θi))\boldsymbol\theta_{i+1} = \boldsymbol\theta_i - \gamma_i\sum_{n=1}^{N}\big(\nabla L_n(\boldsymbol\theta_i)\big)^\top
mini-batch estimateg^B=NBnB(Ln(θ))\hat{\mathbf{g}}_B = \dfrac{N}{\lvert B\rvert}\sum_{n\in B}\big(\nabla L_n(\boldsymbol\theta)\big)^\top

Equations 7.13, 7.14, 7.15. The only requirement is that the estimate be unbiased, E[g^B]=(L)\mathbb{E}[\hat{\mathbf{g}}_B] = (\nabla L)^\top — not that it be accurate.

batch size BB (of N=2000N = 2000)spread relative to L\lVert\nabla L\rVertbias over 3000 draws
112.3422.3424.8×1024.8\times10^{-2}
16160.6140.6147.9×1037.9\times10^{-3}
2562560.1410.1411.8×1031.8\times10^{-3}
200020000.000\mathbf{0.000}4.9×10144.9\times10^{-14}

Noise scales as 1BNBN1\dfrac{1}{\sqrt B}\sqrt{\dfrac{N-B}{N-1}} — the second factor is the finite-population correction, and it is why the noise hits exactly zero at B=NB = N.

whatequation
the problemminxf(x)\min_{\mathbf{x}} f(\mathbf{x}) s.t. gi(x)0g_i(\mathbf{x}) \leq 0 for all ii
indicator formJ(x)=f(x)+i1(gi(x))J(\mathbf{x}) = f(\mathbf{x}) + \sum_i \mathbf{1}(g_i(\mathbf{x})), with 1(z)=0\mathbf{1}(z) = 0 if z0z\leq 0 else \infty
the LagrangianL(x,λ)=f(x)+λg(x)L(\mathbf{x}, \boldsymbol\lambda) = f(\mathbf{x}) + \boldsymbol\lambda^\top\mathbf{g}(\mathbf{x}),  λ0\ \boldsymbol\lambda \geq 0
the dual functionD(λ)=minxL(x,λ)D(\boldsymbol\lambda) = \min_{\mathbf{x}} L(\mathbf{x}, \boldsymbol\lambda)
the dual problemmaxλ0D(λ)\max_{\boldsymbol\lambda\geq 0} D(\boldsymbol\lambda)
recovering JJJ(x)=maxλ0L(x,λ)J(\mathbf{x}) = \max_{\boldsymbol\lambda\geq 0} L(\mathbf{x}, \boldsymbol\lambda)
minimax inequalitymaxyminxϕminxmaxyϕ\max_{\mathbf{y}}\min_{\mathbf{x}}\phi \leq \min_{\mathbf{x}}\max_{\mathbf{y}}\phi
weak dualityminxmaxλ0Lmaxλ0minxL\min_{\mathbf{x}}\max_{\boldsymbol\lambda\geq 0} L \geq \max_{\boldsymbol\lambda\geq 0}\min_{\mathbf{x}} L, i.e. dpd^\star \leq p^\star
stationarityf(x)+Aλ=0\nabla f(\mathbf{x}^\star) + \mathbf{A}^\top\boldsymbol\lambda^\star = \mathbf{0}
complementary slacknessfor each ii: gi(x)=0g_i(\mathbf{x}^\star) = 0 or λi=0\lambda_i^\star = 0

Equations 7.17–7.28. DD is always concave, because it is a pointwise minimum of functions affine in λ\boldsymbol\lambda — however nonconvex ff and the gig_i are.

Equality constraints: replace hj=0h_j = 0 by hj0h_j \leq 0 and hj0-h_j \leq 0. The two non-negative multipliers enter only as a difference, so equality multipliers are unconstrained.

measuredvalue
minimax gap for ϕ=(xy)2\phi = (x-y)^2 on [0,1]2[0,1]^20.250=0.250.25 - 0 = \mathbf{0.25}, strict
Example 7.6 gap (convex)0.000e+000.000\text{e}{+}00
gap on minx48x2+x\min x^4 - 8x^2 + x s.t. x0x \geq 0 (nonconvex)1.984123\mathbf{1.984123}, dual optimum attained at the infeasible x=2x = -2
whatstatementequation
convex setθx+(1θ)yC\theta\mathbf{x} + (1-\theta)\mathbf{y} \in C for all θ[0,1]\theta \in [0,1]Def 7.2, Eq 7.29
convex functionf(θx+(1θ)y)θf(x)+(1θ)f(y)f(\theta\mathbf{x} + (1-\theta)\mathbf{y}) \leq \theta f(\mathbf{x}) + (1-\theta)f(\mathbf{y})Def 7.3, Eq 7.30
first orderf(y)f(x)+xf(x)(yx)f(\mathbf{y}) \geq f(\mathbf{x}) + \nabla_{\mathbf{x}}f(\mathbf{x})^\top(\mathbf{y}-\mathbf{x})Eq 7.31
second orderx2f(x)\nabla^2_{\mathbf{x}}f(\mathbf{x}) positive semidefinite
epigraph{(x,t):tf(x)}\{(\mathbf{x},t) : t \geq f(\mathbf{x})\} is a convex set iff ff is convex
concaveff concave iff f-f convex
the problemminf\min f s.t. gi0g_i \leq 0, hj=0h_j = 0, all convexEq 7.38

Equation 7.31 is the one that pays. Substitute f(x)=0\nabla f(\mathbf{x}) = \mathbf{0} and it reads f(y)f(x)f(\mathbf{y}) \geq f(\mathbf{x}) for every y\mathbf{y} — a stationary point of a convex function is global, in one line.

operationpreserves convexitymeasured on x2x^2 and exe^{-x} over [2,3][-2,3]
f1+f2f_1 + f_2yesmin f=+2.0498f'' = +2.0498, no chord violation
αf\alpha f, α0\alpha \geq 0yesscaling cannot flip an inequality
max(f1,f2)\max(f_1, f_2)yesmin f=+0.4951f'' = +0.4951, no chord violation
f1f2f_1 - f_2nomin f=5.3872f'' = -5.3872, violation 0.575350.57535
f1f2f_1 \cdot f_2nomin f=0.4120f'' = -0.4120, violation 0.280930.28093
ABA \cap B (sets)yes, any family
ABA \cup B, ABA \setminus B (sets)nocounterexample must be disjoint

Equation 7.30 is also called Jensen’s inequality; extended to a distribution it reads f(E[X])E[f(X)]f(\mathbb{E}[X]) \leq \mathbb{E}[f(X)].

f(x)=xlog2xf(x) = x\log_2 x, convex for x>0x>0, with x=log2x+1/loge2\nabla_x = \log_2 x + 1/\log_e 2 (Eq 7.32).

testleft sideright sideslack
chord at x=2,4x=2,4, θ=0.5\theta=0.5f(3)=4.754888f(3) = 4.754888550.2451120.245112
tangent at 22, read at 44f(4)=8f(4) = 86.8853906.8853901.1146101.114610
second derivative at 220.7213500.721350 measured1/(2ln2)=0.7213481/(2\ln 2) = 0.721348
whatequation
primalminxRdcx\min_{\mathbf{x}\in\mathbb{R}^d}\mathbf{c}^\top\mathbf{x} s.t. Axb\mathbf{A}\mathbf{x} \leq \mathbf{b}
LagrangianL=cx+λ(Axb)=(c+Aλ)xλbL = \mathbf{c}^\top\mathbf{x} + \boldsymbol\lambda^\top(\mathbf{A}\mathbf{x}-\mathbf{b}) = (\mathbf{c}+\mathbf{A}^\top\boldsymbol\lambda)^\top\mathbf{x} - \boldsymbol\lambda^\top\mathbf{b}
stationarityc+Aλ=0\mathbf{c} + \mathbf{A}^\top\boldsymbol\lambda = \mathbf{0}no x\mathbf{x} in it
dualmaxλRmbλ\max_{\boldsymbol\lambda\in\mathbb{R}^m} -\mathbf{b}^\top\boldsymbol\lambda s.t. c+Aλ=0\mathbf{c}+\mathbf{A}^\top\boldsymbol\lambda = \mathbf{0}, λ0\boldsymbol\lambda \geq 0

Equations 7.39–7.43. Primal: dd variables, mm constraints. Dual: mm variables, dd equality constraints. Solve whichever is smaller — a default, not a rule.

The optimum is always a vertex, and a vertex has exactly dd active constraints. The gradient of a linear objective is the constant c\mathbf{c}, so there is no stationary point and no gradient method applies.

Example 7.5 measured: five feasible vertices of ten intersections, objective from 74.16667-74.16667 to +7+7. x=(37/3,25/6)\mathbf{x}^\star = (37/3, 25/6), value 445/6-445/6, λ=(13/6,1/3,0,0,0)\boldsymbol\lambda^\star = (13/6, 1/3, 0, 0, 0), gap 1.4×10141.4\times10^{-14}. Rotating c\mathbf{c} through 360°360°: all five vertices win over contiguous arcs (26.5°26.5° to 116.7°116.7°) with exactly five switches — the answer jumps, it does not slide.

whatequation
primalminx12xQx+cx\min_{\mathbf{x}}\tfrac12\mathbf{x}^\top\mathbf{Q}\mathbf{x} + \mathbf{c}^\top\mathbf{x} s.t. Axb\mathbf{A}\mathbf{x} \leq \mathbf{b}, Q\mathbf{Q} positive definite
LagrangianL=12xQx+(c+Aλ)xλbL = \tfrac12\mathbf{x}^\top\mathbf{Q}\mathbf{x} + (\mathbf{c}+\mathbf{A}^\top\boldsymbol\lambda)^\top\mathbf{x} - \boldsymbol\lambda^\top\mathbf{b}
stationarityQx+(c+Aλ)=0\mathbf{Q}\mathbf{x} + (\mathbf{c}+\mathbf{A}^\top\boldsymbol\lambda) = \mathbf{0}x\mathbf{x} is present
solved for x\mathbf{x}x=Q1(c+Aλ)\mathbf{x} = -\mathbf{Q}^{-1}(\mathbf{c}+\mathbf{A}^\top\boldsymbol\lambda)
dual LagrangianD(λ)=12(c+Aλ)Q1(c+Aλ)λbD(\boldsymbol\lambda) = -\tfrac12(\mathbf{c}+\mathbf{A}^\top\boldsymbol\lambda)^\top\mathbf{Q}^{-1}(\mathbf{c}+\mathbf{A}^\top\boldsymbol\lambda) - \boldsymbol\lambda^\top\mathbf{b}
dualmaxλRmD(λ)\max_{\boldsymbol\lambda\in\mathbb{R}^m} D(\boldsymbol\lambda) s.t. λ0\boldsymbol\lambda \geq 0 — no equalities

Equations 7.45–7.52. The single difference from the LP is whether the stationarity condition contains x\mathbf{x}: if not it becomes a constraint on λ\boldsymbol\lambda (Eq 7.42), if so it substitutes back (Eq 7.50).

Example 7.6 measured: Q\mathbf{Q} eigenvalues 1.5857861.585786 and 4.4142144.414214; x=(1,12)\mathbf{x}^\star = (-1, -\tfrac12) with f=4.5f = -4.5 against an unconstrained 6.285714-6.285714, so the constraint costs 1.7857141.785714; λ=(0,2.5,0,0)\boldsymbol\lambda^\star = (0, 2.5, 0, 0); gap exactly zero. Equation 7.51 reproduces a direct evaluation of the Lagrangian to 1.8×10141.8\times10^{-14} over 20,00020{,}000 random λ\boldsymbol\lambda.

whatequation
Definition 7.4f(s)=supx(s,xf(x))f^*(\mathbf{s}) = \sup_{\mathbf{x}}\big(\langle\mathbf{s},\mathbf{x}\rangle - f(\mathbf{x})\big)
the line through a pointyf(x0)=s(xx0)y - f(x_0) = s(x - x_0)
minimum interceptinfx0(sx0+f(x0))\inf_{x_0}\big(-sx_0 + f(x_0)\big); the conjugate is its negative
differentiable casef(s):=sx0f(x0)f^*(s) := sx_0 - f(x_0) with s=xf(x0)s = \nabla_x f(x_0)
separable sumsL(t)=ii(ti)L(z)=ii(zi)L(\mathbf{t}) = \sum_i \ell_i(t_i) \Rightarrow L^*(\mathbf{z}) = \sum_i \ell_i^*(z_i)
Example 7.9minxf(Ax)+g(x)=maxuf(u)g(Au)\min_{\mathbf{x}} f(\mathbf{A}\mathbf{x}) + g(\mathbf{x}) = \max_{\mathbf{u}} -f^*(\mathbf{u}) - g^*(-\mathbf{A}^\top\mathbf{u})

Equations 7.53–7.68. The transform acts on the function, not on x\mathbf{x} or f(x)f(\mathbf{x}). It needs neither convexity nor differentiability; convexity is what makes it invertible.

The slopes swap: if the slope of ff at xx is ss, the slope of ff^* at ss is xx.

ffff^*domain of ff^*
x2x^2s2/4s^2/4all of R\mathbb{R}
12xAx+bx+c\tfrac12\mathbf{x}^\top\mathbf{A}\mathbf{x} + \mathbf{b}^\top\mathbf{x} + c12(sb)A1(sb)c\tfrac12(\mathbf{s}-\mathbf{b})^\top\mathbf{A}^{-1}(\mathbf{s}-\mathbf{b}) - call of RD\mathbb{R}^D
λ2yK1y\tfrac{\lambda}{2}\mathbf{y}^\top\mathbf{K}^{-1}\mathbf{y}12λαKα\tfrac{1}{2\lambda}\boldsymbol\alpha^\top\mathbf{K}\boldsymbol\alphaall of Rn\mathbb{R}^n
dxdlogxd\sum_d x_d\log x_ddesd1\sum_d e^{\,s_d - 1}all of RD\mathbb{R}^D
x\lvert x\rvert00[1,1][-1,1] only
max{0,1α}\max\{0, 1-\alpha\}β\beta[1,0][-1,0] only

A kink in the primal becomes a domain boundary in the dual.

f=ff^{**} = f when ff is convex; otherwise ff^{**} is the convex envelope. Measured on x43x2x^4 - 3x^2: ff^{**} is flat at 2.25-2.25 across [1.224745,1.224745][-1.224745, 1.224745] and is 2.252.25 below ff at the origin.

This is the Lagrangian duality gap seen from the other side. DD is always concave, so it can only represent a convex envelope; whatever the envelope flattens, the gap loses. Convex problems have zero gap because there is nothing to flatten.

h(α)={0α1(1α)22γ1γα11αγ2α1γh^*(\alpha) = \begin{cases} 0 & \alpha \geq 1\\[3pt] \dfrac{(1-\alpha)^2}{2\gamma} & 1-\gamma \leq \alpha \leq 1\\[5pt] 1 - \alpha - \dfrac\gamma2 & \alpha \leq 1-\gamma\end{cases}

Differentiable at both joins (measured slope jump 8.3×1088.3\times10^{-8}) and exactly γ/2\gamma/2 below the hinge on the linear branch — a measured 0.3000000.300000 at γ=0.6\gamma = 0.6. Smoothing is never free.

weakness of gradient descentremedyreference
first-order, ignores curvatureacceleration methodsNesterov (2018)
long valleysconjugate gradientsShewchuk (1994)
Newton, using the HessianGoh (2017); Bottou et al. (2018)
Hessian too expensivequasi-Newton, L-BFGSNocedal and Wright (2006)
Euclidean geometry is wrongmirror descent, natural gradientBeck and Teboulle (2003); Toussaint (2012)
kinks, non-differentiabilitysubgradient methodsShor (1985); Bertsekas (1999)
datasets too large for batchstochastic gradient descentHazan (2015); Bottou et al. (2018)
duality and convexityBoyd and Vandenberghe (2004); Bertsekas (2009)
convex analysis foundationsRockafellar (1970); Hiriart-Urruty and Lemaréchal (2001)
  • Equation 7.6 is the whole of unconstrained optimisation in this book: x minus gamma times the gradient, transposed. Everything else in Chapter 7 repairs it or constrains it.
  • Two numbers govern a quadratic: mu and L. The ceiling is 2 over L, the fastest step is 2 over (mu plus L), and the rate is (kappa minus 1) over (kappa plus 1). On Example 7.1 those are 0.099724, 0.090909 and 0.823217.
  • Iterations against step size form a U. 104 at the optimum, 39113 at 0.0997, divergence from 0.0998. And a step just past the ceiling can improve for 24 iterations before turning — check the growth factor, not the first few steps.
  • Momentum changes the exponent, not the constant. O(kappa) becomes O(root kappa), measured 2.69 times faster at kappa 10 and 71.36 times at kappa ten thousand. Its step size 0.115976 is 16.3 percent ABOVE the plain ceiling, and at that step size too LITTLE momentum diverges.
  • SGD needs unbiased, not accurate. At batch size one the typical gradient error is 2.34 times the norm of the true gradient. Keep the N over batch-size factor, or the effective learning rate silently tracks the batch size.
  • Mini-batch noise falls as one over root B times root of (N minus B) over (N minus 1). The second factor is why the noise is exactly zero at a full batch.
  • Equation 7.18 is right and useless; Equation 7.20 replaces the infinite wall with a linear slope. For non-negative multipliers the Lagrangian is a lower bound at any feasible point, and its maximum over the multipliers rebuilds the indicator.
  • Weak duality always holds and D is always concave, however nonconvex the primal — because D is a pointwise minimum of functions affine in lambda. That is duality’s structural payoff; tightness is a separate question.
  • The gradient does not vanish at a constrained optimum. The condition is grad f plus A-transpose lambda equals zero: flat where you are free, pushed where you are pinned. Complementary slackness says a slack constraint has zero price.
  • Equality multipliers are unconstrained, because splitting an equality into two inequalities makes their two non-negative multipliers enter only as a difference.
  • Convexity means every chord stays above the curve, its epigraph is a convex set, its tangent is a global lower bound, and its Hessian is positive semidefinite. Any one of those implies the others.
  • Sampling can disprove convexity and never prove it. A function failing on under 3 percent of its domain by 1e-4 passes 99.7 percent of random chord tests, at any sample size.
  • Only non-negative weighted sums and maxima are safe. Difference and product both broke convexity on x squared and exp of minus x. Intersection of sets is safe for any family; union and difference need disjoint counterexamples.
  • One recipe for both duals: write the Lagrangian, collect the x terms, set the x-derivative to zero. If that condition has no x it is a CONSTRAINT and the dual is an LP; if it has x it SUBSTITUTES and the dual is a concave quadratic.
  • An LP optimum is always a vertex with exactly d active constraints, because a linear objective has a constant nonzero gradient and therefore no stationary point. Rotating the objective makes the answer jump between corners.
  • Definition 7.4 re-indexes a function by SLOPE instead of position, recording the negated intercept of each supporting line. The slopes swap: the derivative of f-star at s is the x that achieved the supremum.
  • f-star-star is f for convex functions and the convex envelope otherwise, and that lost envelope IS the Lagrangian duality gap. The chapter’s two duality sections are one idea.
  • A kink in the primal becomes a domain boundary in the dual. The hinge’s conjugate is finite only on a box, and smoothing it by a proximal round trip costs exactly gamma over two in uniform accuracy.

Next: Chapter 8 turns these methods on real data — empirical risk, model selection, and the gap between fitting and generalising.

pch.coffeeTagline

pch.coffeeCta

pch.feedbackHeading

pch.feedbackSubheading