부스트캠프 AI Tech 3기(week1) Day2
📌(AI Math 3강) 경사하강법 - 순한맛
✍미분이 뭔가요?
- 
미분(differentiation)은 변수의 움직임에 따른 함수값의 변화를 측정하기 위한 도구 
- 
최적화에서 제일 많이 사용하는 기법 
- 미분은 변화율의 극한(limit) 으로 정의합니다.
 
- 
파이썬을 사용해서 계산하려면 sympy.diff로 계산할 수 있습니다.
 
미분(differentiation)은 변수의 움직임에 따른 함수값의 변화를 측정하기 위한 도구
최적화에서 제일 많이 사용하는 기법
- 미분은 변화율의 극한(limit) 으로 정의합니다.
파이썬을 사용해서 계산하려면 sympy.diff 로 계산할 수 있습니다.  
☛ 입력
import sympy as sym from sympy.abc import x sym.diff(sym.poly(x**2 + 2*x + 3), x)
☛ 출력
Poly(2*x + 2, x, domain='zz')
- 
미분은 함수 의 주어진 점 에서의 접선의 기울기를 구합니다. 
- 
한 점에서 접선의 기울기를 알면 어느 방향으로 점을 움직여야 함수값이 증가하는지 감소하는지 알 수 있습니다. - 함수값을 증가시키고 싶다면 미분값을 더하고, 감소시키고 싶다면 미분값을 뺍니다.
    
 
- 함수값을 증가시키고 싶다면 미분값을 더하고, 감소시키고 싶다면 미분값을 뺍니다.
- 
미분값을 빼면 경사하강법(gradient descent) 이라 하며 함수의 극소값의 위치를 구할 때 사용합니다. 즉, 목적함수를 최소화할 때 사용합니다. - 극값에서 미분값은 0 이므로 목적함수 최적화는 자동으로 끝난다.
 
✍경사하강법 : 알고리즘
1 Input: gradient, init, lr, eps, Output: var 2 --------------------------------------------- 3 # gradient : 미분을 계산하는 함수 4 # init : 시작점, lr : 학습률, eps: 알고리즘 종료조건 5 6 var = init 7 grad = gradient(var) 8 while(abs(grad) > eps): # 컴퓨터로 계산할 때 미분이 정확히 0이 되는 것은 불가능하므로 `eps` 보다 작을 때 종료하는 조건이 필요. 9 var = var - lr * grad # 이 부분이 x-lr*f(x)을 계산하는 부분. lr은 학습률로 업데이트 속도를 조절 10 grad = gradient(var) # 종료조건이 성립하기 전까지 미분값을 계속 업데이트
아래 그림은 함수가  일 때 경사하강법으로 최소점을 찾는 코드입니다.

- 
def func - sym.poly함수는 함수식을 정의해줍니다.
- sym.subs함수는 변수를 다른변수로 치환하거나 값을 대입해줍니다.
 
- 
func_gradient - sym.diff함수는 도함수를 구해줍니다.
- func함수를 사용하여 미분값과 함수를 return하는 코드를 짜야합니다.
 
- 
gradient_descent - init_point는 경사하강법의 시작점을 의미합니다.
- lr_rate는 learning rate로 step의 크기를 정해줍니다.
- epsilon은 gradient 크기의 lower bound입니다.
 
 
✍변수가 벡터이면요?
- 
벡터가 입력인 다변수 함수의 경우 편미분(partial differentiation)을 사용합니다. - 
벡터 의 번째 값을 편미분 하면 -> 
- 
는 번째 값만 1이고 나머지는 0인 단위벡터 입니다. 
 
- 
- 
각 변수 별로 편미분을 계산한 그레디언트(gradient) 벡터를 이용하여 경사하강/경사상승법에 사용할 수 있습니다. 아래 그림은 함수 를 벡터 에 대해 편미분한 것이며, 앞서 사용한 미분값인 대신 벡터 를 사용하여 변수 를 동시에 업데이트 할 수 있습니다. 즉, 를 사용합니다. 
  
✍그레디언트 벡터가 뭐에요?


