확률 적 경사 하강 법

참고 : 수학 형식이 표시되지 않는 경우 브라우저 링크 를 통해 Math Anywhere를 추가 하세요.

Gradient Descent는 미분 가능한 함수의 국소 최솟값을 찾는 데 사용하는 가장 중요한 방법입니다. 그러나 경사 하강 법은 학습 세트의 모든 샘플 데이터를 가져와 손실 함수를 최소화하기 위해 반복적 인 방식으로 매개 변수에 대한 단일 업데이트를 수행하기 때문에 방대한 데이터 세트를 다룰 때는 항상 문제가됩니다. 매개 변수를 업데이트하는 것은 덜 효율적이며 전체 데이터 세트를 실행해야합니다. 여기에 다르게 동작하는 확률 적 경사 하강 법에 대한 아이디어가 있습니다. 여기서 우리는 확률 적 경사 하강 법이 작동하는 방식과 일반 경사 하강 법과 확률 적 경사 하강 법 알고리즘의 차이점에 대해 설명합니다.

경사 하강 법

확률 적 경사 하강 법에 들어가기 전에 기본적인 경사 하강 법을 살펴 보겠습니다.

Gradient Descent의 목적은 무엇입니까? 간단히 말해서 경사는 표면의 경사 또는 경사를 의미합니다. 그래서 경사 하강 법은 말 그대로 그 표면의 가장 낮은 지점에 도달하기 위해 경사를 내려가는 것을 의미합니다. 2 차원 그래프에서 포물선을 예로 들어 보겠습니다.

2 차원 (x, y)의 포물선 함수

포물선의 가장 낮은 점은 x = 1에서 발생합니다. 경사 하강 법 알고리즘의 목적은 "y"가 최소가되도록 "x"값을 찾는 것입니다. 여기서 "y"는 목적 함수로 해석됩니다.

표준 경사 하강 법에서 기본 업데이트 규칙은 다음과 같습니다.

여기서 $ w_ {j, i} $는 가중치를 나타내며 신경망을 최적화하려고 할 때 조정하려는 매개 변수이기도합니다. $ L $는 손실 함수이며이를 최소화하려고합니다. $ \ delta w_ {j, i} $는 손실을 줄이기 위해이 가중치를 변경하는 방법을 결정합니다.

모든 단계에서 전체 학습 세트가 사용되며 이것이 배치 경사 하강 법이라고하는 이유이기도합니다. 이러한 계산은 매우 큰 데이터 세트에서 비용이 많이 들고 반복 할 때마다 메모리에 중간 가중치를 저장해야합니다. 경사 하강 법의 그래픽 해석은 다음과 같습니다.

위키 백과의 일련의 레벨 세트에 대한 경사 하강 법 그림

경사 하강 법이 로컬 최소값을 찾는 방법을 더 잘 설명하기 위해 함수 $ f (x) = x³−2x² + 2 $의 로컬 최소값을 찾는 예제를 사용합니다. 코드는 다음과 같습니다.

위의 플롯에서 우리는 국소 최솟값이 약 1.4라는 것을 알 수 있지만 그것에 대해 모른다고 가정하고 $ x_0 = 2 $에서 시작점을 선택합니다.

국소 최솟값에 도달하기 위해 통과하는 모든 점을 수집하여 경사 하강 법이 어떻게 진행되었는지에 대한 궤적을 그릴 수 있습니다.

Stochastis 경사 하강 법

' 확률 적 ' 이라는 단어 는 무작위 확률로 연결된 시스템 또는 프로세스를 의미합니다. 따라서 Stochastic Gradient Descent에서는 각 반복에 대한 전체 데이터 세트 대신 몇 개의 샘플이 무작위로 선택됩니다. Gradient Descent에는 각 반복에 대한 기울기를 계산하는 데 사용되는 데이터 세트의 총 샘플 수를 나타내는 "배치"라는 용어가 있습니다. Batch Gradient Descent와 같은 일반적인 Gradient Descent 최적화에서는 배치가 전체 데이터 세트로 간주됩니다. 전체 데이터 세트를 사용하는 것은 덜 시끄럽고 덜 무작위적인 방식으로 최소값에 도달하는 데 정말 유용하지만 데이터 세트가 커지면 문제가 발생합니다. 데이터 세트에 백만 개의 샘플이 있으므로 일반적인 Gradient Descent 최적화 기술을 사용하는 경우 Gradient Descent를 수행하는 동안 한 번의 반복을 완료하기 위해 100 만 개의 샘플을 모두 사용해야하며이를 위해 수행해야합니다. 최소값에 도달 할 때까지 모든 반복. 따라서 수행하는 데 계산 비용이 많이 듭니다.

