서문
이 글의 코드는 제 깃허브에서 구할 수 있습니다:
/paulQuei/gradient_descent
이 글의 알고리즘 예제는 Python 언어로 구현되었으며, 구현에는 numpy와 matplotlib가 사용됩니다. 이 도구에 익숙하지 않은 경우 웹에서 직접 검색해 보시기 바랍니다. 이 두 도구에 익숙하다면 온라인에서 직접 튜토리얼을 검색해 보세요.
최적화
대부분의 학습 알고리즘은 어떤 형태로든 최적화를 포함합니다. 최적화는 함수를 최소화하거나 최대화하기 위해 x를 변경하는 작업입니다.
우리는 보통 대부분의 최적화 문제에서 최소화를 언급합니다. 최대화는 최소화를 통해 달성할 수 있습니다.
최소화 또는 최대화할 함수를 목적 함수 또는 기준으로 간주합니다.
일반적으로 위첨자 *를 사용하여 최소화 또는 최대화할 함수의 x값을 나타냅니다.
[x^* = arg; minf(x)]
최적화 자체는 매우 큰 주제입니다. 관심이 있다면 수치 최적화 및 운영 연구에 관한 책에서 배울 수 있습니다.
모델과 가상 함수
모든 모델은 잘못되었지만 일부는 유용합니다. 조지 에드워드 펠햄 박스
모델은 분석할 데이터에 대한 가정이며, 특정 문제를 해결하기 위해 데이터로부터 학습하는 것으로 머신 러닝의 핵심 개념입니다.
일반적으로 한 문제에 대해 많은 수의 모델을 사용할 수 있습니다.
이 문서에서는 이 측면에 대해 자세히 설명하지 않습니다. 다양한 모델에 대해서는 머신 러닝 관련 서적을 참조하시기 바랍니다. 이 글에서는 가장 간단한 선형 모델을 기반으로 한 경사 하강 알고리즘에 대해서만 설명하겠습니다.
여기서는 먼저 지도 학습에서 사용되는 세 가지 일반적인 표기법을 소개합니다.
m은 훈련 샘플의 수를 나타냅니다
x는 입력 변수 또는 특징을 나타냅니다.
y는 출력 변수 또는 목표 값을 나타냅니다.
샘플에는 많은 특징이 있을 수 있으므로 일반적으로 x와 y는 벡터입니다. 그러나 학습 초기에는 이해하기 쉽도록 일시적으로 특정 값으로 이해할 수 있습니다. 훈련 세트에는 많은 샘플이 포함되어 있으며, 이 샘플을 I번째 샘플로 표현하는 데 사용합니다.
x는 데이터 샘플의 특성이고 y는 목표 값입니다. 예를 들어 주택 가격을 예측하는 모델에서 X는 면적, 층, 위치 등 주택에 대한 다양한 정보입니다. Y는 집의 가격입니다. 이미지 인식 작업에서 X는 그래프의 모든 픽셀 데이터이고 Y는 이미지에 포함된 대상 물체입니다.
우리는 X를 Y에 매핑하는 함수를 찾고자 합니다. 이 함수는 해당 Y를 예측하기에 충분해야 하며, 역사적인 이유로 이 함수를 가설 함수라고 부릅니다.
학습 과정은 아래와 같습니다. 즉, 먼저 알고리즘 모델을 기존 데이터(학습 집합이라고 함)로 학습시킨 다음 모델의 가설 함수를 기반으로 새로운 데이터를 예측합니다.
선형 모델은 이름에서 알 수 있듯이 직선의 형태로 패턴을 설명하려고 합니다. 선형 모델의 가정 함수는 다음과 같습니다.
[h _ { \ 세타 }(x) = \ 세타 _ { 0 } + \ 세타 _ { 1 } * x]
이 공식은 누구에게나 간단해야 합니다. 실제로 그려보면 직선이 됩니다.
다음 그림은 구체적인 예시입니다.
실제 머신 러닝 프로젝트에서는 많은 데이터를 보유하게 됩니다. 이러한 데이터는 데이터 소스에서 가져옵니다. 이러한 데이터는 CSV 파일에 저장되거나 다른 형태로 패키징되어 있습니다.
하지만 데모용인 이 문서에서는 몇 가지 간단한 코드를 사용하여 필요한 데이터를 자동으로 생성합니다. 계산하기 쉽도록 데모용 데이터의 양도 적습니다.
numpy를 np로 가져오기
max_x = 10
data_size = 10
theta_ 0 = 5
theta_1 = 2
데이터 가져오기 정의 :
x = np.linspace(1, max_x, data_. size)
noise = np.random.normal(0, 0.2, len(x))
y = theta_0 + theta_1 * x + noise
Return x, y
이 코드는 매우 간단합니다. x가 [1, 10] 정수 범위인 10개의 데이터를 생성합니다. 이에 해당하는 y는 다음과 같은 선형 모델의 형태로 계산됩니다. 실제 데이터는 다양한 요인에 의해 교란되는 경향이 있으므로 의도적으로 y에 가우스 노이즈를 추가하므로 최종 y 값은 원본과 약간 달라집니다.
최종적으로 데이터는 다음과 같습니다.
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
y = [6.66, 9.11, 11.08, 12.67, 15.12, 16.76, 18.75, 21.35, 22.77, 24.56]
이를 플로팅할 수 있습니다. 아래와 같이 10개의 데이터를 그려서 시각화할 수 있습니다.
데모에 사용된 데이터는 공식을 사용하여 계산한 것입니다. 하지만 실제 엔지니어링에서는 데이터에서 모델의 매개 변수를 학습해야 합니다. 따라서 여기서는 선형 모델의 두 매개변수가 무엇인지 모르지만 알고리즘의 형태로 얻었다고 가정해 보겠습니다.
마지막으로 알려진 매개변수와 비교하여 알고리즘이 올바른지 확인합니다.
위 데이터를 사용하여 모델을 설명하기 위해 직선을 그려볼 수 있습니다.
예를 들어 다음과 같이 수평 직선을 그립니다.
이 수평선은 데이터에서 너무 멀리 떨어져 있고 매우 불일치합니다.
그런 다음 다른 대각선을 그릴 수 있습니다.
처음에 그린 대각선도 맞지 않을 수 있습니다.
최종적으로 다음과 같이 시도하고 또 시도하여 가장 잘 맞는 것을 찾습니다.
경사 하강 알고리즘의 계산 과정은 단계별로 반복하여 최종 결과에 가까워지려는 본능적인 시도와 유사합니다.
값 함수
맞춤 데이터를 직선으로 맞추기 위해 여러 번 시도했습니다.
2차원 평면의 직선은 두 개의 매개변수에 의해 고유하게 결정될 수 있으며, 두 매개변수의 결정은 곧 모델의 결정이기도 합니다. 그렇다면 모델이 데이터에 얼마나 잘 맞는지 어떻게 설명할 수 있을까요? 정답은 바로 비용 함수입니다.
비용 함수는 학습 모델과 실제 결과 사이의 편차 정도를 설명합니다. 위의 세 가지 그래프를 예로 들어보겠습니다. 마지막 그래프의 빨간색 선은 첫 번째 가로 녹색 선에 비해 편차(비용)가 더 작아야 합니다.
우리는 가설 함수가 가능한 한 데이터에 가깝게, 즉 비용 함수가 가능한 한 작게 나오기를 원합니다. 이를 위해서는 결과를 최적화해야 하며, 기울기 하강은 최소값을 찾는 한 가지 방법입니다.
비용 함수는 손실 함수라고도 합니다. 각 샘플에 대해 가설 함수는 추정치를 계산하며, 우리는 종종 이 추정치로 표현합니다. 즉
자연히 모델과 실제 값 사이의 편차 정도를 설명하기 위해 다음과 같은 공식을 생각하게 됩니다.
[(h_\theta(x^i)-y^i)^2 =(\와이드hat{y}^{i}-y^i)^2 =(\ theta _ { 0 }+\ theta _ { 1 } * x^{i}-y^{i})^. 2]
이 값은 모델의 추정치가 아니라 실제 데이터의 값이라는 점에 유의하세요. 전자는 위 그림에서 이산 점의 Y 좌표에 해당하고 후자는 선상의 이산 점의 투영 점의 Y 좌표에 해당합니다.
모든 데이터에는 편차 값이 있으며, 비용 함수는 모든 샘플의 평균을 구한 편차로서 다음과 같이 계산됩니다.
[l(\theta) = \ frac { 1 } { m } \sum_{i=1}^{m}(h_\theta(x^i)-y^i)^2 = \ frac { 1 } { m } \sum_{i=1} ^{m}(\theta_{0} + \theta _ { 1 } * x^{i}-y^{i})^2]
손실 함수가 더 작다는 것은 가상의 함수 추정치가 실제 값에 더 가깝다는 것을 의미합니다. 그렇기 때문에 손실 함수를 최소화해야 합니다.
모델마다 다른 손실 함수를 사용할 수 있습니다. 예를 들어 로지스틱 회귀에서는 다음과 같은 함수를 가정합니다. 비용 함수는 다음과 같습니다. 위의 방정식을 사용하여 비용 함수를 구현하는 함수를 작성할 수 있습니다.
비용 _ 함수 (x, y, t0, t1) 정의:
cost _ sum = 0
범위 I(len(x))의 경우:
cost _ item =. NP . power(t0+t 1 * x[I]-y[I], 2)
cost_total+=cost_item
비용_총액/대출(x)을 반환합니다.
이 함수의 코드는 설명할 필요가 없으며 위의 계산에 기반하기 때문입니다.
다음과 같이 다양한 합산 조합을 선택하여 비용 함수의 값을 계산하고 결과를 도출할 수 있습니다.
numpy를 np로 가져오기
matplotlib.pyplot을 plt로 가져오기
matplotlib에서 cm을 가져오기
mpl_에서 cm을 가져옵니다. toolkits.mplot3d에서 Axes3D로 가져온
theta_ 0 = 5
theta_1 = 2
def draw_cost(x, y):
fig = PLT . figure(figsize = (10, 8))
ax = fig.gca(projection = '3d ')
dispersion_count = 100
radius = 1
t0 _ range = NP . Lin 공간(세타 _ 0-반경, 세타 _ 0+반경, 분산_수)
t 1 _ 범위 = NP . Lin 공간(세타 _ 1-반경, 세타 _ 1 + 반경, scatter_count)
cost = np.zeros((len(t0_범위), len(t1_범위)))
최적 범위의 경우 (len(t0_범위)):
최적 범위의 경우 (len(t1_range)):
cost[a][b] = cost_function(x, y, t0 _range[a], t 1 _range[b])
t0, t1 = np.meshgrid(t0_range, t1_range)
ax.set_xlabel('theta _0 ')
ax.set_ylabel('theta_1 ')
ax.plot_surface(t0, t1, cost, cmap=cm.hsv)
이 코드에서는 합계 범위를 각각 100회 샘플링한 다음 다른 조합 쌍에 대한 비용 함수 값을 계산합니다. .
모든 점에 대한 비용 함수 값을 플롯하면 결과는 다음과 같습니다.
이 플롯에서 [5, 2]에 가까워질수록 결과(편차)가 작아지는 것을 볼 수 있습니다. 반대로 거리가 멀어질수록 효과가 커집니다.
직관적인 설명
위 그래프에서 비용 함수는 위치에 따라 결과가 달라진다는 것을 알 수 있습니다.
3D 관점에서 보면 이는 지면의 기복과 동일합니다. 가장 높은 곳은 산 정상과 같습니다.
그리고 우리의 목표는:어느 지점에서든 그래프의 가장 낮은 지점(가장 낮은 생성 값)으로 가는 경로를 빠르게 찾는 것입니다.
그래디언트 하강의 알고리즘 프로세스는 언덕 정상에서 빠르게 내려오는 것과 동일합니다.
인생에서 가장 가파른 길을 택하는 것이 언덕을 가장 빨리 내려가는 길이라고 생각하는 것은 자연스러운 일입니다. 이는 아래 그림에서 볼 수 있습니다.
주의 깊은 독자라면 이 그림에 대해 다음과 같은 많은 질문이 생길 것입니다.
각 단계는 얼마나 멀리 가야 하는가?
언덕 중간쯤에 있는 플랫폼에 머물 수 있는가?
이 질문들은 이 글에서 다음에 다룰 질문들입니다.
알고리즘 설명
경사 하강 알고리즘의 첫 번째 포인트는 하강 방향, 즉 경사도를 결정하는 것입니다.
그래디언트를 나타내는 데 자주 사용합니다.
2차원 공간의 커브에서 그라데이션은 접선의 방향입니다.
고차원 공간의 함수의 경우 그라데이션은 모든 변수의 부분 도함수에 의해 결정됩니다.
식식은 다음과 같습니다:
[\ nabla f({ \ theta })=(\ frac { \ partial f({ \ theta })} { \ partial \ theta _ 1 }, \ frac { \ partial f({ \ theta })} { \ partial \ theta _ 2 } , ... , \ frac { \ 부분 f({ \ theta })} { \ 부분 \ theta _ n })]
기계 학습에서는 주로 경사 하강 알고리즘을 사용하여 다음과 같이 비용 함수를 최소화합니다.
[\theta ^* = arg minimise L(\theta)]
주위 l은 비용입니다. 함수와 매개변수입니다.
경사 하강 알고리즘의 주요 논리는 단순히 매개변수가 수렴할 때까지 경사 방향으로 하강하는 것입니다.
유념할 사항:
[\theta^{k+1 } _ I = \theta^{k}_i-\Ramda\nabra f(\theta^{k})]
이에서 첨자 I는 I 번째 파라미터를 나타냅니다. 위첨자 k는 k번째 단계의 계산 결과를 나타내며, k번째 거듭제곱이 아닙니다. 이 점을 이해하면 아래 공식에서 위 첨자 k를 생략할 수 있습니다.
수렴은 함수의 변화율이 매우 작다는 것을 의미합니다. 어느 정도를 선택하는 것이 적절한지는 특정 프로젝트에 따라 다릅니다. 데모 프로젝트에서는 0.01 또는 0.001의 값을 선택할 수 있습니다. 다른 값은 알고리즘의 반복 횟수에 영향을 미치는데, 경사 하강이 끝날 때 점점 더 평탄도에 가까워지고 이 시점에서 함수의 변화율이 점점 더 작아지므로 이 값에 따라 알고리즘의 반복 횟수가 달라집니다. 더 작은 값을 선택하면 알고리즘의 반복 횟수가 급격히 증가할 수 있습니다.
공식에서는 이를 학습 속도라고도 하는 단계 크기라고 합니다. 이 값은 각 단계가 얼마나 멀리 진행되는지를 결정하며, 아래에서 이 값에 대해 자세히 설명하겠습니다. 지금은 0.01 또는 0.001과 같은 고정된 값이라고 가정할 수 있습니다.
특정 프로젝트에서는 알고리즘을 무한히 실행하지 않으므로 일반적으로 반복 횟수에 최대 상한을 설정합니다.
선형 회귀를 위한 경사 하강
위와 같은 지식을 바탕으로 선형 모델 비용 함수에 대한 경사 하강 알고리즘 구현으로 돌아갈 수 있습니다.
먼저, 비용 함수를 기반으로 다음과 같이 기울기 벡터를 구할 수 있습니다.
[\ nabla f({ \ theta })=(\ frac { \ partial l(\ theta)} { \ partial \ theta _ { 0 } }, \ frac { \ partial l(\ theta)} { \. partial \ theta _ { 1 } })=(\ frac { 2 } { m } \ sum_{i=1}^{m}(\theta_{0}+\ theta _ { 1 } * x^{i}-y^{i}), \ frac { 2 } { m } \sum_{i=1}^{m}(\theta_{0}+\ theta _ { 1 } *) x^{i}-y^{i})x^{i})]
그런 다음, 각 부분 도함수를 반복 공식으로 가져와 다음과 같이 구합니다.
[\ theta _ { 0 }:= \ theta _ { 0 }-\ lambda \ frac { \ partial l(\ theta _ { 0 })} { \ partial \ theta _ { 0 }-\ frac { 2 \ lambda } { m } \sum_{i=1}^{m}(\ theta _ { 0 }+\ theta _ { 1 } * x^{i}-y^{i})\ \ theta _ { 1 }:= \ theta _ { 1 }-\ lambda \ frac { \ partial l(\ theta
이를 통해 경사 하강 알고리즘을 코드로 구현할 수 있으며, 알고리즘의 로직은 복잡하지 않습니다.
learning_rate = 0.01
def gradient_descent(x, y):
t0 = 10
t1 = 10
delta = 0.001
< /p>
For range time(1000):
sum1 = 0
sum2 = 0
For range I(len(x)):
sum 1+=(t0+t 1 * x[I]-y[I])
sum 2+=(t0+t 1 * x[I]-y[I]) * x[I]
t0 _ = t0-2 * 학습 _율 * 합계 1/len(x)
t 1 _ = t 1-2 * 학습 _율 * 합계 2/len(x)
Print ('times:{}, asymptote:[{}, {}]'. Format(times, t0_, t1_)
if(ABS(t0-t0 _)& lt; 델타 및 ABS(t 1-t 1 _)& lt; ∆):
print('그라데이션 하강 완료')
return t0_, t1_<
t0 = t0_
t1 = t1_
print('그라데이션 하강 너무 많이')
return t0, t1
코드는 다음과 같이 설명됩니다.
우리는 시작점으로 10을 임의로 선택합니다.
최대 1000회의 반복을 설정합니다.
결집 범위는 0.001로 설정합니다.
학습 단계는 0.01로 설정합니다.
알고리즘을 반복하는 동안 얻은 선형 패턴을 그리면 다음과 같은 동적 다이어그램을 얻을 수 있습니다.
최종적으로 알고리즘은 다음 결과를 얻습니다.
횟수: 657, asymptote: [. 5.196562662718697, 1.952931052920264]
Number:658, Gradient:[5.195558390180733, 1.9530753071808193]
Number:659, Gradient:[5.194558335124868. 1.9532189556399233]
Number:660, asymptote:[5.193562479839619, 1.953620008416623]
그래디언트 하강 콜레이션
출력에서 볼 수 있듯이 알고리즘은 660회 반복 후에 수렴합니다. 이 시점에서 결과[5.19356247939619, 1.95362000416623]는 목표 값[5, 2]에 가깝습니다. 더 높은 정확도가 필요한 경우 델타 값을 더 작게 만들 수 있지만 당연히 더 많은 반복이 필요합니다.
고차원 확장
이 예제는 2차원이지만, 고차원에서도 상황은 비슷합니다. 이 역시 반복 공식에 따라 계산할 수 있습니다.
[\ theta _ { I } = \ theta _ { I }-\sum_{i=1}^{m}(h_\theta(x^{k})-y^k)x_i^k]
여기서 첨자 I는 I 번째 파라미터를 나타내고 위첨자 k는 k 번째 데이터를 나타냅니다.
경사 하강 계열 BGD
위에서 알고리즘의 각 반복이 모든 샘플을 통과해야 한다는 것을 알 수 있습니다. 이 방식을 일괄 경사 하강 또는 줄여서 BGD라고 합니다. 데모 예시에서는 데이터가 10개만 있어도 문제가 없습니다. 하지만 데이터 세트의 수가 수백만 개 또는 수천만 개에 달하는 실제 프로젝트에서는 반복당 계산 노력이 매우 높아질 수 있습니다.
따라서 다음 두 가지 변형이 있습니다.
역사적 경사 하강(줄여서 SGD)이라고 부르는 이 알고리즘은 샘플 집합에서 한 번에 하나의 샘플을 선택하여 계산합니다. 당연히 이 알고리즘은 각 단계마다 계산량이 훨씬 적습니다.
이 알고리즘은 다음과 같이 공식화됩니다.
[\ theta _ { I } = \ theta _ { I }-\ lambda \ frac { \ partial l(\ theta)} { \ partial \ theta _ I } = \ theta _ { I }-\lambda(h_\theta(x^k)-y^k )x_i^k]
물론 알고리즘의 계산 복잡성을 줄이면 알고리즘의 결과가 무작위로 얻은 데이터에 크게 의존하게 되므로 알고리즘의 최종 결과가 최적이 아닐 수 있다는 대가가 따릅니다.
MBGD
위 두 가지 접근 방식은 사실 두 가지 극단적인 방식입니다. 하나는 모든 데이터를 한꺼번에 사용하고 다른 하나는 한 번에 하나의 데이터만 사용합니다.
한 번에 반복할 데이터의 작은 부분을 선택하는 두 가지 방법을 모두 사용하는 것이 자연스럽습니다. 이렇게 하면 데이터 세트가 너무 커서 반복당 계산이 너무 많이 발생하는 문제와 단일 데이터가 알고리즘에 미치는 영향을 모두 방지할 수 있습니다.
이 알고리즘을 미니 배치 경사 하강(Minibatch Gradient Descent, 줄여서 MBGD)이라고 합니다.
이 알고리즘은 다음과 같이 공식화됩니다.
[\ theta _ { I } = \ theta _ { I } - \sum_{i=a}^{a+b}(h_\theta(x^k)-y^k)x_i^k]
물론 가정할 수 있는 것은 다음과 같습니다. SGD는 미니 배치 1의 특수한 경우입니다.
위에서 설명한 알고리즘의 변형은 어떻게 선택하나요?
어른스트 우는 다음과 같이 제안합니다.
샘플 수가 적은 경우(예: 2,000개 이하) BGD를 선택하고, 샘플 수가 많은 경우 MBGD(예: 64, 128, 256, 512)를 선택합니다.
아래 표는 딥러닝 최적화의 세 가지 알고리즘을 비교한 것입니다.
방법 정확도, 업데이트 속도, 메모리 사용량, 온라인 학습, BGD는 좋음, 느림, 높음 또는 낮음, SGD는 좋음, 발표, MBGD는 좋음, 중간, 중간.
알고리즘 최적화
방정식 7은 알고리즘의 기본 형태이며 많은 사람들이 이에 대해 더 많은 연구를 해왔습니다. 다음으로 경사 하강 알고리즘에 대한 몇 가지 최적화 방법을 설명합니다.
운동량 효과
가스는 기체입니다. 이 알고리즘의 기본 개념은 동적 모델을 사용하는 것입니다. 알고리즘의 각 반복은 최종 속도를 기반으로 합니다.
이 알고리즘의 공식은 다음과 같습니다:
[v^t = \ 감마 v^{t-1 }+\ 람다 \ 나블라 f(\ 세타)\ 세타 = \ 세타-v _ t]
식 7을 비교하면, 이 알고리즘의 주요 차이점은 각 순간이 이전 순간에 영향을 받는다는 점을 알 수 있습니다.
일반적으로 모멘텀 알고리즘은 변수 V를 속도 액터로 도입하여 매개변수 공간에서 매개변수 움직임의 방향과 속도를 나타냅니다. 속도는 음의 기울기의 기하급수적으로 감쇠하는 평균으로 설정됩니다. 모멘텀이라는 이름은 물리적 비유에서 유래했습니다. 뉴턴의 운동 법칙에 따르면 음의 기울기는 매개변수 공간에서 입자를 움직이게 하는 힘입니다. 물리학에서 운동량은 질량 곱하기 속도로 정의됩니다. 운동량 학습 알고리즘에서는 단위 질량이라고 가정하므로 속도 벡터 V도 입자의 운동량으로 생각할 수 있습니다.
이 값은 상수인 0에서 0.9로 설정하는 것이 좋습니다.
다음 그림은 모멘텀 알고리즘의 효과를 비교한 것입니다.
모멘텀 효과는 원래 알고리즘을 약간 수정하여 증가시킬 수 있습니다.
def gradient _ descent _ with _ momentum(x, y):
t0 = 10
t1 = 10
delta = 0.001
v0 = 0
v1 = 0
감마 = 0.9
범위 시간(1000):
sum1 = 0
sum2 = 0
범위 I(len(x)):
sum 1+=(t0+t 1 * x[I]-y[I])
sum 2+=(t0+t 1 * x[I]-y[I])* x[I]
v0 = 감마 * v0 + 2 * 학습 _율 * sum1 / len(x)
v 1 = 감마 * v 1+2 * 학습 _율 * sum 2 / len(x)
< p>t0_ = t0 - v0t1_ = t1 - v1
Print('times:{}, asymptote:[{}, {}]'. Format(times, t0_, t1_)
if(ABS(t0 - t0 _) & lt; 델타 및 ABS(t 1 - t 1 _) & lt; ∆):
Print('그라데이션 하강 완료')
return t0_, t1_<
t0 = t0_
t1 = t1_
print('그라데이션 하강 너무 많이')
return t0, t1
다음은 알고리즘의 출력입니다:
횟수:125, 그라데이션: [ 4.955453758569991, 2.00005017897775]
횟수:126, 점근:[4.955309381126545, 1.996928964532015]
횟수:127, 점근:[4.9542964317327005. 1.98674828684156]
Count:128, Gradient:[4.9536358220657, 1.9781180992510465]
Count:129, Gradient:[4.95412496254411, 1.978858350530971]
그라데이션 하강 콜레이션
결과에서 볼 수 있듯이, 개선된 알고리즘은 129번의 반복만으로 수렴합니다. 기존 660회보다 훨씬 빠른 속도입니다.
마찬가지로 알고리즘의 계산 과정을 동적 다이어그램으로 만들 수 있습니다.
개선된 알고리즘과 기존 알고리즘의 가장 큰 차이점은 목표 값을 찾을 때 최종 결과에서 위아래로 점프하지만 뒤로 갈수록 점프 폭이 작아지는데, 이는 운동량에 의한 효과입니다.
학습 속도 최적화
이 시점에서 학습 속도가 어떻게 설정되는지 궁금할 수 있습니다.
사실 이 값의 선택은 약간의 경험이나 반복을 통해 결정할 수 있습니다.
딥러닝은 "과학이라기보다는 예술에 가깝기 때문에 이 주제에 대한 대부분의 가이드를 주의 깊게 참조해야 합니다."라는 책에서 이렇게 설명합니다. . 핵심은 이 값이 너무 크거나 작아서는 안 된다는 것입니다.
이 값이 너무 작으면 각 반복의 단계 크기가 작아져 알고리즘이 여러 번 반복해야 하는 결과를 초래합니다.
그렇다면 어떻게 해야 할까요? 그 결과 알고리즘이 결과를 중심으로 앞뒤로 진동하지만 목표 지점에 도달하지 못할 수 있습니다.
사실 학습률의 값은 반드시 상수가 아니며, 이 값을 설정하기 위한 많은 연구가 진행되어 왔습니다.
다음은 알고리즘에 대한 몇 가지 일반적인 개선 사항입니다.
AdaGrad
AdaGrad는 적응형 그라데이션의 약자로, 알고리즘은 각 파라미터에 대해 서로 다른 학습 속도를 설정합니다. 과거 그라데이션의 제곱합을 계산의 기초로 사용합니다.
알고리즘의 공식은 다음과 같습니다.
[\ theta _ I = \ theta _ I-\ frac { \ lambda }
이를 세미콜론 아래의 근에 변화가 있는 7과 대조해 보십시오.
근 부호에는 두 개의 기호가 있는데, 그 중 두 번째 기호는 잘 알려진 기호입니다. 0으로 나누지 않도록 인위적으로 도입한 작은 상수입니다. 예를 들어 0.005438+0으로 설정할 수 있습니다.
첫 번째 기호의 식은 다음과 같이 전개됩니다.
[g _ t = \ sum _ { I = 1}^{t} \nabla f(\ theta){ I } \nabla f(\theta){i}^{T}]
이 값의 값은 의 값은 실제로 히스토리에 있는 각 그라데이션의 제곱의 합을 누적한 값입니다.
AdaGrad 알고리즘은 학습 중에 학습 속도를 자동으로 조정하여 빈도가 낮은 매개변수에는 더 높은 학습 속도를, 반대로 빈도가 높은 매개변수에는 더 낮은 학습 속도를 사용할 수 있습니다. 따라서 Adagrad는 희소 데이터를 처리하는 데 매우 적합합니다.
그러나 이 알고리즘의 단점은 학습 속도가 매우 작아져 알고리즘이 매우 느리게 수렴한다는 것입니다.
이 알고리즘에 대한 시각적 설명은 이홍이 리 교수의 동영상 강좌인 ML 강의 3-1: 그라디언트 하강에서 확인할 수 있습니다.
RMSProp
RMS는 루트-평균-제곱의 약자로, 인공지능의 대부인 제프 힌튼이 제안한 적응형 학습 속도 방법입니다. Adagrad가 모든 이전 그라데이션의 제곱을 더하는 반면, RMSProp은 해당 평균만 계산하므로 AdaGrad 알고리즘의 학습 속도 감소 문제를 완화할 수 있습니다. 문제를 완화할 수 있습니다.
이 알고리즘의 공식은 다음과 같습니다.
[e[\nabla f(\theta_{i})^2]^{t} = \gamma e[\nabla f(\theta_{i})^2]^{t-1 }+(1-\gamma)(\nabla f(\theta_{i})^{t})^{2} \ theta _ I = \. theta _ I-\frac{\lambda}{\sqrt{e[g^2]^{t+1}+\엡실론 } } \nabla f(\theta_{i})]
유사하게, 0으로 나누지 않기 위해 도입된 것입니다. 감쇠 매개변수이며 일반적으로 0.9로 설정됩니다.
이 값은 순간 t에서 제곱된 기울기의 평균입니다.
성경과 꾸란의 전통에서 아담(인류 최초의 사람의 이름
아담은 적응 모멘트 추정의 약어입니다. 1차 모멘트 추정과 기울기의 2차 모멘트 추정을 사용하여 각 파라미터의 학습 속도를 동적으로 조정합니다.
아담의 장점은 편향 보정 후 각 반복에 대한 학습률 범위가 있어 파라미터를 더 안정적으로 만든다는 것입니다.
[m^{t} = \ beta _ { 1 } m^{t-1}+(1-\ beta _ { 1 })\nabla f(\ theta)\ v^{t} = \ beta _ { 2 } v^{t-1}+(1-\ beta _ { 2 })\nabla f(\ theta)^2 \\ \
[m^{t} = \ beta_{ 1 } m^{t-1}+(1-\ beta _ { 1 })\nabla f(\ theta)\ v^{t} = \ beta_{ 2 } v^{t-2 widehat{m}^{t} = \frac{m^{t}}{1-\beta^{t}_1} \ \ \ wide hat { v } { t } = \ frac { v { t } } { 1-\ beta { t } _ 2 } \ \ n
, 각각 기울기의 1차 모멘트 추정치 및 2차 모멘트 추정칩니다. 예에 대한 보정은 기대치에 대한 편향되지 않은 추정치로 근사화할 수 있습니다.
아담 알고리즘의 작성자는 기본값 0.9, 기본값 0.999, 기본값 0.999를 제안합니다.
실제로 Adam은 일반적으로 예측을 매우 빠르게 얻기 위해 사용됩니다.
최적화 요약
여기에 몇 가지 최적화 알고리즘이 나열되어 있습니다. 어떤 알고리즘이 가장 좋다고 말하기는 어렵고, 시나리오에 따라 다른 알고리즘이 적합합니다. 실제 프로젝트에서는 어떤 알고리즘을 선택할지 결정하기 위해 하나씩 시도해봐야 할 수도 있습니다. 이 과정은 현재 인공지능 프로젝트가 거쳐야 하는 과정 중 하나이기도 합니다.
사실, 이 분야의 연구는 그 이상입니다. 관심이 있으시다면 Sebastian Ruder: 경사 하강 최적화 알고리즘의 개요 논문이나 딥러닝 최적화에 대한 슬라이드를 통해 더 많은 연구를 살펴볼 수 있습니다.
지면 관계상 여기서는 반복하지 않겠습니다.
알고리즘의 한계
그래디언트 하강 알고리즘에는 몇 가지 한계가 있습니다. 첫째, 함수가 미분 가능해야 하며, 미분 불가능한 함수에는 이 방법을 사용할 수 없습니다.
또한 경우에 따라 경사 하강 알고리즘은 극한점에 가까워질수록 수렴 속도가 느려지거나 Z자형 진동을 생성할 수 있습니다. 학습 속도를 조정하여 이러한 문제를 방지해야 합니다.
또한 경사 하강은 다음 두 가지 유형의 문제에 직면합니다.
국부적 최소값
국부적 최소값이란 찾은 최소값이 전 세계가 아닌 한 지역에서만 최소값이 된다는 것을 의미합니다. 아래 그림에서와 같이 알고리즘의 시작점이 임의적이기 때문에 국부 최소값에 쉽게 빠질 수 있습니다.
산 정상에서 내려갈 때 처음 도착한 플랫폼이 산의 기슭이 아니라 산의 절반 정도에 불과할 수 있는 것과 같습니다.
알고리즘의 시작점은 알고리즘이 얼마나 빨리 수렴하고 로컬 최소값으로 떨어질지 여부를 결정합니다.
나쁜 소식은 어떤 지점이 좋은 시작점인지 결정하는 데 특별히 좋은 방법이 없는 것 같다는 것입니다. 여러 무작위 지점에서 여러 번 시도하는 것이 좋은 방법일 수 있으며, 이 때문에 최적화 알고리즘에 특히 많은 시간이 소요됩니다.
그러나 좋은 소식은 다음과 같습니다.
볼록 또는 오목 함수의 경우 국부적인 극한이라는 것은 존재하지 않습니다. 국부적 극한은 반드시 전역적 극한이어야 합니다.
최근의 일부 연구에 따르면 일부 국부 극값은 생각만큼 나쁘지 않으며, 글로벌 극값이 가져오는 결과와 매우 가깝다는 사실이 밝혀졌습니다.
새들 포인트
국부적 최소값 외에도 경사 하강 중에 발생할 수 있는 또 다른 상황은 새들 포인트입니다. 새들 포인트는 경사도가 0이지만 함수의 극단값이 아닌 지점을 찾는 경우로, 그 주변에 더 작은 값과 더 큰 값이 모두 존재합니다. 안장과 같습니다.
다중 확률 함수는 다음과 같은 특성을 나타냅니다. 저차원 공간에서는 국부적 극단이 일반적입니다. 그러나 고차원 공간에서는 국부 극값이 드물고 안장점이 일반적입니다.
하지만 안장점의 경우 수학적 방법인 헤시안 행렬을 사용하여 안장점을 결정할 수 있습니다. 여기서는 이에 대해 자세히 설명하지 않으므로 관심 있는 독자는 여기에 제공된 여러 링크를 통해 계속 탐색할 수 있습니다.
참고자료 및 추천 자료
Wikipedia:경사 하강
Sebastian Ruder:경사 하강 최적화 알고리즘 개요
Enda Wu:머신 러닝.
Enda Wu:딥러닝
Peter Fleck:머신러닝
홍이 리 - ml 강의 3-1:경사 하강
PDF:홍이 리 경사 하강
딥러닝의 최적화 소개:경사 하강
딥러닝의 최적화 소개:모멘텀, RMSProp. 및 Adam
스토캐스틱 경사 하강-소량 배치 등
Jianping Liu의 바이날 경사 하강 방법 개요
부분 미분, 방향 미분, 경사, 다변량 함수의 미분 사이의 관계에 대해 생각하기
[머신러닝] 경사 하강 방법의 3가지 형태, BGD, SGD, MBGD
저자:Paul - https://paul.pub/gradient-descent/