그레디언트를 이해하기 위해 함수  의 등고선(contour) 을 보면서 해석해보겠습니다.
먼저 각 점  공간에서  표면을 따라  벡터를 그리면 위와 같이 각 점에서 가장 빨리 감소하게 되는 방향과 같습니다.
✍경사하강법(그레디언트 벡터): 알고리즘
1 Input: gradient, init, lr, eps, Output: var 2 --------------------------------------------- 3 # gradient : 그레디언트 벡터를 계산하는 함수 4 # init : 시작점, lr : 학습률, eps: 알고리즘 종료조건 5 6 var = init 7 grad = gradient(var) 8 while(norm(grad) > eps): 9 var = var - lr * grad 10 grad = gradient(var)
경사하강법 알고리즘은 그대로 적용됩니다. 하지만 벡터는 절대값 대신 노름(norm)을 계산해서 종료조건을 설정합니다.

- 
def eval_ - sym.subs함수는 변수를 다른변수로 치환하거나 값을 대입해줍니다.
 
- 
def func_multi - 다변수함수를 정의하는 함수입니다.
- sym.poly함수는 함수식을 정의해줍니다.
 
- 
func_gradient - sym.diff함수는 도함수를 구해줍니다.
- func함수를 사용하여 미분값과 함수를 return하는 코드를 짜야합니다.
 
- 
gradient_descent - init_point는 경사하강법의 시작점을 의미합니다.
- lr_rate는 learning rate로 step의 크기를 정해줍니다.
- epsilon은 gradient 크기의 lower bound입니다.
- 종료조건을 노름(norm)으로 계산하여 설정합니다.
 
📌(AI Math 4강) 경사하강법 - 매운맛
✍선형회귀분석 복습
- np.linalg.pinv를 이용하면 데이터를 선형모델(linear model)로 해석하는 선형회귀식을 찾을 수 있습니다.
  
 하지만 이번 시간에서는 역행렬을 이용하지 않고 경사하강법을 이용해 적절한 선형모델을 찾는 방법에 대해서 알아보겠습니다.
✍경사하강법으로 선형회귀 계수 구하기
- 
선형회귀의 목적함수는  이고, 이를 최소화하는  를 찾아야 합니다. 즉, 목적함수를  에 대해서 편미분해야 합니다. 
- 
아래 그림은 목적함수  를  로 편미분하는 식 입니다. n은 데이터의 수 이고,d는 데이터의 특징(차원) 수 입니다.
  
 여기서  모두 벡터이므로  첫 번째 식과 같이 풀어 쓸 수 있습니다.
 두 번째 식은 목적함수를 의 k번째 값으로 편미분하는 식을 L2-norm을 풀어서 나타내고 있습니다. 여기서 주의하실 점은 이전에 학습했던 L2-norm의 식과 다르다는 점 입니다. 이전에 학습했던 L2-norm은 한 개의 점에 대한 식이었다면, 위 사진에서의 L2-norm은n개의 점에 대한 L2-norm이기 때문에 데이터 개수인n으로 나눠준다는 점입니다.
 위 식을  풀면 아래 그림과 같은 식이 나옵니다.
   
 
- 
위 식이 좀 복잡하시면,  대신 을 사용면 식이 좀 더 간단해집니다. 은 L2-norm의 제곱근을 날려버린 식이라고 생각하시면 됩니다. 아래 그림은 제가 직접 풀어본 식 입니다.
  
 확실히 식이 기존의 L2-norm을 사용했던 것 보다 간단해졌습니다.
 
위 그림의 식은  와 동일하다.
 이제 목적함수  를 최소화하는 를 구하는 경사하강법 알고리즘은 다음과 같습니다.
 -->
 
 
✍경사하강법 기반 선형회귀 알고리즘
1  Input: X, y, lr, T,   Output: beta
2  ---------------------------------------------
3  # norm: L2-노름을 계산하는 함수
4  # lr : 학습률,  T: 학습횟수
5  
6  for t in range(T):
7  	error = y - X @ beta
8  	grad = - transpose(X) @ error
9  	beta = beta - lr * grad
- 
line 6 : 종료조건을 일정 학습횟수로 변경한 점만 빼고 앞에서 배운 경사하강법 알고리즘과 같다. 
- 
line 7 ~ 9 : 항을 계산해서 를 업데이트 합니다.
 
 
 