이 문제는 확률 적 경사 하강 법 (Stochastic Gradient Descent)으로 해결됩니다. SGD에서는 각 반복을 수행하기 위해 단일 샘플, 즉 하나의 배치 크기 만 사용합니다. 샘플은 무작위로 섞이고 반복을 수행하기 위해 선택됩니다.

확률 적 경사 하강 법에서 알고리즘은 하나 또는 몇 개의 훈련 예제를 사용하여 매개 변수를 계산합니다. 따라서 배치 경사 하강 법과 달리, SGD는 매개 변수의 변경 사항 하나를 계산하기 전에 모든 경사 항 (모든 학습 데이터 포인트에 대한)을 합산하기를 기다리는 대신 단일 데이터에 대한 경사 항을 계산하고 다음 단계로 진행하기 시작합니다. 이미 매개 변수를 개선하십시오. 따라서 SGD에서는 매개 변수 변경이 훨씬 빨라집니다. SGD는 가중치를 업데이트하기 위해 전체 훈련 세트를 실행할 필요가 없기 때문에 GD보다 계산적으로 덜 까다롭기 때문에 방대한 데이터 세트를 처리하는 데 좋은 선택입니다.

알고리즘은 다음과 같이 설명 할 수 있습니다.

범위 (m)에있는 i의 경우 :

$ \ theta_j = \ theta_j-\ alpha (\ hat {y} ^ i -y ^ i) x_j ^ i $

SGD에서는 데이터 세트의 하나의 샘플 만 각 반복에 대해 무작위로 선택되기 때문에 알고리즘이 최소값에 도달하기 위해 사용하는 경로는 일반적으로 일반적인 Gradient Descent 알고리즘보다 노이즈가 더 많습니다. 그러나 우리가 최소값에 도달하고 훈련 시간이 현저히 짧아지는 한 알고리즘이 취하는 경로는 중요하지 않기 때문에 그다지 중요하지 않습니다. 비교를 위해 Batch Gradient Descent의 경로는 다음과 같습니다.

경사 하강 법으로 촬영 한 경로

확률 적 경사 하강 법이 취한 경로,

확률 적 경사 하강 법이 취하는 경로

주목해야 할 점은 SGD가 일반적으로 Gradient Descent보다 잡음이 많기 때문에 하강의 무작위성 때문에 최소값에 도달하는 데 일반적으로 더 많은 반복이 필요하다는 것입니다. 일반적인 Gradient Descent보다 최소값에 도달하는 데 더 많은 반복이 필요하지만 그래도 Gradient Descent보다 계산적으로 덜 비쌉니다. 따라서 대부분의 시나리오에서 SGD는 학습 알고리즘 최적화를 위해 Batch Gradient Descent보다 선호됩니다.

파이썬의 알고리즘

Python의 SGD에 대한 의사 코드는 다음과 같습니다.

Python의 SGD에 대한 의사 코드

손실 함수를 줄이기 위해 값을 가져 와서 다른 매개 변수에 따라 조정하는주기를 역 전파라고합니다.

왜 확률 적 경사 하강 법이 필요한가요?

먼저 경사 하강 법을 사용하여 실제 예제를 살펴 보겠습니다. 온도가 귀뚜라미의 소음에 영향을 미치는지 확인하려는 간단한 선형 회귀를 고려하십시오. 우리는 다양한 온도에서 귀뚜라미의 우는 비율 데이터 세트를 가지고 있습니다. 먼저 데이터 세트를로드하고 플로팅합니다.

목표는 데이터 포인트에 가장 적합한 $ h _ {\ theta} (x) = \ theta_0 + \ theta_1 x $ 라인을 찾는 것입니다. 여기서 최소화하려는 기능은

$ J (\ theta_0, \ theta_1) = {1 \ 2m 이상} \ sum \ limits_ {i = 1} ^ m (h_ \ theta (x_i) -y_i) ² $

이 경우 그라디언트는 2 차원으로 정의됩니다.

이 경우 그라디언트는 2 차원으로 정의됩니다.

$ \ frac {\ partial} {\ partial \ theta_0} J (\ theta_0, \ theta_1) = \ frac {1} {m} \ sum \ limits_ {i = 1} ^ m (h_ \ theta (x_i) -y_i ) $

$ \ frac {\ partial} {\ partial \ theta_1} J (\ theta_0, \ theta_1) = \ frac {1} {m} \ sum \ limits_ {i = 1} ^ m ((h_ \ theta (x_i)- y_i) \ cdot x_i) $

