<미분>
미분은 변수의 움직임에 따른 함숫값의 변화를 측정하기 위한 도구이다. 최적화에서 제일 많이 사용되는 기법이다.
미분을 통해서 주어진 점에서의 접선의 기울기를 구할 수 있다.
한 점에서 접선의 기울기를 알면 어떤 방향으로 이동해야 값이 증감하는지 알 수 있다.
한 점에서 미분 값을 더하면 경사 상승법이 된다. 이는 함수의 극대 값을 찾는 것에 이용된다.
한 점에서 미분 값을 빼면 경사 하강법이 된다. 이는 함수의 극소값의 위치를 찾는 것에 이용된다.
극값에서는 미분 값이 0이 되므로 더 이상 process가 진행되지 않는다.
경사 하강법 알고리즘)
위에서 eps란 종료 조건이 된다. 컴퓨터에서 미분 값이 정확히 0이 되는 것은 불가능하기 때문에 0에 근사한 혹은 특정 종료 조건을 설정해줘야 한다.
lr은 학습률을 의미하며 미분을 통해 업데이트하는 속도를 조절한다.
grad = gradient(var)을 통해서 종료 조건이 성립하기 전까지 미분 값을 계속 업데이트한다.
변수가 벡터일 경우 편미분을 해주고 편미분을 통해서 나온 결괏값을 그레디언트 벡터로 이용하여 경사 하강/상승에 적용 가능하다.
편미분이란 2x^2 + 3y^3 + 6 이 있을 때 각각 x에 대한 미분, y에 대한 미분을 해주는 것이다.
이때 다른 변수들은 상수 취급해주는 것이다.
4x, 9y^2 이렇게 나온다.
위 등고선 그림을 보면 가로축은 x, 세로축은 y이고 실제로는 z축도 하나 존재한다.
실제 범위 내에 있는 x와 y에 2를 대입해보면 4+8=12로 주어진 등고선의 최대치와 비슷하다.
이를 통해 높이에 따라서 식의 증감 추세를 볼 수 있고 극값이 0이 되는 부분 역시 동일하게 경사 하강법 또는 경사 상승법으로 구할 수 있다.
<선형회귀분석>
해당 그림에서 초록색 '선'을 볼 수 있다. 데이터 표본에서 해당 선을 보면 몸무게를 바탕으로 키를 유추할 수 있고, 그 역도 가능할 것이다.
머신러닝의 근본적인 목적은 실제 데이터를 바탕으로 예측값을 내는 것에 있다. 위의 방법이 아주 기초적인 방식이라고 볼 수 있다.
그러나 이러한 선형 회귀에는 필연적으로 오차가 생긴다.
이러한 방식으로 오차가 생기기 때문에 반영되는 모든 손실에 제곱을 곱해준다. 이를 평균 제곱 오차(Mean Squared Error)라고 한다.
제곱 없이 오차를 구하는 방법은 평균 절대 오차(Mean Absolute Error) 위를 절충한 후버 손실 등이 존재한다.
선형 회귀에서 알고 넘어가야 할 것은 데이터로부터 발생하는 오차의 평균을 최소화 할 수 있는 최적의 기울기와 절편을 찾는 것이다.
근데 선형회귀에서 해당 오차 즉 손실을 함수로 표현하면 아래와 모양이 같다.
따라서 우리는 경사 하강법을 통해서 극값에 도달해 오차의 크기를 최대한 줄여야 한다.
선형 회귀 분석을 반복하다 보면 특정값에 수렴하게 된다.
보는 것처럼 1000번이 넘어가면 그 이후로는 더 이상 큰 의미를 갖지 못한다. 즉 47에 수렴한다고 볼 수 있다.
우리가 특정값에 수렴시키기 위해서 신경 써줘야 하는 것은 학습률이다.
위 그림은 학습률을 너무 크게 설정하여 최적의 값을 제대로 찾지 못한다.
반대로 학습률을 너무 작게 설정하면 최적의 값으로 수렴할 때까지 너무 오랜 시간이 걸린다.
따라서 최적의 학습률을 찾아야 한다.
선형 회귀식을 찾는 것은 numpy의 linalg.pinv를 이용해서 찾을 수 있다.
경사 하강법은 이론적으로 미분 가능하고 convex(볼록)한 함수에 대해선 적절한 학습률과 학습 횟수에 기반해서 수렴이 보장된다.
그러나 비선형 회귀 문제의 경우 수렴이 항상 보장되지는 않는다. 목적 식이 convex하지 않기 때문이다.
이러한 경우 확률적 경사 하강법이 도입된다.
<확률적 경사 하강법>
모든 데이터를 사용하는 것이 아닌 한 개의 데이터 또는 일부를 활용하여 업데이트한다.
연산 자원을 좀 더 효율적으로 사용 가능하다.
'AI & Data Science' 카테고리의 다른 글
BoostCourse AI Pre-Course) 딥러닝의 학습방법 이해하기 (0) | 2022.08.02 |
---|---|
BoostCourse AI Pre-Course) Pandas (0) | 2022.07.29 |
BoostCourse AI Pre-Course) 기초 수학(numpy,벡터,행렬) (0) | 2022.07.26 |
BoostCourse AI Pre-Course) Python Data Handling (0) | 2022.07.25 |
BoostCourse AI Pre-Course) Python Module and Project (0) | 2022.07.24 |