2013-05-19 5 views
8

지난 주 컴퓨터 학습을 배우기 시작했습니다. 모델 매개 변수를 추정하기 위해 그라디언트 디센트 스크립트를 만들려고 할 때, 적절한 학습 속도와 분산을 선택하는 방법에 문제가 생겼습니다. 다른 (학습 속도, 분산) 쌍이 다른 결과를 초래할 수 있다는 것을 발견했습니다. 너는 수렴조차 할 수 없다. 또한 다른 학습 데이터 세트로 변경하면 잘 선택 (학습 속도, 분산) 쌍이 작동하지 않을 수 있습니다. 예를 들어 (아래 스크립트), 학습률을 0.001로, 분산을 0.00001로 'data1'로 설정하면 적절한 theta0_guess와 theta1_guess를 얻을 수 있습니다. 그러나 '데이터 2'의 경우 수십 개의 (학습률, 분산) 쌍이 아직 수렴하지 못했을 때도 알고리즘 수렴을 할 수 없습니다.그라디언트 디센트 알고리즘에서 학습 속도와 분산을 결정하는 방법

누군가가 (학습 속도, 분산) 쌍을 결정하는 기준이나 방법이 있다고 말해 줄 수 있다면.

import sys 

data1 = [(0.000000,95.364693) , 
    (1.000000,97.217205) , 
    (2.000000,75.195834), 
    (3.000000,60.105519) , 
    (4.000000,49.342380), 
    (5.000000,37.400286), 
    (6.000000,51.057128), 
    (7.000000,25.500619), 
    (8.000000,5.259608), 
    (9.000000,0.639151), 
    (10.000000,-9.409936), 
    (11.000000, -4.383926), 
    (12.000000,-22.858197), 
    (13.000000,-37.758333), 
    (14.000000,-45.606221)] 

data2 = [(2104.,400.), 
    (1600.,330.), 
    (2400.,369.), 
    (1416.,232.), 
    (3000.,540.)] 

def create_hypothesis(theta1, theta0): 
    return lambda x: theta1*x + theta0 

def linear_regression(data, learning_rate=0.001, variance=0.00001): 


    theta0_guess = 1. 
    theta1_guess = 1. 


    theta0_last = 100. 
    theta1_last = 100. 

    m = len(data) 

    while (abs(theta1_guess-theta1_last) > variance or abs(theta0_guess - theta0_last) > variance): 

     theta1_last = theta1_guess 
     theta0_last = theta0_guess 

     hypothesis = create_hypothesis(theta1_guess, theta0_guess) 

     theta0_guess = theta0_guess - learning_rate * (1./m) * sum([hypothesis(point[0]) - point[1] for point in data]) 
     theta1_guess = theta1_guess - learning_rate * (1./m) * sum([ (hypothesis(point[0]) - point[1]) * point[0] for point in data]) 

    return (theta0_guess,theta1_guess) 



points = [(float(x),float(y)) for (x,y) in data1] 

res = linear_regression(points) 
print res 

답변

13

알고리즘을 수행하는 방법을 확인하는 가장 좋은 방법은 플로팅입니다. 컨버전스를 달성했는지 확인하려면 각 반복 후에 비용 함수의 진화를 플로팅 할 수 있습니다. 특정 반복을 통해 컨버전스가 많이 향상되지 않으면 다음 코드를 살펴보십시오.

다음 그래픽 플롯합니다
cost_f = [] 
while (abs(theta1_guess-theta1_last) > variance or abs(theta0_guess - theta0_last) > variance): 

    theta1_last = theta1_guess 
    theta0_last = theta0_guess 

    hypothesis = create_hypothesis(theta1_guess, theta0_guess) 
    cost_f.append((1./(2*m))*sum([ pow(hypothesis(point[0]) - point[1], 2) for point in data])) 

    theta0_guess = theta0_guess - learning_rate * (1./m) * sum([hypothesis(point[0]) - point[1] for point in data]) 
    theta1_guess = theta1_guess - learning_rate * (1./m) * sum([ (hypothesis(point[0]) - point[1]) * point[0] for point in data]) 

import pylab 
pylab.plot(range(len(cost_f)), cost_f) 
pylab.show() 

(learning_rate = 0.01와 실행, 분산 = 0.00001)

당신이 볼 수 있듯이, 천 반복 후 많은 개선을하지 않습니다. 비용 함수가 한 번의 반복에서 0.001 미만으로 감소하면 컨버전스를 선언하지만, 이는 내 경험에 기반합니다. 학습 속도가 당신이 너무 작은 경우

  • : 학습 속도, 당신은 또한이 두 가지를 비용 함수를 플롯하고 수행하는 방법을 참조하십시오 항상 기억한다 할 수있는 최선을 선택을위한

    학습 속도가 비용 함수는 모든 반복 감소하지 않을 수 있습니다 너무 큰 경우 속도가 느린 수렴

  • 을 얻고> 0.029과 분산 = 0.001이 될 것입니다 당신이 당신의 코드를 선택 learning_rate를 실행하면 따라서는

을 수렴하지 않습니다 이것들 중에서 cond, gradient descent가 수렴하지 않는 반면 learning_rate 값 < 0.0001, variance = 0.001을 선택하면 알고리즘이 수렴하는 데 많은 시간이 걸리는 것을 볼 수 있습니다. learning_rate와

하지 수렴 예 = learning_rate와 0.03

느린 수렴 예 = 0.0001 enter image description here

+0

귀하의 조언에 감사드립니다. 여전히 나는 확실하지 않은 한 가지가 있습니다. 적절한 (속도, 분산) 쌍을 얻는 유일한 방법을 계속 노력하고 있습니까? – zhoufanking

+0

GD가 얼마나 빨리 수렴 하는지를 확인하는 스크립트 (항상 1 차 미분을 계산하는 스크립트)를 할 수는 있지만, 결코 그런 짓을 한 적이 없다고 생각합니다. 알고리즘이 수행하는 작업과 수행 방법을 이해하는 것을 선호합니다. – jabaldonedo

0

는 기울기 하강 알고리즘의 수렴을 보장하는 방법은 무리가있다. 라인 검색은 그라디언트의 립시 (Lipschitz) 상수와 관련된 고정 된 스텝 크기 (즉, 함수의 경우입니다. 사용자와 같은 테이블의 경우 연속적인 값의 차이를 만들 수 있습니다), 각 반복 및 일부 다른. 그들 중 일부는 can be found here입니다.

+1

스택 오버플로에 오신 것을 환영합니다. 답을 요약하면 다음과 같습니다. 그런 식으로 링크가 부실 해지면 답은 완전히 쓸모가 없습니다. – michaelb958