아래에서 h, J 및 그래디언트에 대한 함수를 설정합니다.

그런 다음 데이터를 x 및 y 변수에로드하고 경사 하강 법 알고리즘을 실행합니다.

비교를 위해 아래와 같은 계수의 실제 값을 얻습니다.

또한, 베스트 핏 라인은 아래와 같이 그렸습니다.

경사 하강 법 알고리즘을 적용하여 얻은 값이 실제 값에 매우 가깝다는 것을 알 수 있습니다.

그러나 여기에 실제 문제가 있습니다. 우리가 조작하는 데이터 세트는 15 포인트 만있는 작은 데이터 세트입니다. 그리고 알고리즘의 모든 단계에서 기울기를 계산해야합니다.이 예에서는 큰 문제가 아니지만 데이터 세트에 백만 개의 데이터 포인트가 포함되어있는 경우이 방법은 효율성이 떨어집니다. 여기서 확률 적 경사 하강 법 이 구출되었습니다!

위의 예에서 한 것처럼 모든 단계에서 전체 교육 세트의 모든 예를 고려해야합니다. Stochastic Gradient Descent에서는 훈련 세트의 각 항목을 확인한 후 값을 업데이트하므로 즉시 진행을 시작합니다. 위의 회귀 예제를 떠올려 보면 다음과 같이 두 세타 값 각각에 대한 기울기를 계산합니다.

$ \ frac {\ partial} {\ partial \ theta_0} J (\ theta_0, \ theta_1) = \ frac {1} {m} \ sum \ limits_ {i = 1} ^ m (h_ \ theta (x_i) -y_i ) $

$ \ frac {\ partial} {\ partial \ theta_1} J (\ theta_0, \ theta_1) = \ frac {1} {m} \ sum \ limits_ {i = 1} ^ m ((h_ \ theta (x_i)- y_i) \ cdot x_i) $

여기서 $ h_ \ theta = \ theta_0 + \ theta_1 x $.

그런 다음 알고리즘을 따랐습니다 (여기서 αα \ alpha는 비 적응 단계 크기 임).

1. 초기 추측 $ x_0 $을 선택합니다.

2. k = 0, 1, 2,…

$ s_k = — \ nabla f (x_k) $

$ x_ {k + 1} = x_k + \ alpha s_k $

끝.

위와 같이 샘플 데이터가 작을 때 그래디언트를 계산하는 데 많은 비용이 들지 않았습니다. 그러나 큰 데이터 세트의 경우에는 그렇지 않습니다. 따라서 대신 다음과 같은 단순 선형 회귀를위한 확률 적 경사 하강 법 알고리즘을 고려합니다. 여기서 m은 데이터 세트의 크기입니다.

1. 데이터 세트를 무작위로 섞습니다.

2. k = 0, 1, 2,…

i = 1에서 m까지

$ \ begin {pmatrix} \ theta_1 \\ \ theta_2 \ end {pmatrix} $ = $ \ begin {pmatrix} \ theta_1 \\ \ theta_2 \ end {pmatrix} $ $-\ alpha \ begin {pmatrix} 2 (h_ { \ theta} (x_i) — y_i) \\ 2x_i (h _ {\ theta} (x_i) — y_i) \ end {pmatrix} $

끝.

일반적으로 확률 적 경사 하강 법을 사용하면 데이터가 수렴하는 속도와 데이터 세트의 크기에 따라 전체 데이터 세트를 1 ~ 10 회 실행합니다 (위 의사 코드의 2 행에있는 k 값 참조).

경사 하강 법과 달리 확률 적 경사 하강 법은 지속적으로 가까워지기보다는 최소값 근처 에서 진동하는 경향이 있습니다. 그러나 실제로는 최소값으로 수렴되지 않을 수 있습니다. 이를 해결하는 한 가지 방법은 알고리즘이 실행될 때 단계 크기를 천천히 줄이는 것입니다. 그러나 이것은 고정을 사용하는 것보다 덜 일반적입니다.

선형 회귀를위한 확률 적 경사 하강 법의 사용을 설명하는 또 다른 예를 살펴 보겠습니다. 아래 예에서는 0에서 100 사이의 x 값에 대해 선 주위에 500,000 개의 점 집합을 만듭니다.

첫 번째 단계는 데이터 세트를 무작위로 섞은 다음 h 함수와 비용 함수를 설정하는 것입니다.

