2016-11-22 5 views
3

私は隠されたレイヤーがなく、入力(3要素)と線形出力(2要素)の非常に単純なニューラルネットワークを作成しようとしています。TensorFlowはウェイトを更新していません

Iは、次いで、Iが目標値とトレーニングの間の異なる正方形を最小限にするためにオプティマイザを定義私は、トレーニングネットワーク

# 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

勾配降下がウェイトを変更しない唯一の方法は、損失がゼロの場合です。おそらく、1回の計算で計算グラフのすべての値をチェックしてみてください。あなたの損失がゼロであれば、線のどこかでゼロになるはずです。 – 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

関連する問題