world 统计字数代码实现原理_强化学习随机策略之高斯似然数原理与代码实现

695713ae81cce50399f0bd7e312070af.png

强化学习随机策略之高斯似然数原理与代码实现

一、原理介绍

使用随机策略有两个关键点

  • 从策略当中进行采样,获得动作
    (Action)
  • 计算特定动作的似然数

什么是多元高斯分布?

在多元高斯分布中,当协方差矩阵

只有在对角元素非零,而其余元素为 0 时,成为对角高斯分布。

多元高斯分布(Multivariate Gaussian Distribution)是一元高斯分布的在向量形式上的推广,其中向量
的均值为
,协方差矩阵为
,概率密度函数表示为

例如二元高斯多元分布可以如图所示

26385dcaa957c636b0d4de53a925f872.png

.

对于一对随机变量

,它们的协方差矩阵写作

对于多个变量的问题,用协方差矩阵

来表示各个变量之间的相关性,有

对角多元高斯分布

特殊地,当 N 个随机变量

为各自独立的高斯随机变量时,协方差矩阵为对角阵,即

对角高斯策略 Diagonal Gaussian Policies

由于标准差的公式

可知
始终大于等于 0 ,对标准差取
log对数,可以将标准差映射到
,这样更有利于神经网络的训练。
  • 采样:假设已知动作(Action) 的均值
    和标准差
    ,引入服从
    分布的噪声
    ,下一步的动作采样表示为
    其中
    表示两个向量之间的内积。
  • 似然数:当均值为
    ,标准差为
    维的动作
    的似然数表示为

二、代码实现

要求

  • 输入: 样本x,对角高斯分布的均值和标准差
  • 输出:样本x的似然数
import tensorflow as tf
import numpy as np
EPS = 1e-8

根据上一节,似然数公式,理解公式后就很容易写出代码

# my solution
def my_gaussian_likelihood(x, mu, log_std):
    """
    Args:
        x: Tensor with shape [batch, dim]
        mu: Tensor with shape [batch, dim]
        log_std: Tensor with shape [batch, dim] or [dim]
    Returns:
        Tensor with shape [batch]
    """
    #######################
    #                     #
    #   YOUR CODE HERE    #
    #                     #
    #######################
    std = tf.exp(log_std)
    ans = ((x - mu) / std)**2 + 2 * log_std + np.log(2 * np.pi)
    ans = -0.5 * ans
    # https://www.tensorflow.org/api_docs/python/tf/math/reduce_sum
    sum_ans = tf.reduce_sum(ans, axis=1)
    return sum_ans

# standard solution
# 代码来自 spinup/exercises/problem_set_1_solutions/exercise1_2_soln.py
def ans_gaussian_likelihood(x, mu, log_std):
    pre_sum = -0.5 * (((x-mu)/(tf.exp(log_std)+EPS))**2 + 2*log_std + np.log(2*np.pi))
    return tf.reduce_sum(pre_sum, axis=1)

if __name__ == '__main__':
    """
    Run this file to verify your solution.
    """

    sess = tf.Session()

    dim = 10
    x = tf.placeholder(tf.float32, shape=(None, dim))
    mu = tf.placeholder(tf.float32, shape=(None, dim))
    log_std = tf.placeholder(tf.float32, shape=(dim,))

    your_gaussian_likelihood = my_gaussian_likelihood(x, mu, log_std)
    true_gaussian_likelihood = ans_gaussian_likelihood(x, mu, log_std)

    batch_size = 32
    feed_dict = {x: np.random.rand(batch_size, dim),
                 mu: np.random.rand(batch_size, dim),
                 log_std: np.random.rand(dim)}

    your_result, true_result = sess.run([your_gaussian_likelihood, true_gaussian_likelihood],
                                        feed_dict=feed_dict)

    correct = np.allclose(your_result, true_result)

    print("Your answer is", correct)

Your answer is True

参考链接

  • https://spinningup.openai.com/en/latest/spinningup/rl_intro.html#stochastic-policies
  • https://www.tensorflow.org/api_docs/python/tf/math/reduce_sum
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值