그런 다음 확률 적 경사 하강 법 알고리즘을 실행하여 진행 상황을 확인하고 모든 단계에서 비용을 측정하고 10,000 단계마다 마지막 10,000 단계의 평균 비용을 얻은 다음이를 cost_list 변수에 추가합니다. . 여기에서 전체 목록을 10 번 실행합니다.

분명히 결과 값은 실제 값 17과 2에 가깝습니다.

비용 대 반복 횟수를 플로팅합니다. 비용은 처음에는 빠르게 감소하지만 더 많은 반복 작업을 거치면서 평준화되기 시작합니다.

경사 하강 법과 확률 적 경사 하강 법의 차이점

수학에서 벗어나 실제 데이터 세트에서 배치 경사 하강 법과 확률 적 경사 하강 법이 어떻게 다르게 업데이트되는지 예제를 살펴 보겠습니다. 다음의 경우 신경망이 급여, 지출 및 저축을 기준으로 사람이 집을 구매할지 여부를 예측해야한다고 가정하면 실제 출력 "집 구매"가 y로 표시됩니다.

따라서 일반 경사 하강 법에서는 모든 행을 가져 와서 신경망에 연결합니다. 신경망에 연결 한 후 공식 비용 함수 = $ \ frac {1} {2} (y — \ hat {y}) ² $를 사용하여 비용 함수를 계산합니다. 비용 함수에 따라 가중치를 조정합니다. 이것은 배치 경사 하강 법을 적용 할 때 진행된 과정입니다. 따라서이 경우 샘플에서 전체 배치를 가져옵니다.

확률 적 경사 하강 법에서는 행을 하나씩 가져옵니다. 연속해서 신경망을 실행하고 비용 함수에 따라 가중치를 조정합니다. 그런 다음 두 번째 행으로 이동하고 비용 함수를 기반으로 신경망을 실행하고 가중치를 업데이트합니다. 이 프로세스는 다른 모든 행에 대해 반복됩니다. 따라서 확률론에서는 기본적으로 모든 것을 함께 수행 한 다음 가중치를 조정하는 대신 모든 행마다 가중치를 조정합니다. 더 명확하게 이해하려면 아래 이미지를 참조하십시오.

데이터 세트를 무작위로 섞어 야하는 이유는 무엇입니까?

순서 데이터가 기울기에 편향을 가져올 수 있으므로 훈련 데이터를 무작위로 섞어 야합니다. 더 명확한 그림을보기 위해 손실 함수 L (θ, x)부터 시작하겠습니다. 여기서 $ \ theta $는 매개 변수이고 $ x_1, x_2,…, x_N $는 데이터 포인트입니다. 손실을 최소화하려고합니다. 훈련 데이터에 대한 기능,

$ J (\ theta) = \ sum_ {x \ in training set} $ $ L (\ theta, x) $

데이터를 셔플하지 않고 훈련 데이터가 $ {x_1, x_2,…, x_N} $이고 확률 적 경사 하강 법에 공급되었다고 가정하면 특정 단계의 경사도는 고정 함수의 경사입니다.

각각의 $ g_j $는 ∇θ J (θ)의 편향된 추정치입니다. 예를 들어 $ E [g_2] $를 보겠습니다.

$ g_2 $는 일정합니다. 그것에 대해 무작위가 없습니다. 데이터 세트를 알고 있고이를 ranmize하지 않으면 $ g_2 $ 및 다른 g가 모두 알려져 있으며 고정됩니다. 그들의 가치는 그들 자신의 기대이며 더 이상 불확실하지 않습니다. 더 나쁜 시나리오는 다음과 같습니다.이 값은 우리가 계산하려는 그래디언트의 실제 값이 아닙니다. 이 현상은 편향된 추정치 이며 일반적으로 선호되지 않습니다.

이제 훈련 전에 데이터를 무작위 화하면 어떻게되는지 살펴보십시오. $ g_i $ 그라디언트가 더 이상 결정되지 않습니다. 그들 모두는 기대되는 가치를 가지고 있습니다.

이것은 전체 훈련 데이터의 평균 기울기입니다. M이 크면 큰 수의 법칙은 이론적 평균, 즉 우리가 추정하려는 실제 기울기에 접근한다고 말합니다. 또한 어떤 경우에도 매개 변수를 업데이트하는 데 사용하는 경험적 그라디언트는 실제 그라디언트와 동일한 예상 값을 갖습니다.

결론적으로, 훈련 데이터를 무작위 화하거나 순열하면 실제 기울기에 대한 편향되지 않은 추정이 제공되어 훈련 프로세스를 향상시키는 더 나은 업데이트로 이어집니다.

Gradient Descent와 SGD의 차이점 강조

