10.6 비볼록 최적화와 손실 지형

실습 · 연습문제 2개

선형 보간 경로의 손실 장벽 interpolation-barrier

학습된 두 해 θa\theta_a, θb\theta_b를 잇는 선분 θ(t)=(1−t) θa+t θb\theta(t) = (1 - t)\,\theta_a + t\,\theta_b 위에서 손실을 재면, 두 해 사이를 손실이 높아지지 않고 곧장 갈 수 있는지 알 수 있다. 경로 위 최대 손실이 양 끝보다 얼마나 높은지를 장벽(barrier)이라 한다.

barrier=max⁡t∈[0,1]L(θ(t))−max⁡(L(θa), L(θb)).\text{barrier} = \max_{t \in [0, 1]} L(\theta(t)) - \max\big(L(\theta_a),\ L(\theta_b)\big).

함수 interpolation_barrier(loss, a, b, num=21)를 완성한다. 0부터 1까지 균등 간격 num개의 tt에서 손실을 계산해 (ts, losses, barrier)를 반환한다. 장벽은 격자 위의 최댓값으로 근사한다.

테스트는 다음을 확인한다.

  • 반환값의 shape과 양 끝의 손실
  • 볼록 함수에서는 장벽이 0이다(현이 그래프 위에 있다는 10.1장의 정의)
  • 이중 우물 (x2−1)2(x^2 - 1)^2의 두 최솟점 사이 장벽은 1이다
  • 장벽은 경로 최대에서 양 끝 중 큰 값을 뺀 것이다

Hessian-vector product로 최대 고윳값 추정하기 top-hessian-eigenvalue

파라미터가 많은 모델에서는 Hessian H\mathbf{H}를 만들 수 없지만, Hessian-vector product v↦Hv\mathbf{v} \mapsto \mathbf{H}\mathbf{v}는 계산할 수 있다(8.4장). 이것만으로 power iteration을 돌려 절댓값이 가장 큰 고윳값을 추정한다.

vk+1=Hvk∥Hvk∥,λk=vk⊤Hvk(∥vk∥=1).\mathbf{v}_{k+1} = \frac{\mathbf{H}\mathbf{v}_k}{\lVert \mathbf{H}\mathbf{v}_k \rVert}, \qquad \lambda_k = \mathbf{v}_k^\top\mathbf{H}\mathbf{v}_k \quad (\lVert \mathbf{v}_k \rVert = 1).

함수 top_hessian_eigenvalue(hvp, n, iters=100, seed=0)를 완성한다. hvp는 길이 n인 벡터를 받아 Hv\mathbf{H}\mathbf{v}를 반환한다. 시드 seed의 정규분포 난수 벡터에서 시작해 iters번 반복하고 (lam, v)를 반환한다. lam은 부호를 포함한 고윳값 추정(Rayleigh 몫), v는 단위 고유벡터다.

테스트는 다음을 확인한다.

  • 대각 행렬과 무작위 양의 준정부호 행렬에서 최대 고윳값, 그리고 Hv=λv\mathbf{H}\mathbf{v} = \lambda\mathbf{v}
  • 절댓값이 가장 큰 고윳값이 음수이면(안장점 근처) 음수를 반환한다
  • hvp에는 길이 n인 벡터만 넘긴다(행렬을 만들지 않는다)

참고: power iteration이 찾는 것은 절댓값이 가장 큰 고윳값이다. 손실 지형의 최대 양의 고윳값(sharpness)을 원하는데 이 값이 음수로 나오면, H−λI\mathbf{H} - \lambda\mathbf{I}에 대해 한 번 더 돌리는 식의 보정이 필요하다.