[딥러닝수학] 최적화(2)

Deok Jong Moon·2022년 1월 13일
0
post-thumbnail

book title : 머신러닝, 딥러닝에 필요한 기초 수학 with 파이썬
pages : 227 ~ 241
key concepts :

  • 행렬의 형식(form of a matrix)

    • 양정행렬(positive definite)
      : x.TAx 하면 어떤 x여도 양수를 반환하는 행렬 A
    • 음정행렬(negative definite)
      : x.TAx 하면 어떤 x여도 음수를 반환하는 행렬 A
  • 최적성 조건

    • 함수값의 지역 최소를 위한 1계 필요조건
    • 2계 충분조건
    • 그리고 행렬의 형식을 이용해서 구한 값이 최적해가 맞는지를 확인한다.
    • 아래의 예시 확인
  • 최적해 산출 예시
    0) 어떤 다변수 함수가 있으면,
    1) 그 함수의 경사도벡터(c)를 편미분해서 구한다.
    2) 그 경사도벡터를 또 편미분해서 헤시안행렬(Hf)을 구한다.
    3) 이때 지역최소가 되려면 경사도벡터(c)는 0이 되어야 한다.(1계 필요조건)
    4) 그리고 c=0 방정식의 해가 되는 다변수(x, y)를 헤시안행렬(Hf)에 넣어서 그곳에서의 행렬의 실제값을 확인한다.
    5) 양정행렬이면 최적성 조건이 성립되어서 그 지역에서의 최소가 된다.(2계 충분조건)
    6) 이때 양정행렬임을 판단하는 방법은 행렬의 고윳값(eigen value)가 모두 양수인지 검사하는 것
    7) 찾아봐서 맞으면 이렇게 나온 (x, y)의 값은 최적해이다.

import sympy as sp

x = sp.Symbol('x')
y = sp.Symbol('y')

f = 50*(y-x**2)**2 + (2-x)**2 # 다변수 함수

c = sp.derive_by_array(f, (x, y)) # 경사도벡터를 구하는 식
Hf = sp.derive_by_array(c, (x, y)) # 경사도벡터를 또 편미분해서 헤시안 행렬을 구하는 식

first_ncs_sol = sp.solve(c) # 경사도벡터의 해 확인(x:2, y:4 나옴)
first_ncs_sol >>> 반환 값 [{x: 2, y: 4}]

H = Hf.subs({x:first_ncs_sol[0][x], y:first_ncs_sol[0][y]}) # 편미분계수로 이루어진 헤시안행렬에 x, y값 넣기

import numpy as np # 고윳값 찾기 위해 Numpy 사용

H = np.array(H).astype(np.float64).reshape(2,2) # H를 넘파이 행렬로 변환 
lamda, _ = np.linalg.eig(H) # 고윳값 산출, _는 고윳값 벡터


lamda
>>> array([1.70188248e+03, 1.17516927e-01])
# 둘 다 양수이므로 (2, 4)는 최적해임이 확정됨
  • 결국 이 모든 개념들은 경사하강법(Gradient Descent)에 쓰이는 수학적 방법과 개념이다.
    • 어떤 목적함수를 최소하시키는 최적해를 구할 때
    • 경사도벡터의 반대방향은 함수가 가장 빠르게 감소하는 방향
      • 이 때 사용된 게 초접평면에 수직인 경사도벡터의 성질
profile
'어떻게든 자야겠어'라는 저 아이를 닮고 싶습니다

0개의 댓글