해당 포스팅은 네이버 부스트캠프 AI Tech 학습 정리 자료임을 알려드립니다.
1. 강의 정리
임성빈 교수님 - 경사하강법(순한맛)
1) 미분
미분(differentiation)은 변수의 움직임에 따른 함수값의 변화를 측정하기 위한 도구로 최적화에서 제일 많이 사용하는 기법입니다. 파이썬에서는 sympy.diff를 이용해서 미분을 구할 수 있습니다. 미분은 함수 $f$의 주어진 점 $(x, f(x))$에서의 접선의 기울기를 구하는 방법입니다. 이것을 알면 어느 방향으로 점을 움직여야 함수값이 증가/감소하는지를 알 수 있습니다. 증가시키고 싶다면 $x$값에 미분값을 더하고, 감소시키고 싶으면 $x$값에서 미분값을 뺍니다. 미분값을 더하면 경사상승법(gradient ascent)이라고 하며 함수의 극대값의 위치를 구할 때 사용합니다. 미분값을 빼주면 경사하강법(gradient descent)이라고 하며 함수의 극소값의 위치를 구할 때 사용합니다. 둘 다 극값에 도달하면 미분값이 0이 되기 때문에 움직임을 멈추게 됩니다.
2) 경사하강법 : 알고리즘
var = init # 시작점
grad = gradient(var) # 미분을 계산하는 함수
while(abs(grad) > eps): #벡터는 절대값 대신 norm을 계산해서 종료조건 설정
var = var - lr * grad
grad = gradient(var)
컴퓨터로 계산할 때 미분이 정확히 0이 되는 것은 불가능하므로 eps 보다 작을 때 종료하는 조건이 필요합니다. 경사하강법에서는 업데이트를 속도를 조절하기 위한 learning rate(학습률)가 있습니다. 학습률은 값을 잘못 설정하게 되면 발산할 수도 있기 때문에 조심하게 다뤄야 합니다.
만약, 변수가 벡터인 경우에는 어떻게 할까요? 벡터가 입력인 다변수 함수의 경우 편미분(partial differentiation)을 사용합니다. 각 변수 별로 편미분을 계산한 그레디언트(gradient) 벡터를 이용하여 경사하강/경사상승법에 사용할 수 있습니다. 이 그레디언트 벡터는 가장 빨리 감소/증가하게 되는 방향으로 향하게 됩니다.
임성빈 교수님 - 경사하강법(매운맛)
1) 경사하강법 - 선형회귀분석
선형회귀분석에서는 무어펠로즈 역행렬을 사용하면 쉽게 구할 수 있습니다. 하지만, 이번 시간에는 경사하강법으로 구해보고자 합니다. 무어펠로즈 역행렬로도 충분히 구할 수 있는데 굳이 경사하강법으로 구해야하는가? 경사하강법은 좀 더 일반적인 경우에서도 적용이 가능하기 때문입니다. 특히, 선형이 아닌 경우에도 적용이 가능하므로 경사하강법을 적용해보는 것이 더 좋습니다. 경사하강법으로 선형회귀 계수를 구하기 위해서는 선형회귀의 목적식을 최소화하는 $\beta$를 찾아야 합니다. 아래의 코드를 활용해서 역행렬을 구하지 않고 회귀계수를 계산하는 알고리즘입니다. 학습률과 학습횟수를 적절히 조절해야 합니다.
for t in range(T): # T:학습횟수, 종료조건이 일정 학습횟수로 변경함. 앞에서 본 종료조건을 사용해도됨
error = y - X @ beta
grad = - transpose(X) @ error
beta = beta - lr * grad
경사하강법은 미분가능하고 볼록(convex)한 함수에 대해서는 적절한 학습률과 학습횟수를 선택했을 때 수렴이 보장되어 있습니다. 특히, 선형회귀의 경우 목적식은 회귀계수 $\beta$에 대해서 볼록함수이기 때문에 알고리즘을 충분히 돌리면 수렴이 보장됩니다. 하지만 비선형회귀 문제의 경우 목적식이 볼록하지 않을 수 있으므로 수렴이 항상 보장되지는 않습니다.
2) 확률적 경사하강법(stochastic gradient descent)
확률적 경사하강법은 모든 데이터를 사용해서 업데이트하는 대신 데이터 한개 또는 일부(미니배치)를 활용해서 업데이트합니다. 볼록이 아닌(non-convex) 목적식은 SGD를 통해 최적화할 수 있습니다. 한개만 사용하는 것은 비효율적이기 때문에 대부분 미니배치를 활용한 SGD를 많이 사용합니다. 딥러닝의 경우 SGD가 경사하강법보다 실증적으로 더 낫다고 검증되었습니다. SGD는 데이터의 일부를 가지고 파라미터를 업데이트하기 때문에 연산자원을 좀 더 효율적으로 활용하는데 도움이 됩니다. local minima를 쉽게 빠져나올 수 있습니다. SGD는 볼록이 아닌 목적식에서도 사용 가능하므로 경사하강법보다 머신러닝 학습에 더 효율적입니다. 미니배치 SGD는 미니배치의 크기도 고려해야합니다.