Deep Learning from Scratch1 - Ch4 경사하강법

1 minute read

경사법(경사하강법, gradient descent method)

  • 기울기를 이용해 함수의 최솟값(또는 가능한 한 작은 값)을 찾는 방법
  • 기울기가 가리키는 곳이 정말 함수의 최솟값인지 보장할 수 없다.(안장점, 극솟값..)
  • 하지만, 그 방향으로 나아가야 함수의 값을 줄일 수 있으므로 최솟값이 되는 장소를 찾는 문제에서는 기울기 정보를 단서로 이용한다.
  • 현 위치에서 기울어진 방향으로 일정 거리만큼 이동하고, 다시 기울기를 구해서 또 일정 거리만큼 나아가는 방법이 ‘경사법’이다.

수식표현

  • η(eta, 에타)는 갱신하는 양을 나타내며, 신경망 학습에서는 학습률(learning rate)이라고 한다.

경사법으로 f(x0, x1)=(x0)^2+(x1)^2 의 최솟값 구하기


#수치미분 구현 - 각 원소 하나하나에 대한 기울기
def _numerical_gradient_no_batch(f,x):
    h = 1e-4 #0.0001
    grad = np.zeros_like(x) #x와 형상이 같고 그 원소가 모두 0인 배열을 만듦
    
    # x의 각 원소에 대해서 수치미분을 구한다.
    for idx in range(x.size):
        tmp_val = x[idx]
        x[idx] = tmp_val + h
        fxh1 = f(x)
        
        x[idx] = tmp_val - h
        fxh2 = f(x)
        
        grad[idx] = (fxh1 - fxh2) / (2*h)
        x[idx] = tmp_val
        
    return grad

# 배치처리된 데이터에 적용할 수 있는 수치미분 함수
def numerical_gradient(f, X):
    if X.ndim == 1:
        return _numerical_gradient_no_batch(f, X)
    else:
        grad = np.zeros_like(X)
        
        for idx, x in enumerate(X):
            grad[idx] = _numerical_gradient_no_batch(f, x)
        
        return grad
    
#간단한 경사하강법 구현
def gradient_descent(f, init_x, lr=0.01, step_num=100):
    x = init_x
    
    for i in range(step_num):
        grad = numerical_gradient(f,x)
        x -= lr*grad
    return x
    
def function_2(x):
    return x[0]**2 + x[1]**2
    
  • enumerate(): 순서가 있는 자료형(list, tuple, dictionary, string 등)을 입력받아 인덱스와 값을 포함하는 객체를 반환한다.
  • for idx, value in enumerate(X) 와 같이 반복문과 주로 사용되며, idx, value는 괄호가 없는 튜플이다.

경사법을 사용한 위 내용의 갱신과정

  • 값이 가장 낮은 장소인 원점에 점차 가까워지는 모습이다.

하이퍼파라미터(hyper parameter)

  • 훈련 데이터와 학습 알고리즘에 의해 자동으로 획득되는 신경망의 가중치와 편향 같은 매개변수와 달리, 사람이 직접 설정해야하는 매개변수
  • 학습률이 대표적인 하이퍼파라미터이다.
  • 하이퍼파라미터들은 여러 후보 값 중에서 시험을 통해 가장 잘 학습하는 값을 찾는 과정을 거쳐야 한다.

[참고자료]

Leave a comment