SW/인공지능

확률적 경사 하강 : Stochastic Gradient Descent (SGD) : 개념, 원리

얇은생각 2019. 10. 21. 07:30
반응형

Stochastic Gradient Descent이란 무엇일까요?

SGD(Stochastic Gradient Descent)에 대해 이야기하기 전에 먼저 Gradient Descent 란 무엇일까요? 그라디언트 디센트는 머신 러닝 및 딥 러닝에서 널리 사용되는 최적화 기술이며 대부분의 학습 알고리즘과 함께 사용할 수 있습니다. 그라디언트는 기본적으로 함수의 기울기입니다. 다른 파라미터의 변화량에 따른 파라미터의 변화 정도. 수학적으로 입력과 관련하여 매개 변수 집합의 부분 파생으로 설명 할 수 있습니다. 기울기가 많을수록 경사가 더 가파릅니다. 그라디언트 하강은 볼록한 기능입니다.


그라디언트 디센트는 비용 함수를 가능한한 최소화하는 함수의 매개 변수 값을 찾는 데 사용되는 반복적 방법으로 설명 할 수 있습니다. 매개 변수는 처음에 특정 값으로 정의되며, 그로부터 Gradient Descent는 계산법을 사용하여 주어진 비용 함수의 가능한 최소값을 찾기 위해 매개 변수의 최적 값을 찾기 위해 반복적인 방식으로 실행됩니다.


그라데이션 하강의 종류 : 일반적으로 그라디언트 디센트에는 세 가지 유형이 있습니다.


배치 그라디언트 하강

확률 적 경사 하강

미니 배치 그라디언트 디센트


이번 포스팅에서는 SGD 즉, 확률적 그라디언트 디센트에 대해 알아보겠습니다.

 



확률적 그라디언트 디센트 (SGD)

``stochastic ''이라는 단어는 임의의 확률과 연결된 시스템 또는 프로세스를 의미합니다. 따라서 확률적 그라디언트 디센트 (Stochastic Gradient Descent)에서는 각 반복에 대한 전체 데이터 세트 대신 무작위로 일부 샘플이 선택됩니다. 그라디언트 디센트에는 "일괄 처리"라는 용어가 있으며, 이는 각 반복에 대한 그라디언트를 계산하는 데 사용되는 데이터 집합의 총 샘플 수를 나타냅니다. 배치 그라디언트 디센트와 같은 일반적인 그라디언트 디센트 최적화에서 배치는 전체 데이터 세트로 간주됩니다. 전체 데이터 세트를 사용하는 것은 노이즈가 적거나 임의의 방식으로 최소값을 얻는 데 실제로 유용하지만 데이터 세트가 실제로 커지면 문제가 발생합니다.


데이터 집합에 백만 개의 샘플이 있다고 가정하면 일반적인 그라디언트 디센트 최적화 기법을 사용하는 경우 그라디언트 디센트를 수행하는 동안 한 번의 반복을 완료하기 위해 백만개의 샘플을 모두 사용해야하므로 최소값에 도달 할때 까지, 모든 데이터세트에 대해 수행해야합니다. 따라서, 계산하는 것이 시간적으로 매우 길어지게 됩니다.


이 문제는 확률적 경사 하강에 의해 해결됩니다. SGD에서는 각 반복을 수행하기 위해 단일 샘플, 즉 배치 크기가 1 인 샘플만 사용합니다. 샘플이 무작위로 섞여 반복을 수행하도록 선택됩니다.


SGD 알고리즘 :



따라서 SGD에서 모든 예제의 비용 함수 기울기 합계 대신 각 반복에서 단일 예제의 비용 함수 기울기를 찾습니다.


SGD에서는 각 반복에 대해 데이터 집합의 샘플 하나만 임의로 선택하므로 알고리즘에서 최소에 도달하기 위해 취한 경로는 일반적인 Gradient Descent 알고리즘보다 노이즈가 적습니다. 그러나 알고리즘에 의한 경로는 중요하지 않으며 훈련 시간이 크게 단축되는 한 중요하지 않습니다.


배치 그라디언트 디센트로 찍은 경로



확률적 그라디언트 하강에 의해 경로 

확률적 경사 하강 : Stochastic Gradient Descent (SGD) : 개념, 원리



주목해야 할 것은 SGD가 일반적으로 전형적인 그라디언트 디센트보다 잡음이 많기 때문에, 하강의 임의성으로 인해 최소에 도달하는 데 일반적으로 더 많은 반복이 필요하다는 것입니다. 비록 전형적인 그라디언트 디센트보다 최소에 도달하기 위해 더 많은 반복이 필요하지만, 여전히 전형적인 그라디언트 디센트보다 계산 비용이 훨씬 저렴합니다. 따라서 대부분의 시나리오에서 SGD는 학습 알고리즘을 최적화하기 위해 배치 그라디언트 디센트보다 선호됩니다.




파이썬에서 SGD를위한 의사 코드 :


def SGD(f, theta0, alpha, num_iters):
    """ 
       Arguments:
       f -- the function to optimize, it takes a single argument
            and yield two outputs, a cost and the gradient
            with respect to the arguments
       theta0 -- the initial point to start SGD from
       num_iters -- total iterations to run SGD for
       Return:
       theta -- the parameter value after SGD finishes
    """
    start_iter = 0
    theta = theta0
    for iter in xrange(start_iter + 1, num_iters + 1):
        _, grad = f(theta)
   
        # there is NO dot product ! return theta
        theta = theta - (alpha * grad) 




손실 함수를 줄이기 위해 값을 취하고 다른 매개 변수를 기반으로 조정하는 주기를 역전파(백프로파게이션)라고 합니다.

반응형