2016-11-22 1 views
3

그래서 숨겨진 레이어가없는 아주 단순한 신경망을 만들려고합니다. 입력 (3 개 요소)과 선형 출력 (2 개 요소) 만 있습니다.TensorFlow가 가중치를 업데이트하지 않습니다

그때 그때 목표 값과 교육의 사각 다른를 최소화하기 위해

# training network 
with tf.variable_scope('prediction'): 
    state_tensor = tf.placeholder('float32', [None, input_size], name='state_tensor') 
    w['q_w'] = tf.get_variable('Matrix', [state_tensor.get_shape().as_list()[1], action_size], tf.float32, tf.random_normal_initializer(stddev=0.02)) 
    w['q_b'] = tf.get_variable('bias', [action_size], initializer=tf.constant_initializer(0)) 
    q = tf.nn.bias_add(tf.matmul(state_tensor, w['q_w']), w['q_b']) 

내가 최적화를 정의하는 교육 네트워크를 구축 일부 매장 구성에 변수와 무게

# some configs 
input_size = 3 
action_size = 2 
min_delta, max_delta = -1, 1 
learning_rate_op = 0.5 
w = {}  # weights 

을 정의 네트워크

# weight optimizer 
with tf.variable_scope('optimizer'): 
    # tensor to hold target value 
    # eg, target_q_tensor=[10;11] 
    target_q_tensor = tf.placeholder('float32', [None], name='target_q_tensor') 

    # tensors for action_tensor, for action_tensor matrix and for value deltas 
    # eg, action_tensor=[0;1], action_one_hot=[[1,0];[0,1]], q_acted=[Q_0,Q_1] 
    action_tensor = tf.placeholder('int64', [None], name='action_tensor') 
    action_one_hot = tf.one_hot(action_tensor, action_size, 1.0, 0.0, name='action_one_hot') 
    q_acted = tf.reduce_sum(q * action_one_hot, reduction_indices=1, name='q_acted') 

    # delta 
    delta = target_q_tensor - q_acted 
    clipped_delta = tf.clip_by_value(delta, min_delta, max_delta, name='clipped_delta') 

    # error function 
    loss = tf.reduce_mean(tf.square(clipped_delta), name='loss') 

    # optimizer 
    # optim = tf.train.AdamOptimizer(learning_rate_op).minimize(loss) 
    optim = tf.train.GradientDescentOptimizer(learning_rate_op).minimize(loss) 

그리고 마지막으로 무한 루프. 그러나, 무게가 업데이트되지 않습니다, 그들은 내가 작업 DQN 구현의 코드를했다

with tf.Session() as sess: 
    tf.initialize_all_variables().run() 

    s_t = np.array([[1,0,0],[1,0,1],[1,1,0],[1,0,0]]) 
    action = np.array([0, 1, 0, 1]) 
    target_q = np.array([10, -11, -12, 13]) 

    while True: 
     if counter % 10000 == 0: 
      q_values = q.eval({state_tensor: s_t}) 
      for i in range(len(s_t)): 
       print("q", q_values[i]) 
      print("w", sess.run(w['q_w']), '\nb', sess.run(w['q_b'])) 

     sess.run(optim, {target_q_tensor: target_q, action_tensor: action, state_tensor: s_t}) 

를 초기화하고있는 임의의 값을 유지하는, 그래서 내가 노골적으로 뭔가를 잘못하고 있어요 그림. 네트워크는 수렴해야

  # 0 | 1   
#################### 
1,0,0 # 10 13 
1,0,1 # x -11 
1,1,0 # -12 x 

그러나 그들은 전혀 변화를 않습니다. 어떤 포인터?


손실을 클리핑하는 것이 문제의 원인입니다. 그러나 나는 왜 그런지 이해하지 못합니다 ...

+0

그래디언트 디센트가 가중치를 변경하지 못하게하는 유일한 방법은 손실이 0 인 경우입니다. 아마도 계산 그래프의 모든 값을 한 번에 확인해보십시오. 라인을 따라 손실이 0 인 경우 무언가가 0이되어야합니다. – Lunaweaver

+0

내 손실은 항상 1입니다. | – BlueMoon93

+0

죄송합니다, 나는 ** 손실의 손실 ** 그라디언트 ** 의미 ... 어느 쪽이든, 아래 내 대답을 시도? – Lunaweaver

답변

1

손실이 항상 1이면, clipped delta은 항상 1로 클리핑된다는 의미입니다. 어쨌든 손실을 제거하기 란 이상한 선택입니다. 아마도 clip the gradient of the loss을 의미할까요? this도 참조하십시오.

단순한 경우 클리핑을 완전히 제거하는 것이 좋습니다.

+0

이 예제에서는 클리핑 제거가 효과적입니다. 그러나 DQN에서는 보상과 td 오류 클리핑 모두 표준 방법입니다. 손실을 클리핑하면 그라디언트도 작아집니다. 그러나 손실 자체를 클리핑하는 문제는 무엇입니까? 가중치가 업데이트되지 않는 이유는 무엇입니까? – BlueMoon93

+0

잘린 손실의 그래디언트는 어떻게 계산합니까? 손실을 계산하기 전에 보상을 클리핑하는 것이 더 합리적입니다. – Lunaweaver

+0

방금 ​​최적화 프로그램이 그라데이션을 계산하고 가중치를 업데이트하도록했습니다. 보상 클리핑의 문제점은 당신이 다른 보상 중에서 규모를 잃어 버리고 그 문제가 적합하지 않다는 것입니다. – BlueMoon93

관련 문제