AI Basic

Gradient Descent 수식적 계산(Linear Regression, Logistic Regression)

2로 접어듦 2023. 3. 7. 09:25

Gradient Descent란

경사 하강법을 의미하며, 딥러닝에서 regression/classification을 수행할 때 target과 예측된 값 사이의 loss function을 최소화하기 위해서 사용되는 개념으로, 함수의 기울기가 0이되는 지점을 구하는 데 사용되는 방법이다(변수들에 대한 편미분을 한다)

기울기가 0이 되는 지점이 무조건 최소 지점이냐? 라는 질문에 대답하는 것은 조금 다른 문제이지만(함수의 초기값 설정 및 추가 방법이 필요하기도 함), 궁극적으로 loss function을 최소화하여 성능을 올리는 데에 핵심적인 방법이다.

 

수치해석처럼 Gradient Descent 계산하기

미분의 원리를 이용해서 h를 아주 작은 수로 설정해둔 뒤, 반복한다 until 미분지점이 0이 되는 곳까지.

 

 

Linear Regression 에서의 수식적 Gradient Descent 계산하기

 

단항식 선형회귀는 간단히 y = ax + b 와 같은 형태로 나타낼 수 있다. 이 때 우리는 a 와 b를 맞추고 싶은 것이다(선형회귀란 그런 것)

랜덤 값 x 들에 대한 정답 값 y 와, 예측 값 y_hat을 계산해둔 뒤, y 와 y_hat의 loss(l1 loss or l2 loss)를 계산한다.

update를 하면 시퀀스 끝.

 

출처: 본인. L2 Loss 기준.

 

Polynomial Regression에서 수식적 Gradient Descent 계산하기

단항식에서 다항식으로의 변화는 행렬을 도입하면 비슷하게 계산할 수 있다.

행렬에서의 미분은 열 단위의 계산이 이루어져, 결과적으로는 n으로 나누는 연산이 필요 없어지고, 단항식과 비슷한 형태의 gradient 계산이 가능해진다.

 

출처: 본인

 

Logistic Regression에서의 수식적 Gradient Descent 계산하기

로지스틱 회귀 또한 별 차이가 없다. Loss function의 정의만 바뀌었을 뿐이므로, gradient를 계산 하는 것은 편미분을 취하는 것으로 동일하다.

출처: 본인

 

참고

파이썬에서 수식을 풀기 위해 import sympy를 사용하게 될 것이다.

이 때, sympy.poly ... 등을 통해 세운 수식에서 sympy.subs를 통해 변수에 값을 대입한 뒤 얻어지는 결과는 겉으로 보았을 때 float형태이지만, type은 sympy.core.numbers.Float 이다. 일반적인 float64, float32와는 달리 array-like로 인식되지 않아, numpy 연산에 사용할 수 없음에 주의하자.

 

관련 에러 메세지:

TypeError: loop of ufunc does not support argument 0 of type Float which has no callable sqrt method.

sympy.core.numbers.Float 형태의 값은 np.sqrt에서 연산할 수 없다..

 

 

수식 이미지 출처: http://www.sciweavers.org/free-online-latex-equation-editor

참고 사이트

1. https://numpy.org/doc/stable/reference/generated/numpy.linalg.norm.html

2. https://docs.sympy.org/latest/modules/core.html#