개발자식

[부스트캠프] AI_Math 경사 하강법 본문

AI/Math

[부스트캠프] AI_Math 경사 하강법

밍츠 2022. 9. 11. 02:57

 

미분(differentiation)

 

 

- 미분은 변수의 움직임에 따른 함수값의 변화를 측정하기 위한 도구최적화에서 제일 많이 사용하는 기법이다.

- 미분은 변화율의 극한으로 정의한다.

- sympy.diff를 이용하여 미분을 컴퓨터로 계산할 수 있다.

import sympy as sym
from sympy.abc import X

print(sym.diff(sym.poly(X**2 + 2*X + 3), X))
Output:
Poly(2*X + 2, X, domain='ZZ')

 

미분의 활용

- 미분은 함수f의 주어진 점(x, f(x))에서의 접선의 기울기를 구한다.

- 미분 조건 : 함수의 모양이 매끄러워야 한다. (연속)

- 한 점에서 접선의 기울기를 알면 어느 방향으로 점을 움직여야 함수값이 증가하는지 감소하는지 알 수 있다.

  • 미분 값을 더하면 경사상승법(gradient ascent)이라 하며 함수의 극대값의 위치를 구할 때 사용한다. -> 목적함수 최대화
  • 미분 값을 빼면 경사하강법(gradient descent)이라 하며 함수의 극소값의 위치를 구할 때 사용한다. -> 목적함수 최소화
  • 미분 값이 음수, 양수 여부 상관없이 적용! 아래 그림 참고

ex)

경사하강법

  • 미분값이 음수라서 x + f'(x) < x는 왼쪽으로 이동하여 함수값이 증가
  • 미분값이 양수라서 x + f'(x) > x는 오른쪽으로 이동하여 함수값이 증가
  • 미분값이 음수라서 x - f'(x) < x는 오른쪽으로 이동하여 함수값이 감소
  • 미분값이 양수라서 x - f'(x) > x는 왼쪽으로 이동하여 함수값이 감소

목적함수 최적화

- 경사 상승/ 경사 하강 방법은 극값에 도달하면 움직임을 멈춘다.

-> 극값에선 미분 값이 0이므로 더 이상 업데이트가 되지 않아 목적함수 최적화가 자동으로 끝난다.

미분은 변수의 움직임에 따른 함숫값의 변화를 측정하기 위한 도구로 최적화에서 제일 많이 사용하는 기법이다.

 

편미분

 

 

벡터(n차원 공간, 공간의 움직임이 다양할 것)가 입력인 다변수 함수의 경우 편미분을 사용한다.

- e(i)는 i번째 값만 1이고 나머지는 0인 단위 벡터이다.

- 각 변수 별로 편미분을 계산한 그레디언트(gradient) 벡터를 이용하여 경사하강법, 경사상승법에 사용할 수 있다.

- 변수 d개 -> 그래디언트 벡터 d개

 

Gradient 벡터 ∇f

- 다변수 함수 f의 각 변수에 대해 편미분 한 것을 벡터로 모아 놓은 걸 gradient 벡터라고 부르고, ∇와 같이 표기한다. 델 또는 nabla(나블라)라고 읽는다.

- 각 점(x, y, z) 공간에서 f(x, y) 표면을 따라 -∇f 벡터를 그리면 아래와 같다.

극솟점으로 이동

- 그레디언트 벡터는 각 점에서 가장 빨리 증가/감소하는 방향으로 흐르게 된다.

미분에서는 미분 계산 값에 절댓값을 씌우고, 그레디언트 벡터에서는 절대값 대신 노름(norm)을 계산한다.
- 거리를 계산하는 방법이 다르기 때문

 

선형 모델 찾기

- 선형 모델의 경우 역행렬을 이용해서 회귀분석이 가능하다.

- 역행렬을 이용하지 않고 경사하강법을 이용해 적절한 선형모델을 찾을 수 있다. 
- 경사하강법을 이용하면 선형 모델이 아닌 경우에도 사용할 수 있다.

 

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

- 선형 회귀의 목적식은 ||y - Xβ|| (L2노름) 이고 이를 최소화하는 β를 찾아야 하므로 다음과 같은 그레디언트 벡터를 구해야 한다.

 

 

 

목적식을 최소화하는 β를 구하는 경사하강법 알고리즘

 

- 경사하강법 알고리즘에서는 학습률과 학습 횟수가 중요한 하이퍼파라미터가 된다.

 

 

경사하강법은 만능일까?

- 이론적으로 경사하강법은 미분 가능하고 볼록(convex)한 함수에 대해선 적절한 학습률과 학습 횟수를 선택했을 때 수렴이 보장되어 있다.

- 볼록한 함수는 그레디언트 벡터가 항상 최소점을 향한다.

- 특히 선형 회귀의 경우 목적식은 회귀 변수 β에 대해 볼록 함수이기 때문에 알고리즘을 충분히 돌리면 수렴이 보장된다.

- 비선형 회귀 문제의 경우 목적식이 볼록하지 않을 수 있어 수렴이 항상 보장되지는 않는다. (딥러닝의 대부분 목적식은 볼록 함수가 아니다) -> 변경된 경사하강법 사용 ->SGD!

 

확률적 경사하강법(stochastic gradient descent, SGD)

- 모든 데이터를 사용해서 업데이트하는 대신(경사하강법 방식) 데이터 한 개 또는 일부를 활용하여 업데이트한다.

- 볼록이 아닌(non-convex) 목적식은 SGD를 통해 최적화할 수 있다.

SGD라고 해서 만능은 아니지만 딥러닝의 경우 SGD가 경사하강법보다 실증적으로 더 낫다고 검증되었다.
학습률 학습 횟수 고려는 SGD도 마찬가지!

- 데이터의 일부를 가지고 패러미터를 업데이트하기 때문에 연산 자원을 좀 더 효율적으로 활용할 수 있다.

- 전체 데이터 (X, y)를 쓰지 않고 미니 배치(X(b), y(b))를 써서 업데이트하므로 연산량이 b/n로 감소한다.

- 미니 배치를 가지고 목적식의 그레디언트를 근사해서 계산하여 미니 배치는 확률적으로 선택하므로 목적식 모양이 바뀌게 되지만 나아가는 방향은 비슷하다.

-> 극소점에서 탈출이 가능하여 그래서 non convex에서 가능하다

- non convex 목적식에서도 사용 가능하여 경사하강법보다 머신러닝 학습에 더 효율적이다.

 

 

- SGD는 정확한 방향은 아니지만 빠르게 이동한다.

- 데이터의 양은 많아지고 크기는 커져 일반적인 경사하강법처럼 모든 데이터를 업로드하면 메모리가 부족하여 Out-of-memory가 발생하여 SGD를 사용하는 것이 유리하다.

 

회고

최적화하는 방법의 핵심인 경사하강법을 배웠다. 이론 자체는 쉽지만 계산 과정을 이해하기는 어렵다ㅜㅜ

특히 경사하강법으로 선형회귀 계수 구하는 방법은 직접 다시 해봐야겠다..!!! (포스팅에 추가할 예정)

SGD가 왜 나오게 되었는지 흐름을 이해할 수 있었다.

Comments