1. Machine Learning
목표? 주어진 데이터를 가장 잘 설명하는 함수 y=f(x)를 찾는 것
step 1: Choosing a model
여러 종류의 모델 중에서 하나를 선택 $f(x_{1},x_{2},…; w_{1},w_{2},…)$
여기서 여러 종류의 모델은 logistic regression, support vector machine, random forest, nearest neighbor 등을 말한다.
step 2: Optimizing parameter
함수가 주어진 데이터에 가장 잘 부합하도록 w를 조정 (함수 모양은 $w_{1},w_{2},…$가 결정함)
step 3: Prediction
결정된 f를 이용해 새로운 x에 대한 y값을 예측
가장 잘 설명하는? 실제값(그림에서 빨간점)과 예측값(함수위의 점) 간의 차이를 최소화
E를 각 $w_{i}$들에 대한 편미분을 0으로 만드는 $w_{i}$값을 찾으면 오류를 최소화 할 수 있다.
하지만 위 식을 만족하는 값을 찾는 것은 어렵다. 우리가 실제로 마주하는 함수들은 형태가 복잡해 미분값을 계산하기 어려운 경우가 많고, 실제 미분값을 구하는 과정을 컴퓨터로 구현하는 것은 어렵기 때문이다. 이를 optimization problem이라고 한다. 따라서 꿩 대신 닭으로 E를 최소화스럽게(?) 만드는 $w_{i}$들을 찾는 문제로 바꾸어 문제를 해결한다. 즉, global optimum에서 local optimum을 찾는 문제로 바꾸는 것이다. Local minimum을 찾을 때는 Gradient Descent 방법을 사용하면 이다.
파란색 점이 정답(global optimum)이지만 빨간색 점(local optimum)에 해당하는 $x$ 값을 찾아도 정답으로 인정을 해주겠다는 말로 이해하면 된다. 여기서 local optimum이 진짜 정답이 아닌데 괜찮은가라는 의문을 품을 수 있는데, 다른 방법이 없기 때문에 어쩔 수 없을 뿐더러 퀄리티 관점에서 볼 때 local optimum을 찾아도 크게 문제 없다.
2. Gradient Descent Method (경사하강법)
Gradient란? Gradient는 공간에 대한 기울기 벡터이다.
Gradient vector는 각 parameter에 대한 기울기 벡터를 합한 것이라고 생각하면 된다. 즉, 가장 가파른 방향을 가르킨다.
Gradient descent는 함수의 기울기를 이용해 $x$를 어디로 옮겼을 때 함수가 최솟값을 가지는지 알아보는 방법이다. 실제 사용되는 함수들은 거의 미분가능하기 때문에 GD는 범용적으로 사용될 수 있다.
step 1: Random point selection
임의의 시작점을 랜덤하게 잡는다.
step 2: Calculate the gradient
현재의 위치에서 gradient(기울기)를 구한다.
step 3: Move the reverse direction of the gradient
gradient의 반대 방향으로 매우 조금 이동한다.
반대 방향으로 이동하는 이유? 기울기가 양수라면 $x$값이 커질수록 함수 값이 커진다는 것이고, 기울기가 음수라면 $x$값이 커질수록 함수값이 작아진다는 것이므로 최솟값을 찾기 위해서는 기울기의 반대 방향으로 $x$를 이동해야 한다.
-
기울기 음수 -> 오른쪽으로 이동
-
기울기 양수 -> 왼쪽으로 이동
또한, 기울기가 크다는 것은 가파르다는 것이고 $x$값이 최솟값에 해당되는 $x$좌표로부터 멀리 떨어져있다는 것을 의미한다.
step 4: Move until the gradient of $E(w)$ is zero
기울기가 0인 곳에 도달할 때까지 이동을 반복한다.
여기서 $@eta$는 학습률, learning rate이다. Learning rate를 너무 크게 잡으면 건너편으로 점프하여 local minimum을 찾는 데 시간이 오래 걸리 수 있기 때문에 적절한 값을 잘 설정해야 한다.
정리하면, gradient descent는 초기 랜덤값에서 시작하여 기울기가 0인 곳에 도달할 때 까지 $x$값을 이동하는 것이라고 할 수 있다. $t$는 반복횟수이다.
위 그림은 변수가 한개인 경우이고, 다차원인 경우에는 각 변수에 대해 gradient descent를 진행하면 된다.