본문 바로가기

기타/리뷰 및 경험담 - p stage

[AI Math] 경사하강법

미분

미분은 기울기이다. 신기하게도 x값에 미분값을 더하여 이동하면 f(x)값은 증가하고 미분값을 빼면 f(x)값은 감소한다.

f'(x)가 음수 라면 아래 그림처럼 x는 왼쪽으로 이동하므로 f(x+f'(x)) > f(x)가 된다. (반대로 f'(x)값을 빼면 오른쪽으로 감소소하는 방향으로 간다.)

f'(x)가 양수라면 우상향 그래프가 될테고 f'(x)만큼 오른쪽으로 이동하니 f(x+f'(x)) > f(x)가 성립한다. 

미분 더하기 : f(x+f'(x)) >> 값 증가 (미분 더하기)

미분 빼기 : f(x-f'(x)) >> 값 감소

 

극소값 / 극대값 구하기 및 경사하강법

위 성질을 이용해서 f(x+f'(x))를 계속 하거나 f(x-f'(x))를 계속 할 경우 f'(x)=0이되는 극소, 극대점에서 결국 정지하게된다.

이를 이용해 코드로 작성하면 아래와 같다.

여기서 abs(grad)는 f'(x)값의 절대 값으로 원래는 이게 0일 때 정지해야하다 컴퓨터로 계산 할 때 정확히 0이되기 불가능하므로 eps를 설정하여 eps보다 기울기가 작을 경우 극점으로 해석하여 정지한다.

grad 는 f'(x)이고 var = var = lr * grad 는 x - lr*f'(x)이다. lr 을 통해 학습속도를 조절 할 수 있다.

 

변수가 벡터일 경우

변수가 벡터일 경우 각 변수 별로 편미분을 해준 그레디언트 벡터 를 이용한다. (각 변수별 기울기들의 벡터 같은 느낌이다)

ex) f(x, y) = x^2 +2y^2(x^2, 2y^2)벡터로 표현하고 이를 편미분하면 (2x, 4y) 벡터가된다. 

그레디언트 벡터는 아래 그림의 검은 화살표다.

 

 

이를 코드로 표현 할 때 그레디언트 벡터가 grad가 된다. 하지만 그레디언트 벡터의 절대값을 이용하지 않고 norm을 사용하여 벡터의 길이를 통해 종료조건을 설정한다. (결국 비슷한 의미인거 같다.)

 

경사하강법으로 선형회귀 계수 β 구하기

Xβ와 Y들의 L2노름이 최소화하는 β를 찾아야된다. 앞에서는 무어 펜로즈를 이용했지만 여기선 경사하강법을 이용한다.

윗줄의 밑줄친 부분을 표현하면 Y - Xβ의 L2노름의 최소 값이다.

Y-Xβ L2노름
Y-Xβ L2노름의 그레디언트이고 이를 편미분해주려는 모습
그레디언트 벡터의 k번째 항
정리된 그레디언트 벡터의 k번째 항

식들을 정리하면 위와 같이된다. XT는 X의 전치 행렬이다.

따라서 코드로 구현 할때 X를 전치 시키는 transpose(X)를 이용한다.

||Y-Xβ||2 를 최소화 하는 β이므로 gradient를 빼줘야된다.

gradient는 위 그림들을 통해서 XT * (y-Xβ) 즉 transpose(x) @ error로 표현한다.

경사 하강법은 만능일까

이론적으로 경사하강법은 미분 가능하고 볼록한 함수에 대해선 수렴이 보장된다.ㅜ

하지만 비선형회귀의 문제의 경우 목적식이 볼록하지 않을 수 있다.

 

확률적 경사하강법

데이터중 한개 또는 일부만을 이용하여 업데이트한다. 볼록이 아닌 목적식도 SGD를 통해 최적화할 수 있다.

위의 밑줄친 부분은 즉 미니 배치를 이용하여 그레디언트 벡터를 계산하는것이다. 이로 인해 다소 부정확 할 수 있지만 계산 속도가 훨씬 빠르다. 따라서 같은 시간에 더 많은 step을 나아갈 수 있다.