✍경사하강법은 만능일까?
- 
이론적으로 경사하강법은 미분가능하고 볼록(convex)한 함수에 대해선 적절한 학습률과 학습횟수를 선택했을 때 수렴이 보장되어 있습니다. 
- 
특히 선형회귀의 경우 목적함수  은 에 대해 볼록함수 이기 때문에 알고리즘을 충분히 돌리면 수렴이 보장됩니다. 
- 
하지만 비선형회귀 문제의 경우 목적함수가 볼록하지 않을 수 있으므로 수렴이 항상 보장되지는 않습니다.
  
 
✍ 확률적 경사하강법
- 
확률적 경사하강법(stochastic gradient descent)은 모든 데이터를 사용해서 업데이터하는 대신 데이터 한개 혹은 일부를 활용하여 업데이트 합니다. 
- 
non-convex한 목적함수는 SGD를 통해 최적화할 수 있습니다. 
- 
SGD는 데이터의 일부를 가지고 파라미터를 업데이트하기 때문에 연산자원을 좀 더 효율적으로 활용하는데 도움이 됩니다.
  
  
 
np.linalg.pinv를 이용하면 데이터를 선형모델(linear model)로 해석하는 선형회귀식을 찾을 수 있습니다.
하지만 이번 시간에서는 역행렬을 이용하지 않고 경사하강법을 이용해 적절한 선형모델을 찾는 방법에 대해서 알아보겠습니다.
선형회귀의 목적함수는 이고, 이를 최소화하는 를 찾아야 합니다. 즉, 목적함수를 에 대해서 편미분해야 합니다.
아래 그림은 목적함수  를  로 편미분하는 식 입니다. n은 데이터의 수 이고, d는 데이터의 특징(차원) 수 입니다.

여기서  모두 벡터이므로  첫 번째 식과 같이 풀어 쓸 수 있습니다.
두 번째 식은 목적함수를 의 k번째 값으로 편미분하는 식을 L2-norm을 풀어서 나타내고 있습니다. 여기서 주의하실 점은 이전에 학습했던 L2-norm의 식과 다르다는 점 입니다. 이전에 학습했던 L2-norm은 한 개의 점에 대한 식이었다면, 위 사진에서의 L2-norm은 n개의 점에 대한 L2-norm이기 때문에 데이터 개수인 n으로 나눠준다는 점입니다.
위 식을  풀면 아래 그림과 같은 식이 나옵니다.


위 식이 좀 복잡하시면,  대신 을 사용면 식이 좀 더 간단해집니다. 은 L2-norm의 제곱근을 날려버린 식이라고 생각하시면 됩니다. 아래 그림은 제가 직접 풀어본 식 입니다.

확실히 식이 기존의 L2-norm을 사용했던 것 보다 간단해졌습니다.
위 그림의 식은 와 동일하다.
이제 목적함수 를 최소화하는 를 구하는 경사하강법 알고리즘은 다음과 같습니다.
-->
1  Input: X, y, lr, T,   Output: beta
2  ---------------------------------------------
3  # norm: L2-노름을 계산하는 함수
4  # lr : 학습률,  T: 학습횟수
5  
6  for t in range(T):
7  	error = y - X @ beta
8  	grad = - transpose(X) @ error
9  	beta = beta - lr * gradline 6 : 종료조건을 일정 학습횟수로 변경한 점만 빼고 앞에서 배운 경사하강법 알고리즘과 같다.
line 7 ~ 9 : 항을 계산해서 를 업데이트 합니다.
이론적으로 경사하강법은 미분가능하고 볼록(convex)한 함수에 대해선 적절한 학습률과 학습횟수를 선택했을 때 수렴이 보장되어 있습니다.
특히 선형회귀의 경우 목적함수 은 에 대해 볼록함수 이기 때문에 알고리즘을 충분히 돌리면 수렴이 보장됩니다.
하지만 비선형회귀 문제의 경우 목적함수가 볼록하지 않을 수 있으므로 수렴이 항상 보장되지는 않습니다.

확률적 경사하강법(stochastic gradient descent)은 모든 데이터를 사용해서 업데이터하는 대신 데이터 한개 혹은 일부를 활용하여 업데이트 합니다.
non-convex한 목적함수는 SGD를 통해 최적화할 수 있습니다.
SGD는 데이터의 일부를 가지고 파라미터를 업데이트하기 때문에 연산자원을 좀 더 효율적으로 활용하는데 도움이 됩니다.


정규방정식이 이해하기 어려워서 다음 블로그를 참고하시면 좋을 것 같습니다.
[머신러닝 reboot] 단순 선형 회귀 분석 - 정규방정식 도출하기
Author And Source
이 문제에 관하여(부스트캠프 AI Tech 3기(week1) Day2), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@wodnr0710/부스트캠프-AI-Tech-3기-Day2저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
                                
                                
                                
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)