미분과 경사상승/하강법, 그래디언트 벡터에 관한 내용이었다.
dimension이 3이 넘어가는 순간부터는 이해하기가 너무 힘든 것 같다..
순한맛이 너무 매웠다. 강의를 두 번씩 돌려보면서 복습했다.
# 파이썬 sympy를 사용해서 미분을 구할 수 있다.
import sympy as sym
from sympy.abc import x
sym.diff(sym.poly(x**2 + 2 * x + 3), x)
def func(val):
fun = sym.ply(x ** 2 + 2 * x + 3)
return fun.subs(x, val), fun
def func_gradient(fun, val):
_, function = fun(val)
diff = sum.diff(function, x)
return diff.subs(x, val), diff
def gradient_descent(fun, init_point, lr_rate=13-2, epsilon=1e-5):
cnt = 0
val = init_point
diff, _ = func_gradient(fun, init_point)
while np.abs(diff) > epsilon:
val = val - lr_rate * diff
diff, _ = func_gradient(fun, val)
cnt += 1
print(f"함수 : {fun(val)[1]}, 연산횟수: {cnt}, 최소점 : ({val}, {fun(val)[0]})")
gradient_descent(func=func, init_point=np.random.uniform(-2,2))
복잡한 식이 많이 나왔지만, 머리로 이해만 하고 넘어가면 될 것 같다.
오랜만에 수학 공부를 해서 힘들지만 어떻게든 머리에 집어넣고 있다.
누구에게나 어려울 것이다. 열심히 공부하면 다 내 것이 될 것이다.
# Input: X, y, lr, T, Output: beta
# norm: L2-노름을 계산하는 함수
# lr: 학습률, T: 학습횟수
for t in range(T): # 종료 조건은 일정 학습횟수이다.
error = y - X @ beta # y-Xβ와 동일한 식
grad = -X.T @ error # 그레디언트 벡터를 구함
beta = beta - lr * grad # 위를 활용해서 β를 업데이트함.
5/5 Solve
Q)
A) x로 미분 -> 9
Q) 미분이 가능한 함수 f에 대해, 주어진 점 (x, f(x))에서의 접선의 기울기가 음수라면, x 를 증가시키면 함수값 f(x)이 증가한다.
A) 아니오 (감소한다.)
Q) 다음 보기 중 함수의 극소값의 위치를 구할 때 사용하는 방법을 고르시오.
✔️경사하강법
경사상승법
오일러 급수
SVM
TSP
Q) 경사하강법을 사용하여 구한 함수의 극소값의 위치는 해당 함수의 최소값의 위치가 아닐 수 있다.
A) 예 (최소값과 극소값은 다르다.)
Q) 다음 보기 중 f(x, y, z)의 올바른 그래디언트 벡터를 고르시오.
f(x, y, z) = 9x² + 5y³ - 3z
1. -(18x, 15y², -3)
2. -(9, 5, -3)
✔️3. (18x, 15y², -3)
4. (9, 5, -3)
5. -(18x, 15y, -3)
(x로 미분, y로 미분, z로 미분)