首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >强化学习代价函数

强化学习代价函数
EN

Stack Overflow用户
提问于 2019-03-13 00:37:53
回答 1查看 252关注 0票数 0

新问题我正在用TensorFlow编写一个OpenAI健身房乒乓球播放器,到目前为止,我已经能够基于随机初始化创建网络,这样它就会随机返回来移动球员的划桨。

在纪元结束后(在计算机获胜的21场比赛中),我收集了一组观察结果、走法和得分。游戏的最终观察结果会得到一个分数,每个先前的观察结果都可以根据贝尔曼方程进行评分。

现在我的问题是我还不明白的:我如何计算成本函数,使其作为反向传播的起始梯度传播?我完全理解监督学习,但在这里我们没有任何标签来再次得分。

我该如何开始优化网络?

也许指向现有代码或一些文献的指针会有所帮助。

这里是我计算奖励的地方:

代码语言:javascript
复制
def compute_observation_rewards(self, gamma, up_score_probabilities):
        """
        Applies Bellman equation and determines reward for each stored observation
        :param gamma: Learning decay
        :param up_score_probabilities: Probabilities for up score
        :returns: List of scores for each move
        """

        score_sum = 0
        discounted_rewards = []
        # go backwards through all observations
        for i, p in enumerate(reversed(self._states_score_action)):
            o = p[0]
            s = p[1]

            if s != 0:
                score_sum = 0

            score_sum = score_sum * gamma + s
            discounted_rewards.append(score_sum)

        # # normalize scores
        discounted_rewards = np.array(discounted_rewards)
        discounted_rewards -= np.mean(discounted_rewards)
        discounted_rewards /= np.std(discounted_rewards)

        return discounted_rewards

下面是我的网络:

代码语言:javascript
复制
with tf.variable_scope('NN_Model', reuse=tf.AUTO_REUSE):

        layer1 = tf.layers.conv2d(inputs,
                                3,
                                3,
                                strides=(1, 1),
                                padding='valid',
                                data_format='channels_last',
                                dilation_rate=(1, 1),
                                activation= tf.nn.relu, 
                                use_bias=True,
                                bias_initializer=tf.zeros_initializer(),
                                trainable=True,
                                name='layer1'
                            )
        # (N - F + 1) x (N - F + 1)
        # => layer1 should be 
        # (80 - 3 + 1) * (80 - 3 + 1) = 78 x 78

        pool1 = tf.layers.max_pooling2d(layer1,
                                        pool_size=5,
                                        strides=2,
                                        name='pool1')

        # int((N - f) / s +1) 
        # (78 - 5) / 2 + 1 = 73/2 + 1 = 37

        layer2 = tf.layers.conv2d(pool1,
                                5,
                                5,
                                strides=(2, 2),
                                padding='valid',
                                data_format='channels_last',
                                dilation_rate=(1, 1),
                                activation= tf.nn.relu, 
                                use_bias=True,
                                kernel_initializer=tf.random_normal_initializer(),
                                bias_initializer=tf.zeros_initializer(),
                                trainable=True,
                                name='layer2',
                                reuse=None
                            )

        # ((N + 2xpadding - F) / stride + 1) x ((N + 2xpadding - F) / stride + 1)
        # => layer1 should be 
        # int((37 + 0 - 5) / 2) + 1 
        # 16 + 1 = 17

        pool2 = tf.layers.max_pooling2d(layer2,
                                        pool_size=3,
                                        strides=2,
                                        name='pool2')

        # int((N - f) / s +1) 
        # (17 - 3) / 2 + 1 = 7 + 1 = 8

        flat1 = tf.layers.flatten(pool2, 'flat1')

        # Kx64

        full1 = tf.contrib.layers.fully_connected(flat1,
                                            num_outputs=1,
                                            activation_fn=tf.nn.sigmoid,
                                            weights_initializer=tf.contrib.layers.xavier_initializer(),
                                            biases_initializer=tf.zeros_initializer(),
                                            trainable=True,
                                            scope=None
                                        )
EN

回答 1

Stack Overflow用户

发布于 2019-03-13 05:56:01

你正在寻找的算法被称为增强。我建议阅读Sutton and Barto's RL book的第13章。

这是本书中的伪代码。

这里,theta是神经网络的权重集。如果你不熟悉其余的一些符号,我建议你阅读上面提到的书的第三章。它涵盖了基本的问题表述。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55130991

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档