Политическое обучение не сходится - PullRequest
0 голосов
/ 29 марта 2019

Я пытаюсь внедрить проксимальную оптимизацию политики и столкнулся с очень странной проблемой.

Вот минимальная демонстрация проблемы:

import numpy as np
import tensorflow as tf

raw_probs = tf.get_variable("raw_probs",[4])
probs = tf.nn.softmax(raw_probs)

actions = tf.placeholder(dtype=tf.int32, shape=[None], name='actions')
rewards = tf.placeholder(dtype=tf.float32, shape=[None], name='rewards')
old_probs = tf.placeholder(dtype=tf.float32, shape=[None], name='old_probs')
new_probs = tf.reduce_sum(probs * tf.one_hot(indices=actions, depth=4))
ratios = new_probs / old_probs
clipped_ratios = tf.clip_by_value(ratios, clip_value_min=0.8, clip_value_max=1.2)
loss_clip = -tf.reduce_mean(tf.minimum(tf.multiply(rewards, ratios), tf.multiply(rewards, clipped_ratios)))

optimizer = tf.train.AdamOptimizer()
train_pol = optimizer.minimize(loss_clip)

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

    for i in range(1000):
        input_actions = []
        input_rewards = []
        input_old_probs = []

        for j in range(20):
            tmp_probs = sess.run(probs)
            if j == 0:
                print(tmp_probs)
            act = np.random.choice(4,p=tmp_probs)
            input_actions.append(act)
            if act == 0:
                input_rewards.append(1)
            else:
                input_rewards.append(-1)
            input_old_probs.append(tmp_probs[act])

        sess.run(train_pol,feed_dict={actions: input_actions,rewards: input_rewards,old_probs: input_old_probs})

Программа рисует числа в соответствии с распределением вероятностей. Если он тянет 0, ему дается награда 1. Если он тянет другие числа, ему дается награда -1. Затем программа корректирует вероятности в соответствии с результатами.

Теоретически вероятность выбора 0 всегда должна увеличиваться, в конечном итоге сходясь к 1. Однако на практике она уменьшается.

Что я здесь не так делаю?

1 Ответ

1 голос
/ 29 марта 2019

Я решил это!Я не понял, достаточно ли эффекта reduce_sum.

Просто измените

new_probs = tf.reduce_sum(probs * tf.one_hot(indices=actions, depth=4))

на

new_probs = tf.reduce_sum(probs * tf.one_hot(indices=actions, depth=4),1)
...