0

다음은 정책 그라디언트 algo를 디자인하는 데 사용하는 코드의 일부입니다. tensorflow에서 :tf.gradients가 모두 0을 반환합니다.

self.activation = tf.contrib.layers.fully_connected(inputs= state,num_outputs =\ 
num_actions,activation_fn=tf.nn.relu6,weights_initializer=tf.contrib.layers.xavier_initializer(),\ 
biases_initializer=tf.random_normal_initializer(mean=1.0,stddev=1.0),trainable=True) 

    action_prob = tf.nn.softmax(activation) 
    log_p = tf.log(tf.reduce_sum(tf.multiply(action_prob,action),axis=1)) 
    tvars = tf.trainable_variables() 
    policy_gradients = tf.gradients(ys= log_p,xs = tvars) 

텐서 log_p는 아주 좋은 것으로 평가됩니다. 그러나 policy_gradients는 모두 0입니다. 내가 놓친 게 있니?

+0

tvars의 값은 무엇인가? 그것은 뭔가 좋은 평가합니까? 얼마나 많은 변수와 log_p가 의존 하는가? 나는 또한 당신이 tf.nn.softmax에서 자아 활성화 및 활성화를 발견했습니다. 활성화가 self.activation이어야합니까? 활성화는 어디에 정의되어 있습니까? –

답변

0

그래디언트는 log (x) = 0 일 때 0이 될 수 있으며 x = 1 또는 x = 0 일 때 발생합니다 (확실하지 않지만 log (0)의 경우 텐서 플로가 나노를 생성하고 그래디언트가 0 임).

당신은 로그에 전달 된 값을 클립을 시도 할 수 있습니다 :

tf.log(tf.clip_to_value(x, 1e-15, 0.99) 
관련 문제