2016-09-04 2 views
1

나는 다음과 같은 코드를 실행 해요 :선형 회귀가 학습 대신에 나노 값을 갖는 이유는 무엇입니까?

import tensorflow as tf 

# data set 
x_data = [10., 20., 30., 40.] 
y_data = [20., 40., 60., 80.] 

# try to find values for w and b that compute y_data = W * x_data + b 
# range is -100 ~ 100 
W = tf.Variable(tf.random_uniform([1], -1000., 1000.)) 
b = tf.Variable(tf.random_uniform([1], -1000., 1000.)) 

X = tf.placeholder(tf.float32) 
Y = tf.placeholder(tf.float32) 

# my hypothesis 
hypothesis = W * X + b 

# Simplified cost function 
cost = tf.reduce_mean(tf.square(hypothesis - Y)) 

# minimize 
a = tf.Variable(0.1) # learning rate, alpha 
optimizer = tf.train.GradientDescentOptimizer(a) 
train = optimizer.minimize(cost) # goal is minimize cost 

# before starting, initialize the variables 
init = tf.initialize_all_variables() 

# launch 
sess = tf.Session() 
sess.run(init) 

# fit the line 
for step in xrange(2001): 
    sess.run(train, feed_dict={X: x_data, Y: y_data}) 
    if step % 100 == 0: 
     print step, sess.run(cost, feed_dict={X: x_data, Y: y_data}), sess.run(W), sess.run(b) 

print sess.run(hypothesis, feed_dict={X: 5}) 
print sess.run(hypothesis, feed_dict={X: 2.5}) 

을하고 그 결과는이 결과가 nan 이유

0 1.60368e+10 [ 4612.54003906] [ 406.81304932] 
100 nan [ nan] [ nan] 
200 nan [ nan] [ nan] 
300 nan [ nan] [ nan] 
400 nan [ nan] [ nan] 
500 nan [ nan] [ nan] 
600 nan [ nan] [ nan] 
700 nan [ nan] [ nan] 
800 nan [ nan] [ nan] 
900 nan [ nan] [ nan] 
1000 nan [ nan] [ nan] 
1100 nan [ nan] [ nan] 
1200 nan [ nan] [ nan] 
1300 nan [ nan] [ nan] 
1400 nan [ nan] [ nan] 
1500 nan [ nan] [ nan] 
1600 nan [ nan] [ nan] 
1700 nan [ nan] [ nan] 
1800 nan [ nan] [ nan] 
1900 nan [ nan] [ nan] 
2000 nan [ nan] [ nan] 
[ nan] 
[ nan] 

가 이해가 안 따라입니까? 내가이

x_data = [1., 2., 3., 4.] 
y_data = [2., 4., 6., 8.] 

에 초기 데이터를 변경하는 경우

그럼 아무 문제가 작동하지 않았다. 왜 그런가요?

답변

3

학습 속도가 문제에 비해 너무 높아서 가중치 변수 (W)를 수렴하는 대신 그라디언트 디센트의 각 단계에서 더 크고 더 큰 크기로 진동하고 있기 때문에 float32가 넘칠 것입니다.

당신이

a = tf.Variable(0.1) 

a = tf.Variable(0.001) 

에 변경하면 가중치는 더 수렴해야한다. 반복 횟수를 (~ 50000까지) 늘릴 수도 있습니다.

기계 학습 알고리즘을 구현하거나 사용할 때 좋은 학습 속도를 선택하는 것이 종종 어려운 과제입니다. 수렴보다는 증가 된 손실 값을 최소로하는 것은 일반적으로 학습률이 너무 높다는 신호입니다.

귀하의 경우에는 훈련 데이터에서 더 큰 크기를 사용할 때 라인에 맞추는 특정 문제가 가중치에 더 취약하게됩니다. 이것이 예를 들어 훈련 전에 데이터를 정규화하는 것이 일반적 인 한 가지 이유입니다. 신경망.

또한 시작 무게와 바이어스가 매우 넓은 범위로 주어지며 이는 이상적인 값에서 아주 멀리 떨어져있을 수 있으며 처음에는 매우 큰 손실 값과 기울기가 있음을 의미합니다. 초기 값에 대한 좋은 범위를 선택하는 것은 고급 학습 알고리즘을 살펴볼 때 또 다른 중요한 사항입니다.

관련 문제