2017-10-18 1 views
0

ML에서 Andrew Ng의 수업에서 사용한 자료를 검토하고 TensorFlow에서이를 구현하려고합니다. 나는 scipy의 optimize 함수를 사용하여 0.213의 비용을 얻을 수 있었지만, TensorFlow를 사용하면 0.622에 머물러 있었고, 0의 초기 가중치를 사용하는 0.693의 초기 손실과 그리 멀지 않았습니다.TensorFlow GradientDescentOptimizer가 예상 비용으로 변환되지 않음

here 게시물을 검토하고NaN을 방지하기 위해 내 손실 함수를 호출했습니다. 나는 이것이 올바른 접근법이라고 확신하지 않으며 더 나은 방법이 있다고 확신한다. 나는 또한 tf.clip_by_value을 사용해 보았지만 최적화되지 않은 동일한 비용을 제공합니다.

iterations = 1500 

with tf.Session() as sess: 
    X = tf.placeholder(tf.float32) 
    y = tf.placeholder(tf.float32) 
    theta = tf.Variable(tf.zeros([3,1]), dtype=tf.float32) 
    training_rows = tf.placeholder(tf.float32) 
    z = tf.matmul(X, theta) 
    h_x = 1.0/(1.0 + tf.exp(-z)) 
    lhs = tf.matmul(tf.transpose(-y), tf.log(tf.maximum(1e-5, h_x))) 
    rhs = tf.matmul(tf.transpose((1 - y)), tf.log(tf.maximum(1e-5, 1 - h_x))) 
    loss = tf.reduce_sum(lhs - rhs)/training_rows 
    alpha = 0.001 
    optimizer = tf.train.GradientDescentOptimizer(alpha) 
    train = optimizer.minimize(loss) 

    # Run the session 
    X_val, y_val = get_data() 
    rows = X_val.shape[0] 
    kwargs = {X: X_val, y: y_val, training_rows: rows} 
    sess.run(tf.global_variables_initializer()) 
    sess.run(tf.assign(theta, np.array([0,0,0]).reshape(3,1))) 
    print("Original cost before optimization is: {}".format(sess.run(loss, kwargs))) 
    print("Optimizing loss function") 
    costs = [] 
    for i in range(iterations): 
     optimal_theta, result = sess.run([theta, train], {X: X_val, y: y_val, training_rows: rows}) 
     cost = sess.run(loss, kwargs) 
     costs.append(cost) 
    optimal_theta,loss = sess.run([theta, loss], {X: X_val, y: y_val, training_rows: rows}) 
    print("Optimal value for theta is: {} with a loss of: {}".format(optimal_theta, loss)) 
    plt.plot(costs) 
    plt.show() 

는 또한 0.001을 초과하는 학습 속도가 격렬하게 앞뒤로 손실 최적화 춤을 야기 것으로 나타났습니다. 그게 정상인가요? 마지막으로, 반복 횟수를 25,000 개로 늘리려고 시도했을 때 0.53까지의 비용을 실현했습니다. 훨씬 적은 수의 반복으로 수렴 할 것으로 기대하고있었습니다.

답변

0

알아 냈어. 시그 모이 드 함수 H (x는) 1로 밝혀지면

loss = -y log(h(x)) + (1 - y) (log(1 - h(x))) 

(그리고 경우에 발생할 수 있습니다 : 지금까지 우선, 나는 손실 함수의이 부분은 잠재적으로 문제가 될 수 있다는 것을 인식하지 않았다 z, 즉 X * theta가 커지면) log (1 - 1) = log (0)을 평가할 것이고, 그것은 무한하다.

이 문제를 해결하려면 X에 대한 값을 표준화하기 위해 Feature Scaling을 사용해야했습니다. 이렇게하면 X * theta가 작고 비슷하게 z가되어 S 자형 함수가 1로 나오지 않게됩니다. z가 커질수록 e^-z는 0으로 기울어진다. 기능은 스케일링

z = 1/(1 + e^-(X*theta)) 

그리고 참조 : 그래서, 기능 확장을 사용하여 Z 우리 값^-z는 분모의 계산에 1을 추가 할 수있는 실제적인 값을 가질 것이다 작고 E임을 보장 평균을 빼고 범위로 나누는 것을 의미합니다.

(arr - mean)/(max - min) 
관련 문제