2011-10-16 2 views
8

스탠포드 머신 학습 강의 (lecture 2 at around 25:00)에서 설명한 그라디언트 디센트 알고리즘에 대한 코드를 작성하려고합니다. 아래는 처음에 사용한 구현이며 강의에서 제대로 복사 한 것 같습니다. 그러나 큰 숫자 (>8)를 교육 집합에 추가하면 수렴되지 않습니다.그라디언트 디센트 알고리즘이 수렴하지 않습니다.

나는 숫자 X를 입력 해요, 그리고, 나는 단지 그것을 y=ax+ba=1=theta\[1\]b=0=theta\[0\] 수렴하려고 노력하고있어 순간 있도록 point (X,X)는 트레이닝 세트에 추가됩니다. 훈련 집합은 배열 xy입니다. 여기서 (x[i],y[i])은 포인트입니다.

void train() 
{ 
    double delta; 
    for (int i = 0; i < x.size(); i++) 
    { 
     delta = y[i]-hypothesis(x[i]); 
     theta[1] += alpha*delta*x[i]; 
     theta[0] += alpha*delta*1; 
    } 
} 

void C_Approx::display() 
{ 
    std::cout<<theta[1]<<"x + "<<theta[0]<<" \t "<<"f(x)="<<hypothesis(1)<<std::endl; 
} 

내가지고있어 결과의 일부

:

: I 입력 숫자, 그 다음 display()

1 
0.33616x + 0.33616 f(x)=0.67232 
1 
0.482408x + 0.482408  f(x)=0.964816 
1 
0.499381x + 0.499381  f(x)=0.998762 
1 
0.499993x + 0.499993  f(x)=0.999986 
1 
0.5x + 0.5 f(x)=1 

8을 통과 한 후에는 분기의 예 train() 몇 번을 실행

1 
0.33616x + 0.33616 f(x)=0.67232 
2 
0.705508x + 0.509914  f(x)=1.21542 
3 
0.850024x + 0.449928  f(x)=1.29995 
4 
0.936062x + 0.330346  f(x)=1.26641 
5 
0.951346x + 0.231295  f(x)=1.18264 
6 
0.992876x + 0.137739  f(x)=1.13062 
7 
0.932206x + 0.127372  f(x)=1.05958 
8 
1.00077x + 0.000493063 f(x)=1.00126 
9 
-0.689325x + -0.0714712  f(x)=-0.760797 
10 
4.10321e+08x + 4.365e+07  f(x)=4.53971e+08 
11 
1.79968e+22x + 1.61125e+21 f(x)=1.9608e+22 
12 
-3.9452e+41x + -3.26957e+40  f(x)=-4.27216e+41 

단계를 확장하는 제안 된 솔루션 here을 시도하여 비슷한 결과를 얻었습니다. 내가 뭘 잘못하고 있니?

답변

9

구현이 좋습니다. 일반적으로, 확률 적 구배 강하는 α가 너무 클 때 발산 할 수있다. 큰 데이터 세트로 할 수있는 것은 합리적으로 크기가 조정 된 무작위 샘플을 취하고 최상의 결과를 제공하는 α를 찾은 다음 나머지 부분에 사용하는 것입니다.

+0

무작위 샘플을 기반으로 한 α를 어떻게 결정하겠습니까? – howardh

+0

@howardh, 간단히 다른 값을 시도하고 작은 J (θ)로 빠르게 수렴하는 것을 선택하면됩니다. –

+0

그래서 원래의 훈련 세트에서 무작위로 선택한 새로운 데이터 세트를 만들고 해당 세트를 특정 α로 호출하여 train()을 호출하고 오류가 모든 단계에서 감소하지 않으면 α를 줄이고 반복합니까? – howardh

0

정확하게 이해하면 교육 집합의 줄 끝에 0이 아닌 그라데이션 만 있습니다. 라인에서 시작하지 않는다면 (실제로 트레이닝 포인트 중 하나에서 시작하십시오.) 라인을 찾을 수 없습니다. 당신은 항상 지역 최저입니다.

1

비용 기능이 증가하거나 감소하는 경우 일반적으로 alpha 값이 너무 큽니다. 어떤 alpha을 사용하고 있습니까?

alpha = 0.001으로 시작하여 수렴되는지 확인하십시오. 그렇지 않다면 다양한 alphas(0.003, 0.01, 0.03, 0.1, 0.3, 1)을 찾아 빠르게 수렴하는 것을 찾으십시오.

데이터 정규화는 정규화가 2+ 기능 (다 변수 선형 회귀 분석)에만 적용되는 기능 1 개 (theta[1])로는 도움이되지 않습니다.

작은 수의 기능에 대해서도 정상 방정식을 사용하여 정답을 얻을 수 있다는 점에 유의하십시오.

3

학습 속도가 너무 빠르기 때문에 (Java에서도) 동일한 문제가 발생했습니다.
간단히 말해서, 나는 α = 0.001을 사용하고 있었고 실제 수렴을 보려면 0.000001으로 밀어 넣어야했습니다.

물론 이러한 값은 데이터 세트에 연결됩니다.

0

컨버전스를 보장하기 위해 역 추적 회선 검색을 사용하십시오. 구현이 매우 간단합니다. 참조를 위해 Stephen Boyd, 볼록 최적화를 참조하십시오. 역 추적 선 검색에 대해 표준 알파, 베타 값을 선택할 수 있습니다 (예 : 0.3 및 0.8).

관련 문제