지난 주 컴퓨터 학습을 배우기 시작했습니다. 모델 매개 변수를 추정하기 위해 그라디언트 디센트 스크립트를 만들려고 할 때, 적절한 학습 속도와 분산을 선택하는 방법에 문제가 생겼습니다. 다른 (학습 속도, 분산) 쌍이 다른 결과를 초래할 수 있다는 것을 발견했습니다. 너는 수렴조차 할 수 없다. 또한 다른 학습 데이터 세트로 변경하면 잘 선택 (학습 속도, 분산) 쌍이 작동하지 않을 수 있습니다. 예를 들어 (아래 스크립트), 학습률을 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
귀하의 조언에 감사드립니다. 여전히 나는 확실하지 않은 한 가지가 있습니다. 적절한 (속도, 분산) 쌍을 얻는 유일한 방법을 계속 노력하고 있습니까? – zhoufanking
GD가 얼마나 빨리 수렴 하는지를 확인하는 스크립트 (항상 1 차 미분을 계산하는 스크립트)를 할 수는 있지만, 결코 그런 짓을 한 적이 없다고 생각합니다. 알고리즘이 수행하는 작업과 수행 방법을 이해하는 것을 선호합니다. – jabaldonedo