Я изучаю градиент политики через игру CartPole.Я получил две реализации, и обе работают хорошо.Однако я думаю, что эти два примера используют противоположный способ выбора действия.Вот частичные коды обеих реализаций.Я только перечисляю модель сети и то, как они выбирают действия.
метод 1
observations = C.sequence.input_variable(state_dim, np.float32, name="obs")
W1 = C.parameter(shape=(state_dim, hidden_size), init=C.glorot_uniform(), name="W1")
b1 = C.parameter(shape=hidden_size, name="b1")
layer1 = C.relu(C.times(observations, W1) + b1)
W2 = C.parameter(shape=(hidden_size, action_count), init=C.glorot_uniform(), name="W2")
b2 = C.parameter(shape=action_count, name="b2")
layer2 = C.times(layer1, W2) + b2
output = C.sigmoid(layer2, name="output")
while not done:
state = np.reshape(observation, [1, state_dim]).astype(np.float32)
# Run the policy network and get an action to take.
prob = output.eval(arguments={observations: state})[0][0][0]
# Sample from the bernoulli output distribution to get a discrete action
action = 1 if np.random.uniform() < prob else 0
y = 1 if action == 0 else 0 # create a "fake label" or pseudo label
метод 2
observations = tf.placeholder(tf.float32, shape=[None, state_dim])
hidden = tf.layers.dense(observations, hidden_size, activation=tf.nn.relu, kernel_initializer=initializer)
logits = tf.layers.dense(hidden, n_outputs)
output = tf.nn.sigmoid(logits) # probability of action 0 (left)
p_left_and_right = tf.concat(axis=1, values=[output, 1 - output])
action = tf.multinomial(tf.log(p_left_and_right), num_samples=1)
y = 1. - tf.to_float(action)
while not done:
state = np.reshape(observation, [1, state_dim]).astype(np.float32)
# Run the policy network and get an action to take.
action_val, gradients_val = sess.run([action, gradients], feed_dict={observations: state})
action_val = action_val[0][0]
Мой вопрос о том, как выбрать действие из политики сети.Оба метода вычисляют вероятность действия 0 (переменная output ).Метод 2, который использует многочлен с вероятностью output , мне подходит.Что меня смутило, так это метод 1. Я думаю, что он использует метод, противоположный методу 2. Если вероятность выбора действия 0 равна prob ( output ), я должен установить action на 0, еслиnp.random.uniform () <<em> prob , не так ли?Я пытался, как я думал, но результат плохой.Я что-то здесь неправильно понимаю?