python - 基于策略的学习不收敛

标签 python tensorflow machine-learning reinforcement-learning

我正在尝试实现近端策略优化,但我面临着一个非常奇怪的问题。

这是问题的最小演示:

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。但实际上,它正在减少。

我在这里做错了什么?

最佳答案

我解决了!我对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)

关于python - 基于策略的学习不收敛,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55410391/

相关文章:

python - flask 将数据写入文件

python - 为什么 sets,dicts,list 在 python 中是不可散列的

python - 类型错误 : Expected binary or unicode string, 得到了项目 {

变量值列表的 Tensorflow 特征列

machine-learning - 值错误 : Input 0 is incompatible with layer conv2_1: expected ndim=4, 发现 ndim=3

git - 机器学习模型的版本控制(约250 MB)

python - 使用像 numpy 数组这样的函数

Python,无法从递归函数附加到列表

machine-learning - Tensorflow:LSTM 当序列的每个部分都属于一个类时?

.net - 有没有一种方法可以训练 Encog 神经网络而不将所有训练集加载到内存中?