배치 경사 하강 법은 조정하기 전에 많은 피드백을 수집해야하지만 더 적은 조정이 필요합니다.

확률 적 경사 하강 법은 작은 조정을 많이하지만 그 사이에 피드백을 수집하는 데 소요되는 시간이 줄어 듭니다.

전체 모집단이 작은 경우 배치 기울기 하강이 바람직하고 전체 모집단이 매우 큰 경우 확률 적 기울기 하강이 바람직합니다.

모든 피드백을 병렬로 수집 할 수 있으므로 더 많은 하드웨어 (이 경우에는 더 많은 재단사 및 재료)에 액세스 할 수있는 경우 배치 경사 하강 법을 병렬로 만들 수 있습니다.

확률 적 경사 하강 법은 다음 반복을 진행하기 위해 한 반복의 피드백이 필요하기 때문에 병렬화에 쉽게 적합하지 않습니다.

결론적 으로 기본 경사 하강 법은 작은 데이터 세트에 더 적합하고 계산 비용이 적습니다. 큰 데이터 세트를 다룰 때 SGD는 업데이트 프로세스 중에 약간의 진동이 있더라도 더 나은 아이디어로 나오지만 로컬 최소 지점에 도달하는 속도가 빨라집니다. 통과 경로는 최적화 프로세스에서 중요하지 않으므로 최적의 지점에 도달하는 동안 더 많은 조정이 필요하더라도 SGD는 여전히 선호됩니다.

Suggested posts

IBM Watson Studio의 AutoAI 노트북으로 마술사 코드 깨기

IBM Watson Studio의 AutoAI 노트북으로 마술사 코드 깨기

가장 유명한 행동 강령 중 하나입니다. "마술사는 절대 비밀을 밝히지 않습니다." 그러나 청중이 너무나 놀라워 서 '방금 일어난 일'이라는 느낌에 놀라서 비밀을 밝히지 않는 것이 거의 잔인한 순간이 있습니다.

Python 코드 한 줄로 여러 시계열 예측 모델 학습

Auto-TS 라이브러리를 사용하여 ARIMA, SARIMAX, FB Prophet, VAR 및 ML 모델 개발

Python 코드 한 줄로 여러 시계열 예측 모델 학습

Automated Machine Learning (AutoML)은 기계 학습 파이프 라인의 일부 구성 요소를 자동화하는 것을 말합니다. AutoML은 일부 모델 개발 프로세스를 자동화하여 데이터 과학자의 워크 플로를 가속화합니다.

Related posts

Spotify의 마법 성분 : 기계 학습

Spotify의 마법 성분 : 기계 학습

면책 조항 :이 기사는 Spotify와 관련이 없으며 Spotify 및 현재 관련이 없을 수있는 과거 구조에 대한 확인되지 않은 정보로 구성 될 수 있습니다. 음악은 표현의 한 형태, 예술의 형태, 전체적인 문화 활동입니다.

2021 년 2 월에 읽을 4 가지 딥 러닝 논문

2021 년 2 월에 읽을 4 가지 딥 러닝 논문

신경 과학에서 자동 분화, 신경망 이론 및 신경 과정의 과소 적합에 이르기까지 현재 추구되고있는 다양한 딥 러닝 연구 흐름에 대한 더 나은 개요를 얻고 싶으십니까? 합리적으로 통과하기에는 열려있는 arXiv 탭이 너무 많습니까? 전체 동영상을 볼 시간이 너무 적습니까? 논문의 핵심 아이디어와 개념에 대한 간략한 요약 만 있다면. 그런 다음 '머신-러닝-콜라주'시리즈를 소개하게되어 기쁩니다.

내부의 관심 네트워크 그래프

수학에서 NumPy까지 단계별 가이드

내부의 관심 네트워크 그래프

그래프 신경망 (GNN)은 그래프 데이터에서 학습 할 수있는 표준 도구 상자로 등장했습니다. GNN은 콘텐츠 추천 또는 신약 발견과 같은 다양한 분야에서 영향이 큰 문제를 개선 할 수 있습니다.

분할에 대한 고정 2 부 : Python으로 이미지 분할을 수행하는 방법

분할에 대한 고정 2 부 : Python으로 이미지 분할을 수행하는 방법

안녕하세요! 이미지 분할에 대한이 짧은 시리즈의 첫 번째 부분을 읽지 않았다면 여기에서 읽으십시오. 이전 이야기에서 임계 값 및 색상 분할에 대해 논의 했으므로 2 부에서는 색도 분할과 이미지 차이에 중점을 둘 것입니다.